【问题标题】:How to create a drop shadow only on one side of an element?如何仅在元素的一侧创建阴影?
【发布时间】:2011-07-24 12:37:46
【问题描述】:

有没有办法只在底部放置阴影?我有一个菜单,其中有 2 张图像并排放置。我不想要正确的阴影,因为它与正确的图像重叠。我不喜欢为此使用图像,所以有没有办法将其仅放在底部,例如:

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');

【问题讨论】:

标签: css


【解决方案1】:

更新 4

与更新 3 相同,但具有现代 css(=更少规则),因此不需要对伪元素进行特殊定位。

#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>

更新 3

我之前的所有答案都是使用额外的标记来创建这种效果,这不是必需的。我认为这是一个更清洁的解决方案......唯一的技巧是使用这些值来获得正确的阴影定位以及阴影的正确强度/不透明度。这是一个新的小提琴,使用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

显然,正如其他人刚刚指出的那样,您只需在 box-shadow CSS 中添加一个额外参数即可做到这一点。这是演示:

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;

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

第四个长度是展开 距离。正值导致 阴影形状全部展开 指定半径的方向。 负值导致阴影形状 签约。

更新

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

我所做的是创建一个“阴影元素”,它会隐藏在您想要有阴影的实际元素后面。我使“阴影元素”的宽度比实际元素的宽度精确地小了您指定的阴影的 2 倍;然后我将它正确对齐。

HTML

<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;

有关框阴影的更多信息,请查看以下内容:

我希望这会有所帮助。

【讨论】:

  • 你不一定需要添加一个空的div来实现模糊的阴影。声明中的第三个值:box-shadow: 0 2px 4px #000000 是一个模糊值。见这里http://jsfiddle.net/K88H9/7/。但是您会注意到元素的左右两侧有一点模糊,而在 Hristo 的解决方案中则没有。
  • 没有 box-shadow-bottom 属性,这个效果绝对不需要额外的元素。糟糕。
  • box-shadow-bottom,虽然有创意,但实际上并不存在。
  • 冷静的家伙......这是一个该死的错字
  • @gryzzly ...我确实编辑了我的答案,直到每个人都指出我才看到我的错字。对此感到抱歉。
【解决方案2】:

只需使用 spread 参数使阴影更小:

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

现场演示:http://dabblet.com/gist/a8f8ba527f5cff607327

为了在侧面看不到任何阴影,扩散半径(第 4 个参数)的(绝对值)需要与模糊半径(第 3 个参数)相同。

【讨论】:

  • 这实际上不起作用。乍一看,阴影似乎只在底部,但实际上它仍然扩散到两侧。每个人的例子都是用一个相当深的蓝色盒子...把盒子变成白色,你会看到所有的阴影。
  • @Chris M:只需增加 spread 参数:尝试使用 box-shadow:0 8px 4px -6px 的 4 个示例,您只会看到底部阴影!
  • 再一次,将盒子设为白色,就像在this fiddle 中一样,你仍然会看到一直向上的阴影,而且它现在不会全部穿过底部的方式。你愿意在传播参数上走多远来摆脱两边?此外,对于拥有 151 个代表的人来说,最好不要编辑拥有 7k 个代表的人的答案。将其留在评论中。
  • @T30 当然,您最终可以通过进一步减小展开参数来消除边。但是现在你的影子并不接近你的盒子的宽度。你有一个 84 像素的盒子,阴影为 72 像素。
  • 更新了答案。但基本上,除了减小传播半径和调整 Y 偏移之外,没有什么可以做的。也许使用渐变而不是阴影?另外,我不介意人们编辑我的帖子,但我不喜欢人们编辑我的帖子以添加用类似英语的语言编写的句子。我也不是以英语为母语的人,我理解其中的挑战,但如果我正在编辑别人的帖子,我会感到有足够的责任至少仔细检查我添加的内容是否有意义并且语法没有令人尴尬的错误。
【解决方案3】:

如果你有固定的背景颜色,你可以用两个遮蔽阴影隐藏侧影效果,背景颜色相同,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) 以防止它延伸到角落之外。

这里是fiddle(更改遮蔽阴影的颜色,看看它是如何真正工作的)。

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

【讨论】:

  • 使用 transparent 颜色作为遮罩阴影会更好,不是吗?
  • @AngelJosephPiscola:聪明的提示......在答案中实现,谢谢!
  • @T30 很棒,但请注意,使用透明蒙版您不需要固定颜色背景;)
  • 我测试过更好,透明阴影doesn't work,所以我回滚了最后的编辑
【解决方案4】:

您也可以使用clip-path 剪裁(隐藏)所有溢出的边缘,但要显示的边缘除外:

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

clip-path (MDN)polygon 的参数是 top-left 点、top-right 点、bottom-right 点和 左下角点。通过将底部边缘设置为 200%(或任何大于 100% 的数字),您可以将溢出限制在仅底部边缘。

示例:

.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>

【讨论】:

  • 所以......在基本术语中,clip-path 是类固醇上的溢出:隐藏属性。这是干净的。 ;)
  • 这个答案的扩展可以在这里找到:stackoverflow.com/a/65807809/8620333
【解决方案5】:

我想这就是你所追求的?

.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;
}
&lt;div class="shadow"&gt;wefwefwef&lt;/div&gt;

【讨论】:

  • 喜欢人们根本不理解的时候。是的,他弄乱了第一个阴影(白色)的扩散,它将覆盖真实阴影(黑色)的边缘。这是获得完美单向阴影的唯一合理方法。当您需要在菜单的两个部分上使用相同的阴影时特别有用。
【解决方案6】:

阅读the specs 总是更好。没有 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;
}
&lt;div class="shadow"&gt;Some content&lt;/div&gt;

【讨论】:

  • 侧面有阴影
【解决方案7】:

另一个基于the answer of @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>

【讨论】:

    【解决方案8】:

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

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

    使用一个元素来包裹获得 box-shadow 和 overflow: hidden 的元素,你可以让额外的 box-shadow 消失并且仍然有一个可用的边框。 这也解决了由于散布而导致元素看起来更小的问题。

    像这样:

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

    内容放在这里

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

    正如Jorgen Evens所说。

    【讨论】:

    • +1 表示解决方案。除了padding-bottom(比如说5px),您还可以设置一个负数margin-bottom(-5px)来补偿增加的空间。
    【解决方案9】:

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

    .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)。

    如果在修改设置时有帮助,它们会按如下方式运行:

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

    【讨论】:

      【解决方案10】:

      最好看影子:

      .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 网站上使用。

      【讨论】:

        【解决方案11】:

        如果你的背景是纯色的(或者你可以使用 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 个色标,可以使背景完全透明。

        【讨论】:

          【解决方案12】:

          这个代码笔(不是我做的)演示了一种超级简单的方法,可以很好地做到这一点和其他方面:

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

          https://codepen.io/zeckdude/pen/oxywmm

          【讨论】:

            【解决方案13】:

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

            &: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%);
                }
            

            只需使“底部”和“高度”属性匹配并将 rgba 值设置为您希望它们位于阴影顶部/底部的任何值

            【讨论】:

              【解决方案14】:

              你可以这样做:

              一般语法:

              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
              }
              

              【讨论】:

                【解决方案15】:

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

                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>

                【讨论】:

                  【解决方案16】:

                  内阴影

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-07-04
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-03-18
                    • 1970-01-01
                    • 2012-08-13
                    • 1970-01-01
                    相关资源
                    最近更新 更多