技术杂谈技术杂谈CSS 中的疯狂杂志折叠效果
小u在Mad Magazine工作了65年后,漫画家Al Jaffee宣布退休。Jaffee最出名的是他的Mad Fold-Ins,折叠页面会揭示艺术品中隐藏的信息。网上有很多例子。问题是,它们都静态地并排显示之前和之后,这削弱了魔力(见这里和这里)。整整一代人可能只见过这种格式的折叠。
当然,我必须为网络创建纸张折叠效果。有许多不同的方法可以实现这一点,但这种方法很好,因为:
- 它只是CSS,不依赖于JavaScript。
- 使用单个图像,而不是要求在 Photoshop 中对图像进行切片。
- 可以通过在样式属性中设置 CSS 变量来仅使用 HTML 进行配置。
这是它的演示,使用约翰尼·桑普森(Johnny Sampson)在庆祝Jaffee98岁生日的一期中的作品。悬停或点击可折叠。
在线演示地址
点击查看
效果的 HTML 相当简单。您可能想知道独立图像元素 - 它是隐藏的,但用于设置组件的大小和纵横比。图像路径在此处指定,并再次作为CSS变量来设置其他元素的背景图像。
1 2 3 4 5 6 7 8
| <span class="jaffee" style="--bg: url('path/to/image.png');"> <span class="a"></span> <span class="bc"> <span class="b"></span> <span class="c"></span> </span> <img src="path/to/image.png"> </span>
|
这是用于设置定位、3D 变换和过渡的 CSS。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| .jaffee { position: relative; display: inline-flex; transform: rotateX(10deg); transform-style: preserve-3d; cursor: grab; }
.jaffee img { width: auto; height: auto; max-width: 100%; max-height: 56vh; opacity: 0; }
.jaffee .a, .jaffee .b, .jaffee .c { top: 0; display: inline-block; height: 100%; background-image: var(--bg); background-size: cover; background-repeat: no-repeat; }
.jaffee .a { position: absolute; left: 0; width: 50%; background-position: 0 0; }
.jaffee .bc { position: absolute; display: inline-flex; width: 50%; height: 100%; left: 50%; transform-origin: left; transition: transform 3s; transform-style: preserve-3d; }
.jaffee .b, .jaffee .c { position: relative; width: 50%; backface-visibility: hidden; }
.jaffee .b { background-position: 66.666667% 0; transform-style: preserve-3d; }
.jaffee .b:after { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: #000; transform: rotateY(180deg) translateZ(1px); transform-style: preserve-3d; backface-visibility: hidden; }
.jaffee .c { background-position: 100% 0; transform-origin: left; transition: transform 2s; }
.jaffee:hover .bc, .jaffee:active .bc { transform: rotateY(-180deg) translateZ(-1px); transition: transform 2s; }
.jaffee:hover .c, .jaffee:active .c { transform: rotateY(180deg) translateZ(2px); transition: transform 3s; }
|