【问题标题】:Adding box-shadow to a :after pseudo element将 box-shadow 添加到 :after 伪元素
【发布时间】:2015-03-17 23:44:09
【问题描述】:

我有一个名为 .testimonial-inner 的 div 并使用 :after 伪元素我有一个位于它下方的箭头指向下方。我遇到的问题是给它添加了一个盒子阴影,所以它们看起来都像是一个自然元素。

三角形上没有box-shadow

body {
  background: #eee
}
.testimonial-inner {
  background: #fff;
  -webkit-border-radius: 3px;
  -moz-border-radius: 3px;
  border-radius: 3px;
  padding: 30px;
  display: block;
  margin-bottom: 25px;
  position: relative;
  -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.25);
  -moz-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.25);
  box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75);
}
.testimonial-inner:after {
  top: 100%;
  left: 48px;
  border: solid transparent;
  content: " ";
  height: 0;
  width: 0;
  position: absolute;
  pointer-events: none;
  border-color: rgba(255, 255, 255, 0);
  border-top-color: #fff;
  border-width: 18px;
  margin-left: -18px;
}
<div class="c-4 testimonial-wrap">
  <div class="testimonial-inner">
    <p>Using Facebook was unquestionably the best decision I could possibly have made at the point in my journalistic journey. It enabled me to share my fears, frustrations as well as successes.</p>
  </div>
</div>

注意盒子阴影当前没有环绕箭头。

当我将它添加到 :after 声明时,我得到以下结果:

body {
  background: #eee
}
.testimonial-inner {
  background: #fff;
  -webkit-border-radius: 3px;
  -moz-border-radius: 3px;
  border-radius: 3px;
  padding: 30px;
  display: block;
  margin-bottom: 25px;
  position: relative;
  -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.25);
  -moz-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.25);
  box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75);
}
.testimonial-inner:after {
  top: 100%;
  left: 48px;
  border: solid transparent;
  content: " ";
  height: 0;
  width: 0;
  position: absolute;
  pointer-events: none;
  border-color: rgba(255, 255, 255, 0);
  border-top-color: #fff;
  border-width: 18px;
  margin-left: -18px;
  -webkit-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.25);
  -moz-box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.25);
  box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75);
}
<div class="c-4 testimonial-wrap">
  <div class="testimonial-inner">
    <p>Using Facebook was unquestionably the best decision I could possibly have made at the point in my journalistic journey. It enabled me to share my fears, frustrations as well as successes.</p>
  </div>
</div>

【问题讨论】:

标签: html css pseudo-element css-shapes


【解决方案1】:

您可以添加另一个 :pseudo-element,将其旋转 45deg 并添加 box-shadow

Updated Fiddle

body {
  background: #eee
}
.testimonial-inner {
  background: #fff;
  -webkit-border-radius: 3px;
  -moz-border-radius: 3px;
  border-radius: 3px;
  padding: 30px;
  display: block;
  margin-bottom: 25px;
  position: relative;
  box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75);
}
.testimonial-inner:after {
  top: 100%;
  left: 48px;
  border: solid transparent;
  content: " ";
  height: 0;
  width: 0;
  position: absolute;
  pointer-events: none;
  border-color: rgba(255, 255, 255, 0);
  border-top-color: #fff;
  border-width: 18px;
  margin-left: -18px;
}
.testimonial-inner:before {
  content: '';
  position: absolute;
  transform: rotate(45deg);
  width: 36px;
  height: 36px;
  bottom: -12px;
  z-index: -1;
  box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75);
}
<div class="c-4 testimonial-wrap">
  <div class="testimonial-inner">
    <p>Using Facebook was unquestionably the best decision I could possibly have made at the point in my journalistic journey. It enabled me to share my fears, frustrations as well as successes.</p>
  </div>
</div>

使用svg 作为三角形的另一种方法。

body {
  background: #eee
}
.testimonial-wrap {
  position: relative;
}
.testimonial-inner {
  background: #fff;
  -webkit-border-radius: 3px;
  -moz-border-radius: 3px;
  border-radius: 3px;
  padding: 30px;
  display: block;
  margin-bottom: 25px;
  position: relative;
  box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.75);
}
#triangle {
  position: absolute;
  top: 100%;
  margin-top: -1px;
  left: 50px;
}
<div class="c-4 testimonial-wrap">
  <div class="testimonial-inner">
    <p>Using Facebook was unquestionably the best decision I could possibly have made at the point in my journalistic journey. It enabled me to share my fears, frustrations as well as successes.</p>
  </div>
  <svg id="triangle" width="40" height="26">
    <defs>
      <filter id="f" width="150%" height="130%">
        <feGaussianBlur in="SourceAlpha" stdDeviation="2.5" />
        <feComponentTransfer>
          <feFuncA type="linear" slope="0.8" />
        </feComponentTransfer>
        <feMerge>
          <feMergeNode/>
          <feMergeNode in="SourceGraphic" />
        </feMerge>
      </filter>
    </defs>
    <path filter="url(#f)" d="M0,0 h40 l-20,20z" fill="white" />
  </svg>
</div>

【讨论】:

  • 非常详细的回复!公认!谢谢。
  • 我自己没有针对以下场景的解决方案,但我仍然想提一下:所以,据我测试,当主要元素确实想要时,这两种方法都有一点缺点使用 alpha 小于 1 的 rgba 背景。在这种可能相当“苛刻”的情况下,伪元素投影通过主容器背景(方法 01)或主容器框阴影通过 svgs 背景(方法02).
【解决方案2】:

你不能使用 box-shadow 来做你想做的事情。这是因为“箭头”效果是通过在除顶部之外的任何地方使用透明颜色来创建的。这意味着该元素仍然是一个正方形,并且您的阴影将相应地在它周围渲染。

如果您想为图像的形状添加阴影,请尝试使用 SVG,或者仅使用带有预渲染阴影的图像。

<polygon points="220, 150 350, 220" style="fill:#FFFFFF; stroke:#000000;stroke-width:1"/>

【讨论】:

    【解决方案3】:

    恕我直言,我认为这有点骇人听闻,但使用纯 css 来做到这一点:

    div{
      height:200px;
      width:100%;
      border-radius:10px;
      background:gray; 
      position:relative;
      box-shadow:0 0px 10px black;
      border:1px solid black;
    }
    
    
    div:before{
      position:absolute;
      bottom:-10px;
      left:40px;
      content:"";
      background:gray;
      height:20px;
      width:20px;
      transform: rotate(45deg);
      border-bottom:1px solid black;
      border-right:1px solid black;
      
      box-shadow:0 0px 10px black;
      }
    
    div:after{
      position:absolute;
      bottom:0px;
      left:30px;
      content:"";
      background:gray;
      height:20px;
      width:40px;
    
      }
    &lt;div&gt;test&lt;/div&gt;

    【讨论】:

      【解决方案4】:

      过滤器将起作用:

      .shadowed {
          -webkit-filter: drop-shadow(0px 2px 2px rgba(130,130,130,1));
          filter        : drop-shadow(0px 2px 2px rgba(130,130,130,1));
          -ms-filter    : "progid:DXImageTransform.Microsoft.Dropshadow(OffX=0, OffY=2, Color='#444')";
          filter        : "progid:DXImageTransform.Microsoft.Dropshadow(OffX=0, OffY=2, Color='#444')";
      }
      

      工作示例:http://codepen.io/tolmark12/pen/JopNeR?editors=110

      了解更多信息:Creating a true cross browser drop shadow

      【讨论】:

      • 好文章!在子元素是伪元素的父元素上使用盒子阴影时,这非常巧妙!
      • 很好的解决方案,感谢新知识!
      • 不错!不知道这存在 - 非常有帮助!
      • 这有点吹毛求疵,但据我尝试/确实知道这种方法可能有一个小缺点:当问题中的 html 容器确实具有 alpha 小于 1 的 rgba 背景时过滤器通过容器的背景发光。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2017-09-26
      • 2012-06-07
      相关资源
      最近更新 更多