如何只在元素的一侧创建投影?

有没有办法让阴影只落在底部?我有一个菜单,两个图像彼此相邻。我不想要一个正确的阴影,因为它重叠了正确的图像。我不喜欢使用图像,所以有没有一种方法只把它放在底部,比如:

box-shadow-bottom: 10px #FFF;或类似的?

-moz-box-shadow: 0px 3px 3px #000;
-webkit-box-shadow: 0px 3px 3px #000;
box-shadow-bottom: 5px #000;
/* For IE 8 */
-ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=180, Color='#000000')";
/* For IE 5.5 - 7 */
filter: progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=180, Color='#000000');
441527 次浏览

更新4

与更新3相同,但使用了现代css(=更少的规则),因此不需要在pseudo元素上进行特殊定位。

#box {
background-color: #3D6AA2;
width: 160px;
height: 90px;
position: absolute;
top: calc(10% - 10px);
left: calc(50% - 80px);
}


.box-shadow:after {
content:"";
position:absolute;
width:100%;
bottom:1px;
z-index:-1;
transform:scale(.9);
box-shadow: 0px 0px 8px 2px #000000;
}
<div id="box" class="box-shadow"></div>

UPDATE 3

All my previous answers have been using extra markup to get create this effect, which is not necessarily needed. I think this is a much cleaner solution... the only trick is playing around with the values to get the right positioning of the shadow as well as the right strength/opacity of the shadow. Here's a new fiddle, using pseudo-elements:

http://jsfiddle.net/UnsungHero97/ARRRZ/2/

HTML

<div id="box" class="box-shadow"></div>

CSS

#box {
background-color: #3D6AA2;
width: 160px;
height: 90px;
margin-top: -45px;
margin-left: -80px;
position: absolute;
top: 50%;
left: 50%;
}


.box-shadow:after {
content: "";
width: 150px;
height: 1px;
margin-top: 88px;
margin-left: -75px;
display: block;
position: absolute;
left: 50%;
z-index: -1;
-webkit-box-shadow: 0px 0px 8px 2px #000000;
-moz-box-shadow: 0px 0px 8px 2px #000000;
box-shadow: 0px 0px 8px 2px #000000;
}

更新2

显然,你可以像其他人指出的那样,只需要一个额外的参数就可以做到这一点。下面是演示:

http://jsfiddle.net/K88H9/821/

CSS

-webkit-box-shadow: 0 4px 4px -2px #000000;
-moz-box-shadow: 0 4px 4px -2px #000000;
        box-shadow: 0 4px 4px -2px #000000;

这将是一个更好的解决方案。添加的额外参数描述为:

第四个长度是展开 距离。正值导致 阴影形状全部展开 指定半径的方向。 负值会产生阴影形状 合同。< / p >

更新

在jsFiddle: http://jsfiddle.net/K88H9/4/上查看演示

我所做的是创建一个“阴影元素”。它会隐藏在你想要有阴影的实际元素后面。我把“阴影元素”的宽度;要精确地小于实际元素的宽度为指定阴影的2倍;然后我把它对齐。

超文本标记语言

<div id="wrapper">
<div id="element"></div>
<div id="shadow"></div>
</div>

CSS

#wrapper {
width: 84px;
position: relative;
}
#element {
background-color: #3D668F;
height: 54px;
width: 100%;
position: relative;
z-index: 10;
}
#shadow {
background-color: #3D668F;
height: 8px;
width: 80px;
margin-left: -40px;
position: absolute;
bottom: 0px;
left: 50%;
z-index: 5;
-webkit-box-shadow: 0px 2px 4px #000000;
-moz-box-shadow: 0px 2px 4px #000000;
box-shadow: 0px 2px 4px #000000;
}

原来的答案

是的,您可以使用您提供的相同语法完成此操作。第一个值控制水平定位,第二个值控制垂直定位。所以只需将第一个值设置为0px,第二个值设置为你想要的偏移量,如下所示:

-webkit-box-shadow: 0px 5px #000000;
-moz-box-shadow: 0px 5px #000000;
box-shadow: 0px 5px #000000;

要了解更多关于框阴影的信息,请查看这些:

我希望这能有所帮助。

只需使用扩散参数使阴影变小:

.shadow {
-webkit-box-shadow: 0 6px 4px -4px black;
-moz-box-shadow: 0 6px 4px -4px black;
box-shadow: 0 6px 4px -4px black;
}
<div class="shadow">Some content</div>

Live demo: http://dabblet.com/gist/a8f8ba527f5cff607327

To not see any shadow on the sides, the (absolute value of the) spread radius (4th parameter) needs to be the same as the blur radius (3rd parameter).

规格总是更好。没有box-shadow-bottom属性,正如Lea指出的,你应该始终将没有前缀的属性放在底部,在有前缀的属性之后。

所以它是:

.
.shadow {
-webkit-box-shadow: 0px 2px 4px #000000;
-moz-box-shadow: 0px 2px 4px #000000;
box-shadow: 0px 2px 4px #000000;
}
<div class="shadow">Some content</div>

内阴影

.
 .shadow {
-webkit-box-shadow: inset 0 0 9px #000;
-moz-box-shadow: inset 0 0 9px #000;
box-shadow: inset 0 0 9px #000;
}
<div class="shadow">wefwefwef</div>

我觉得这就是你想要的?

.
.shadow {
-webkit-box-shadow: 0 0 0 4px white, 0 6px 4px black;
-moz-box-shadow: 0 0 0 4px white, 0 6px 4px black;
box-shadow: 0 0 0 4px white, 0 6px 4px black;
}
<div class="shadow">wefwefwef</div>

如何只是使用一个包含div溢出设置为隐藏和一些填充在底部?这似乎是最简单的解决方案。

很抱歉,我自己没有想到这一点,但我看到了它。

使用一个元素来包装元素,获得box-shadow和overflow:隐藏在包装中,您可以使额外的box-shadow消失,仍然有可用的边界。 这也解决了元素看起来较小的问题,因为扩散。

是这样的:

#wrapper { padding-bottom: 10px; overflow: hidden; }
#elem { box-shadow: 0 0 10px black; }

内容在这里

当它必须在纯CSS中完成时,仍然是一个聪明的解决方案!

正如(Jorgen均等的所说。

如果你在背景上有一个固定的颜色,你可以用两个具有相同背景颜色的掩蔽的阴影来隐藏侧影效果,并且blur = 0,例如:

box-shadow:
-6px 0 white,         /*Left masking shadow*/
6px 0 white,          /*Right masking shadow*/
0 7px 4px -3px black; /*The real (slim) shadow*/

注意,黑色阴影必须是最后一个,并且有一个负扩散(-3px),以防止它延伸到角落之外。

这里是< >强小提琴< / >强(改变掩蔽阴影的颜色,看看它是如何工作的)。

div{
width: 100px;
height: 100px;
border: 1px solid pink;
box-shadow: -6px 0 white, 6px 0 white, 0 7px 5px -2px black;
}
<div></div>

enter image description here

我还需要一个阴影,但只是在一个图像下,并设置在稍微左和右。这招对我很管用:

.box-shadow {
-webkit-box-shadow: 5px 35px 30px -25px #888888;
-moz-box-shadow: 5px 35px 30px -25px #888888;
box-shadow: 5px 35px 30px -25px #888888;
}

应用于的元素是一个页面宽的图像(980px x 300px)。

如果它有助于摆弄设置时,他们运行如下:

水平阴影,垂直阴影,模糊距离,扩散(即阴影大小)和颜色。

如果你的背景是实心的(或者你可以使用CSS重现它),你可以这样使用线性渐变:

div {
background-image: linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.3) 5px, #fff 5px, #fff 100%)
}
<div>
<p>Foobar</p>
<p>test</p>
</div>

这将在元素底部生成5px的渐变,从不透明度30%的黑色到完全透明。元素的其余部分为白色背景。当然,改变线性渐变的最后2个色点,你可以使背景完全透明。

更新别人的答案是透明的,而不是白色的,所以它也适用于其他颜色的背景。

body {
background: url(http://s1.picswalls.com/wallpapers/2016/03/29/beautiful-nature-backgrounds_042320876_304.jpg)
}


div {
background: url(https://www.w3schools.com/w3css/img_avatar3.png) center center;
background-size: contain;
width: 100px;
height: 100px;
margin: 50px;
border: 5px solid white;
box-shadow: 0px 0 rgba(0, 0, 0, 0), 0px 0 rgba(0, 0, 0, 0), 0 7px 7px -5px black;
}
<div>
</div>

最好是查影子:

.header{
-webkit-box-shadow: 0 -8px 73px 0 rgba(0,0,0,0.2);
-moz-box-shadow: 0 -8px 73px 0 rgba(0,0,0,0.2);
box-shadow: 0 -8px 73px 0 rgba(0,0,0,0.2);
}

此代码目前在stackoverflow web上使用。

这支代码笔(不是我写的)演示了一种超级简单的方法,其他的边都非常漂亮:

box-shadow: 0 5px 5px -5px #333;

< a href = " https://codepen。Io /zeckdude/pen/oxywmm" rel="nofollow noreferrer">https://codepen.io/zeckdude/pen/oxywmm

你也可以使用clip-path来剪辑(隐藏)所有溢出的边,但你想显示的边除外:

.shadow {
box-shadow: 0 4px 4px black;
clip-path: polygon(0 0, 100% 0, 100% 200%, 0 200%);
}

看到clip-path (MDN)polygon的参数是左上的点、右上的点、右下角点和左下侧点。通过将底边设置为200%(或比100%大的任何数字),可以将溢出限制为仅限底边。

例子:

用clip-path隔离的上、下、左box-shadow的盒子示例

.shadow {
box-shadow: 0 0 8px 5px rgba(200, 0, 0, 0.5);
}
.shadow-top {
clip-path: polygon(0% -20%, 100% -20%, 100% 100%, 0% 100%);
}
.shadow-right {
clip-path: polygon(0% 0%, 120% 0%, 120% 100%, 0% 100%);
}
.shadow-bottom {
clip-path: polygon(0% 0%, 100% 0%, 100% 120%, 0% 120%);
}
.shadow-left {
clip-path: polygon(-20% 0%, 100% 0%, 100% 100%, -20% 100%);
}


.shadow-bottom-right {
clip-path: polygon(0% 0%, 120% 0%, 120% 120%, 0% 120%);
}


/* layout for example */
.box {
display: inline-block;
vertical-align: top;
background: #338484;
color: #fff;
width: 4em;
height: 2em;
margin: 1em;
padding: 1em;
}
<div class="box">none</div>
<div class="box shadow shadow-all">all</div>
<div class="box shadow shadow-top">top</div>
<div class="box shadow shadow-right">right</div>
<div class="box shadow shadow-bottom">bottom</div>
<div class="box shadow shadow-left">left</div>
<div class="box shadow shadow-bottom-right">bottom right</div>

你也可以在底部做一个渐变——这对我很有帮助,因为我想要的阴影是在一个已经是半透明的元素上,所以我不必担心任何剪辑:

&:after {
content:"";
width:100%;
height: 8px;
position: absolute;
bottom: -8px;
left: 0;
background: linear-gradient(to bottom, rgba(0,0,0,0.65) 0%,rgba(0,0,0,0) 100%);
}

只需使“bottom”和“height”属性匹配,并设置你的rgba值为任何你想要它们在阴影的顶部/底部

你可以这样做:

一般的语法:

selector {
box-shadow: topBoxShadow, bottomBoxShadow, rightBoxShadow, leftBoxShadow
}

示例:我们只想创建一个红色的底框阴影,

因此,为了做到这一点,我们必须设置所有的边选项,我们必须设置底部框的阴影选项,并将所有其他选项设置为空,如下所示:

.box {
-moz-box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
-o-box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
-webkit-box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
box-shadow: 0 0 0 transparent ,0 0 10px red, 0 0 0 transparent, 0 0 0 transparent
}

另一个基于@theengineear的答案的想法,我将使用inset而不是polygon。它更容易,因为它的工作方式与边距或填充相同。我还将依靠CSS变量来轻松定义所有不同的情况。

.shadow {
box-shadow: 0 0 8px 5px rgba(200, 0, 0, 0.5);
clip-path:inset(var(--t,0) var(--r,0) var(--b,0) var(--l,0))
}


.top { --t:-100%; }
.right { --r:-100%;}
.bottom { --b:-100%; }
.left { --l:-100%;}




/* layout for example */


.box {
display: inline-block;
vertical-align: top;
background: #338484;
color: #fff;
width: 4em;
height: 2em;
margin: 1em;
padding: 1em;
}
<div class="box">none</div>
<div class="box shadow top right left bottom">all</div>
<div class="box shadow top">top</div>
<div class="box shadow right">right</div>
<div class="box shadow bottom">bottom</div>
<div class="box shadow left">left</div>
<div class="box shadow bottom right">bottom right</div>
<div class="box shadow bottom top">top bottom</div>
<div class="box shadow left top right">top left right</div>
<div class="box shadow left right"> left right</div>

你需要知道每个值是什么:

/* offset-x | offset-y | blur-radius | spread-radius | color */
box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);

为了只在元素的一侧应用阴影效果,将模糊值设置为积极的数字,并将扩展值设置为相同的大小,但带有符号。根据你想要阴影在哪一边,设置偏移值如下:

  • 顶部阴影:offset-x: 0 and offset-y: -5px
  • 右阴影:offset-x: 5px and offset-y: 0
  • 底部阴影:offset-x: 0 and offset-y: 5px
  • 左阴影:offset-x: -5px and offset-y: 0

.box{
margin: 2rem;
padding: 1rem;
}


.shadow-all{
box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);
}
.shadow-top {
box-shadow: 0 -5px 3px -3px #00000030;
}
  

.shadow-right {
box-shadow: 5px 0 3px -3px #00000030;
}
  

.shadow-bottom {
box-shadow: 0 5px 3px -3px #00000030;
}
  

.shadow-left {
box-shadow: -5px 0 3px -3px #00000030;
}   

<div class="box shadow-all">
Shadow All
</div>
<div class ="box shadow-top">
Shadow Top
</div>
<div class ="box shadow-right">
Shadow Right
</div>
<div class ="box shadow-bottom">
Shadow Bottom
</div>
      

<div class ="box shadow-left">
Shadow left
</div>

阅读更多在这里在这里