【问题标题】:Creating a partial box shadow on a skewed div在倾斜的 div 上创建部分框阴影
【发布时间】:2016-09-12 12:03:39
【问题描述】:

我正在尝试在倾斜的 div 上创建部分阴影,尽可能靠近此广告素材。

现在我一直在尝试使用伪元素(特别是之前)来做到这一点,但我发现每当我倾斜它们所应用的元素时,这些元素的行为就会很奇怪。伪元素一直出现在我的 div 顶部,即使 z-index 设置为 -1。无论我用 z-index 做什么,它都会保持在它之上。我希望它位于应用它的 div 后面,以及下面的 div 前面,就像在广告素材中一样。

这是我的 ::before 代码和 codepen 的链接

CSS

/*! Shadows */
#test-title {
  position: relative;
}

#test-title:before {
  z-index: -1;
  position: absolute;
  content: "";
  bottom: 15px;
  left: 10px;
  width: 50%;
  top: 80%;
  max-width:300px;
  box-shadow: 0 15px 10px #777;
  -webkit-transform: rotate(-3deg);
  -moz-transform: rotate(-3deg);
  -o-transform: rotate(-3deg);
  -ms-transform: rotate(-3deg);
  transform: rotate(-3deg);
}

http://codepen.io/kathryncrawford/pen/WwWEma

【问题讨论】:

    标签: css css-shapes css-transforms pseudo-element box-shadow


    【解决方案1】:

    Skew 父级然后以相同的度数对子级进行反斜。

    * {
      box-sizing: border-box
    }
    body {
      padding: 40px 0
    }
    section {
      width: 60vw;
      clear: both;
      overflow: hidden;
      min-height: 100px;
      margin: 0 auto;
      position: relative;
      background: #035076
    }
    section article {
      width: 60%;
      padding: 20px;
      color: white;
      margin: 0 auto
    }
    section:nth-child(even) {
      transform: skew(-45deg) translate(5vw);
      box-shadow: inset 0 0 2px 0 black;
    }
    section:nth-child(odd) {
      transform: skew(45deg);
    }
    section:nth-child(even) article {
      transform: skew(45deg) translate(5vw);
    }
    section:nth-child(odd) article {
      transform: skew(-45deg);
    }
    section:before,
    section:after {
      content: '';
      position: absolute;
    }
    section:nth-child(even):before {
      width: 100%;
      height: 0;
      bottom: 100%;
      left: 0;
      z-index: 6;
      opacity: 1;
      transform: rotate(-10deg) translateY(-30px);
      box-shadow: 0px 0px 64px 30px rgba(0, 0, 0, 0.8);
    }
    
    section:nth-child(odd):not(:first-child):before {
      width: 100%;
      height: 0;
      bottom: 100%;
      right: 0;
      z-index: 6;
      opacity: 1;
      transform: rotate(10deg) translateY(-30px);
      box-shadow: 0px 0px 64px 30px rgba(0, 0, 0, 0.8);
    }
    <section>
      <article>What our clients say About Us</article>
    </section>
    <section>
      <article>Read More!</article>
    </section>
    <section>
      <article>Read More!</article>
    </section>
    <section>
      <article>Read More!</article>
    </section>

    【讨论】:

    • 哇,这太完美了。谢谢!
    【解决方案2】:

    尝试使用:beforehttps://jsfiddle.net/0andpzsp/为第二个元素制作盒子阴影

    .cont {
       width: 1000px;
       height: 500px;
    }
    
    div[class^="d"] {
       width: 70%;
       height: 50%;
       position: relative;
       margin-left: 40px;
       margin-top: 50px;
    }
    
    .d0 {
       background: linear-gradient(to right, #005f8a 0%,#00486c 50%,#003a59 100%);;
       transform: skew(20deg)
    }
    
    .d1 {
       background: linear-gradient(to right, #005f8a 0%,#00486c 50%,#003a59 100%);;
       overflow: hidden;
       top: -50px;
       left: 20%;
       transform: skewX(-20deg);
       z-index: -1
    }
    
    .d1:before {
       content: '';
       border-radius: 30%;
       position: absolute;
       display: block;
       width: 600px;
       height: 70px;
       z-index: 9999;
       top: -100px;
       left: -70px;
       box-shadow: -50px 60px 90px 0px #000;
       transform: rotate(-5deg)
    }
    <div class="cont">
      <div class="d0"></div>
      <div class="d1">
      </div>
    </div>

    【讨论】:

      【解决方案3】:

      更简单的方法是将阴影放在每个框的顶部,然后放在第一个框之后。这将解决各种 z-index 问题,因为每个框都比其上方的框高 1 级。它允许阴影位于容器内部而不是容器外部。

      我还更改了您的阴影样式以使用径向渐变*而不是框阴影,因为在这种情况下它更容易控制,并且也更接近您的设计。我还做了一些定位,让它看起来更好一些,并为skew1skew2 获得单独的侧面

      我已将您的最后一个规则集更改为:

      .test-info:before {
        position: absolute;
        content: "";
        width: 100%;
        left: 0;
        top: 0;
        height: 30px;
      }
      
      .test-info.skew1:before {
        background: radial-gradient(ellipse farthest-side at 30% top, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 100%);
      }
      .test-info.skew2:before {
        background: radial-gradient(ellipse farthest-side at 70% top, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 100%);
      }
      

      See Demo

      * 注意:您可能希望在使用之前检查/添加对渐变的额外浏览器支持。

      【讨论】:

        【解决方案4】:

        我试过了,它并不完美,但是,它更接近理想的外观,恕我直言:

        <div id="test-title">
                    <h3>What our clients say about us</h3>
                </div>
                <div id="shadow1"></div>
        

        所以,我添加了新的 html 元素(阴影),而不是使用伪元素...现在,我已经正确设置了 z-indexes 和位置,将旋转的阴影 div 隐藏在第一个 div 后面,并添加了这个css:

        #shadow1 {
          position:absolute;
          width:50%;
          height:150px;
          background:black;
          top:50px;
          left:11%;
          z-index:6;
          opacity:1;
         transform: rotate(-5deg);
        box-shadow: 15px 56px 50px -12px rgba(0,0,0,0.80);
        
        }
        

        演示:http://codepen.io/anon/pen/vGwNqY

        您可以使用旋转、盒子阴影、位置、高度...但是,这可能是一个好的开始(也许)。附言类似的逻辑可以应用于第二个 div。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 2018-03-22
          • 2016-12-25
          • 2016-12-23
          • 2015-10-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多