一个流行的设计技巧是创建一个看起来像一张纸的容器,然后在它下面堆叠其他纸张,以增加分层或三维效果。我们可以使用纯 CSS 来实现这种效果,但我们可以考虑多种类型的叠纸设计。我们将提供四种特定情况的代码片段。
底部垂直叠纸
这里的想法是,我们的内容容器是顶部的纸张,更多纸张在它下方堆叠,它们的边缘显示在顶部纸张的底部。
查看 CodePen 上 CSS-Tricks 的 叠纸效果 - 垂直 笔记 (@css-tricks)。
<div class="paper"></div>
.paper {
background: #fff;
box-shadow:
/* The top layer shadow */
0 1px 1px rgba(0,0,0,0.15),
/* The second layer */
0 10px 0 -5px #eee,
/* The second layer shadow */
0 10px 1px -4px rgba(0,0,0,0.15),
/* The third layer */
0 20px 0 -10px #eee,
/* The third layer shadow */
0 20px 1px -9px rgba(0,0,0,0.15);
/* Padding for demo purposes */
padding: 30px;
}
顶部垂直叠纸
这与上一个例子相同,但纸张堆叠在容器顶部而不是底部显示。这里唯一的区别是,我们使用负数重新定位了 .paper
元素上的 box-shadow
属性。
查看 CodePen 上 CSS-Tricks 的 叠纸效果 - 顶部垂直 笔记 (@css-tricks)。
<div class="paper"></div>
.paper {
background: #fff;
box-shadow:
/* The top layer shadow */
0 -1px 1px rgba(0,0,0,0.15),
/* The second layer */
0 -10px 0 -5px #eee,
/* The second layer shadow */
0 -10px 1px -4px rgba(0,0,0,0.15),
/* The third layer */
0 -20px 0 -10px #eee,
/* The third layer shadow */
0 -20px 1px -9px rgba(0,0,0,0.15);
/* Padding for demo purposes */
padding: 30px;
}
对角叠纸
这是一种略微不同的方法,我们使用 ::before
和 ::after
伪元素来创建额外的纸张,而不是在前面的示例中使用的 box-shadow
技术。
查看 CodePen 上 CSS-Tricks 的 叠纸效果 - 对角 笔记 (@css-tricks)。
<div class="paper"></div>
/* Diagonal stacked paper effect */
.paper {
background-color: #fff;
/* Need position to allow stacking of pseudo-elements */
position: relative;
/* Padding for demo purposes */
padding: 30px;
}
.paper,
.paper::before,
.paper::after {
/* Add shadow to distinguish sheets from one another */
box-shadow: 2px 1px 1px rgba(0,0,0,0.15);
}
.paper::before,
.paper::after {
content: "";
position: absolute;
width: 100%;
height: 100%;
background-color: #eee;
}
/* Second sheet of paper */
.paper::before {
left: 7px;
top: 5px;
z-index: -1;
}
/* Third sheet of paper */
.paper::after {
left: 12px;
top: 10px;
z-index: -2;
}
凌乱的纸张堆叠
我们可以使用与上一个示例相同的方法来交错纸张以创建有意凌乱的外观,但使用伪元素,并使用 transform
属性旋转底部的纸张。此示例假设使用 Autoprefixer 或在浏览器支持可能减弱的情况下对 transform
属性使用前缀。
查看 CodePen 上 CSS-Tricks 的 叠纸效果 - 凌乱 笔记 (@css-tricks)。
<div class="paper"></div>
.paper {
background: #fff;
padding: 30px;
position: relative;
}
.paper,
.paper::before,
.paper::after {
/* Styles to distinguish sheets from one another */
box-shadow: 1px 1px 1px rgba(0,0,0,0.25);
border: 1px solid #bbb;
}
.paper::before,
.paper::after {
content: "";
position: absolute;
height: 95%;
width: 99%;
background-color: #eee;
}
.paper::before {
right: 15px;
top: 0;
transform: rotate(-1deg);
z-index: -1;
}
.paper::after {
top: 5px;
right: -5px;
transform: rotate(1deg);
z-index: -2;
}
这太棒了,另一个很棒的代码片段 Chris
这太酷了,感谢分享。
太棒了!
有没有办法在这个上面放一个背景图像?
我为玩这个做了一个 Sass 函数!
新手错误,再次 CodePen
http://codepen.io/Rodsevich/pen/bVQVeJ
太棒了!我会在不久的将来使用它 :-)
这是另一个用于生成 x 个纸张堆叠的函数
我一直使用此解决方案进行网页设计(我自己的第三个版本),但一直无法解决一个问题:当内容太大时,主 div 会变得太长,结果在页面中间,阴影样式看起来很蠢……
我一直在使用的技巧是使用 JS 来创建一个模拟堆叠,使其保持粘性,同时有一个
90vh
的 div,但现在我使用的库在更新后无法正常工作……所以,你有没有什么创意技巧?或者可以产生这种效果的替代 JS 库? - 多个 div 彼此叠加,并且相对于容器具有粘性定位。我有用于在顶部和底部显示纸张的代码,但无法让纸张以对角线或凌乱的方式显示。
好吧,我曾经做过一些事情,让纸张变得很大,并且显示在页面顶部,而不是在调用它的那个部分。现在我似乎再也做不到那件事了。
我不理解这些“before”和“after”是如何工作的,而且似乎在网上找不到解释。
跟进我自己的消息
我采取了不同的路线。我复制了对角线代码,并在新项目中创建了一个工作的页面堆叠。然后我将 Messy 代码添加到其中。它仍然按预期工作。我逐个添加了原始垂直向上和垂直向下的代码副本。
一切正常 )-
我仍然不知道原始代码中哪里出了问题。
我应该诊断一个不再有区别的情况吗?我应该探索错误以了解发生了什么,也许我以后就不会再犯同样的错误了?
嗯…….
(此页面要求我提供我的电子邮件地址。我忘记了我使用的是哪一个……)
你好!在“凌乱的纸张堆叠”中,旋转属性被指定为百分比,因此,当内容很多时,角会变大。但是如何确保角度不改变?