I need to create a box-shadow on some block
element, but only (for example) on its right side. The way I do it is to wrap the inner element with box-shadow
into an outer one with padding-right
and overflow:hidden;
so the three other sides of the shadow are not visible.
Is there some better way to achieve this? Like box-shadow-right
?
EDIT: My intentions are to create only the vertical part of the shadow. Exactly the same as what repeat-y
of the rule background:url(shadow.png) 100% 0% repeat-y
would do.
This question is related to
css
shadow
box-shadow
Here's a little hack that I did.
<div id="element"><!--element that I want an one-sided inset shadow from the bottom--></div>
<div class="one_side_shadow"></div>
1. Create a <div class="one_side_shadow"></div>
right below the element that I want to create the one-side box shadow (in this case I want a one-sided inset shadow for id="element"
coming from the bottom)
2. Then I created a regular box-shadow
using a negative vertical offset to push the shadow upwards to one-side.
`box-shadow: 0 -8px 20px 2px #DEDEE3;`
What I do is create a vertical block for the shadow, and place it next to where my block element should be. The two blocks are then wrapped into another block:
<div id="wrapper">
<div id="shadow"></div>
<div id="content">CONTENT</div>
</div>
<style>
div#wrapper {
width:200px;
height:258px;
}
div#wrapper > div#shadow {
display:inline-block;
width:1px;
height:100%;
box-shadow: -3px 0px 5px 0px rgba(0,0,0,0.8)
}
div#wrapper > div#content {
display:inline-block;
height:100%;
vertical-align:top;
}
</style>
jsFiddle example here.
My self-made solution which is easy to edit:
HTML:
<div id="anti-shadow-div">
<div id="shadow-div"></div>
</div>?
css:
#shadow-div{
margin-right:20px; /* Set to 0 if you don't want shadow at the right side */
margin-left:0px; /* Set to 20px if you want shadow at the left side */
margin-top:0px; /* Set to 20px if you want shadow at the top side */
margin-bottom:0px; /* Set to 20px if you want shadow at the bottom side */
box-shadow: 0px 0px 20px black;
height:100px;
width:100px;
background: red;
}
#anti-shadow-div{
margin:20px;
display:table;
overflow:hidden;
}?
This could be a simple way
border-right : 1px solid #ddd;
height:85px;
box-shadow : 10px 0px 5px 1px #eaeaea;
Assign this to any div
clip-path
is now (2020) one of simplest ways to achieve box-shadows on specific sides of elements, especially when the required effect is a "clean cut" shadow at particular edges (which I believe was what the OP was originally looking for) , like this:
.shadow-element {_x000D_
border: 1px solid #333;_x000D_
width: 100px;_x000D_
height: 100px;_x000D_
box-shadow: 0 0 15px rgba(0,0,0,0.75);_x000D_
clip-path: inset(0px -15px 0px 0px);_x000D_
}
_x000D_
<div class="shadow-element"></div>
_x000D_
...as opposed to an attenuated/reduced/thinning shadow like this:
.shadow-element {_x000D_
border: 1px solid #333;_x000D_
width: 100px;_x000D_
height: 100px;_x000D_
box-shadow: 15px 0px 15px -10px rgba(0,0,0,0.75);_x000D_
}
_x000D_
<div class="shadow-element"></div>
_x000D_
Simply apply the following CSS to the element in question:
box-shadow: 0 0 Xpx [hex/rgba]; /* note 0 offset values */
clip-path: inset(Apx Bpx Cpx Dpx);
Where:
Apx
sets the shadow visibility for the top edgeBpx
rightCpx
bottomDpx
leftEnter a value of 0 for any edges where the shadow should be hidden and a negative value (the same as the box-shadow blur radius - Xpx
) to any edges where the shadow should be displayed.
div {
border: 1px solid #666;
width: 50px;
height: 50px;
-webkit-box-shadow: inset 10px 0px 5px -1px #888 ;
}
Here is my example:
.box{_x000D_
_x000D_
width: 400px; _x000D_
height: 80px; _x000D_
background-color: #C9C; _x000D_
text-align: center; _x000D_
font: 20px normal Arial, Helvetica, sans-serif; _x000D_
color: #fff; _x000D_
padding: 100px 0 0 0;_x000D_
-webkit-box-shadow: 0 8px 6px -6px black;_x000D_
-moz-box-shadow: 0 8px 6px -6px black;_x000D_
box-shadow: 0 8px 6px -6px black;_x000D_
}
_x000D_
<div class="box">_x000D_
</div>
_x000D_
To get the clipped effect on up to two sides you can use pseudo elements with background gradients.
header::before, main::before, footer::before, header::after, main::after, footer::after {
display: block;
content: '';
position: absolute;
width: 8px;
height: 100%;
top: 0px;
}
header::before, main::before, footer::before {
left: -8px;
background: linear-gradient(to left, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
}
header::after, main::after, footer::after {
right: -8px;
background: linear-gradient(to right, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0));
}
will add a nice shadow-like effect to the left and right of the elements that normally make up a document.
Just use ::after or ::before pseudo element to add the shadow. Make it 1px and position it on whatever side you want. Below is example of top.
footer {_x000D_
margin-top: 50px;_x000D_
color: #fff;_x000D_
background-color: #009eff;_x000D_
text-align: center;_x000D_
line-height: 90px;_x000D_
position: relative;_x000D_
}_x000D_
_x000D_
footer::after {_x000D_
content: '';_x000D_
position: absolute;_x000D_
width: 100%;_x000D_
height: 1px;_x000D_
top: 0;_x000D_
left: 0;_x000D_
z-index: -1;_x000D_
box-shadow: 0px 0px 10px 1px rgba(0, 0, 0, 0.75);_x000D_
}
_x000D_
<footer>top only box shadow</footer>
_x000D_
Here is a codepen to demonstrate for each side, or a working snippet:
.boxes {_x000D_
display: flex;_x000D_
flex-wrap: wrap;_x000D_
}_x000D_
_x000D_
.box {_x000D_
margin: 20px;_x000D_
border: 1px solid #ccc;_x000D_
font-family: Helvetica Neue, Arial, sans-serif;_x000D_
font-weight: 100;_x000D_
letter-spacing: 2px;_x000D_
color: #999;_x000D_
display: flex;_x000D_
align-items: center;_x000D_
justify-content: center;_x000D_
text-align: center;_x000D_
flex: 1;_x000D_
padding: 40px;_x000D_
line-height: 1.4em;_x000D_
}_x000D_
_x000D_
.top {_x000D_
box-shadow: 0 -5px 5px -5px #333;_x000D_
}_x000D_
_x000D_
.right {_x000D_
box-shadow: 5px 0 5px -5px #333;_x000D_
}_x000D_
_x000D_
.bottom {_x000D_
box-shadow: 0 5px 5px -5px #333;_x000D_
}_x000D_
_x000D_
.left {_x000D_
box-shadow: -5px 0 5px -5px #333;_x000D_
}
_x000D_
<div class="boxes">_x000D_
<div class="box top">Top Only</div>_x000D_
<div class="box right">Right Only</div>_x000D_
<div class="box bottom">Bottom Only</div>_x000D_
<div class="box left">Left Only</div>_x000D_
</div>
_x000D_
Ok, here is one try more. Using pseudo elements and aplying the shadow-box porperty over them.
html:
<div class="no-relevant-box">
<div class="div-to-shadow-1"></div>
<div class="div-to-shadow-2"></div>
</div>
sass:
.div-to-shadow-1, .div-to-shadow-2
height: 150px
width: 150px
overflow: hidden
transition: all 0.3s ease-in-out
&::after
display: block
content: ''
position: relative
top: 0
left: 100%
height: 100%
width: 10px
border: 1px solid mediumeagreen
box-shadow: 0px 7px 12px rgba(0,0,0,0.3)
&:hover
border: 1px solid dodgerblue
overflow: visible
This site helped me: https://gist.github.com/ocean90/1268328 (Note that on that site the left and right are reversed as of the date of this post... but they work as expected). They are corrected in the code below.
<!DOCTYPE html>
<html>
<head>
<title>Box Shadow</title>
<style>
.box {
height: 150px;
width: 300px;
margin: 20px;
border: 1px solid #ccc;
}
.top {
box-shadow: 0 -5px 5px -5px #333;
}
.right {
box-shadow: 5px 0 5px -5px #333;
}
.bottom {
box-shadow: 0 5px 5px -5px #333;
}
.left {
box-shadow: -5px 0 5px -5px #333;
}
.all {
box-shadow: 0 0 5px #333;
}
</style>
</head>
<body>
<div class="box top"></div>
<div class="box right"></div>
<div class="box bottom"></div>
<div class="box left"></div>
<div class="box all"></div>
</body>
</html>
Source: Stackoverflow.com