CSS:之前和之后的背景阴影是否也适用于固定元素以创建页面卷曲效果

时间:2014-07-13 22:18:05

标签: html css css3 pseudo-element page-curl

我有一个想要阴影的元素,可以使用css属性之前和之后创建页面卷曲效果。我已经在其他地方做了相对定位的项目。这很好用,就像这样:

.feed li{
    display:block;
    height:50px;
    width:80%;
    margin-left:10%;
    position:relative;
    clear:both;
    margin-top:20px;
    overflow:visible;
    background:#FFF;
    -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
    -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
    box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
    -webkit-border-top-right-radius: 6px;
    -moz-border-radius-topright: 6px;
    border-top-right-radius: 6px;
}
.feed li:before, .feed li:after{
    position: absolute;
    width: 40%;
    height: 10px;
    content: ' ';
    left: 0px;
    bottom: 12px;
    -webkit-transform: skew(-5deg) rotate(-5deg);
    -moz-transform: skew(-5deg) rotate(-5deg);
    -ms-transform: skew(-5deg) rotate(-5deg);
    -o-transform: skew(-5deg) rotate(-5deg);
    transform: skew(-5deg) rotate(-5deg);
    -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.7);
    -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.7);
    box-shadow: 0 6px 12px rgba(0, 0, 0, 0.7);
    z-index: -1;
}
.feed li:after{
    left:auto;
    right: 0px;
    top:12px;
    bottom:auto;
    -webkit-border-top-right-radius: 6px;
    -moz-border-radius-topright: 6px;
    border-top-right-radius: 6px;
    -webkit-transform: skew(-5deg) rotate(-5deg);
    -moz-transform: skew(-5deg) rotate(-5deg);
    -ms-transform: skew(-5deg) rotate(-5deg);
    -o-transform: skew(-5deg) rotate(-5deg);
    transform: skew(-5deg) rotate(-5deg);
    -webkit-box-shadow: 0 -6px 12px rgba(0, 0, 0, 0.4);
    -moz-box-shadow: 0 -6px 12px rgba(0, 0, 0, 0.4);
    box-shadow: 0 -6px 12px rgba(0, 0, 0, 0.4);
}

然而,当我在一个对象上使用类似的方法时,z-index似乎被覆盖并且我的阴影出现在元素的顶部而不是在它后面。这就是我对此的看法:

    .nav{
    z-index:1;
    position:fixed;
    background:#FFF;
    top:0px;
    bottom:0px;
    left:0px;
    width:200px;
    -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
    -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
    box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
}
.nav:before,.nav:after{
    content:'';
    position:fixed;
    background: transparent;
    z-index: -1;
    width:195px;
    height:50%;
    -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.6);
    -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.6);
    box-shadow: 0 10px 12px rgba(0, 0, 0, 0.6);
}
.nav:before{
    -webkit-transform:  rotate(-2deg);
    -moz-transform:  rotate(-2deg);
    -ms-transform:  rotate(-2deg);
    -o-transform:  rotate(-2deg);
    transform:  rotate(-2deg);
    bottom:0px;
    left:0px;
}
.nav:after{
    -webkit-transform:  rotate(2deg);
    -moz-transform:  rotate(2deg);
    -ms-transform:  rotate(2deg);
    -o-transform:  rotate(2deg);
    transform:  rotate(2deg);
    bottom:auto;
    top:0px;
    left:0px;
}

我不完全确定这里的问题是什么,我已经在其他项目上完成了这个方法而没有任何问题。唯一可以解决的问题是固定元素对其他元素的影响不同。

1 个答案:

答案 0 :(得分:0)

tl; dr:Fiddle

参考W3C

  

:before和:after伪元素与其他框交互,好像它们是在关联元素中插入的真实元素一样。

这意味着他们相对于父母躺在另一个堆栈上。但是可以将它们放在父母后面。通过像你一样添加负z-index来完成。

但似乎将这些伪元素置于父母背景之后(如果有的话)存在问题。作为解决方案,建议将z-index:1;position:relative;添加到父级。这就是为什么第一个示例正常工作而position:fixed;导致问题的原因。

在我的解决方案中,我更改了标记:

<div class="nav">
    <div class="content">lorem ipsum</div>
    <div class="shadows"></div>
</div>

并对元素应用适当的规则。我不知道你最终想象导航的样子,但我认为我的解决方案看起来很棒。请参阅Fiddle