如何用纯 CSS 创作一个记事本翻页动画

效果预览
按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。
https://codepen.io/comehope/pen/qKOPGw
可交互视频教程
此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。
请用 chrome, safari, edge 打开观看。
https://scrimba.com/p/pEgDAM/c6GV2Ay
源代码下载
每日前端实战系列的全部源代码请从 github 下载:
https://github.com/comehope/front-end-daily-challenges
代码解读
定义 dom,一个 book 容器中包含一个 page 容器,page 中再包含 5 个 <span>,page 用于绘制书页,<span> 用于绘制笔划:
<div class="book">
<div class="page">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
</div>
重定义盒模型:
* {
box-sizing: border-box;
}
定义书的尺寸:
.book {
--sw: 0.3em; /* stroke width */
width: 15em;
height: 10em;
background-color: white;
border: var(--sw) solid cadetblue;
border-radius: var(--sw);
font-size: 20px;
}
定义书页的尺寸:
.book {
position: relative;
}
.book .page {
height: inherit;
width: calc(50% + var(--sw) + var(--sw) / 2);
background-color: inherit;
border: inherit;
border-radius: inherit;
position: absolute;
top: calc(-1 * var(--sw));
right: calc(-1 * var(--sw));
}
绘制书页上的笔划:
.book .page {
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 8% 5%;
}
.book .page span {
display: block;
width: 100%;
border-top: var(--sw) solid cadetblue;
border-radius: inherit;
}
定义笔划动画效果,依次画出 5 个笔划:
.book .page span {
animation: 4s linear infinite;
transform-origin: left;
transform: scaleX(0);
}
.book .page span:nth-child(1) {
animation-name: stroke-1;
}
.book .page span:nth-child(2) {
animation-name: stroke-2;
}
.book .page span:nth-child(3) {
animation-name: stroke-3;
}
.book .page span:nth-child(4) {
animation-name: stroke-4;
}
.book .page span:nth-child(5) {
animation-name: stroke-5;
}
@keyframes stroke-1 {
0% {
transform: scaleX(0);
}
10%, 100% {
transform: scaleX(1);
}
}
@keyframes stroke-2 {
10% {
transform: scaleX(0);
}
20%, 100% {
transform: scaleX(1);
}
}
@keyframes stroke-3 {
20% {
transform: scaleX(0);
}
30%, 100% {
transform: scaleX(1);
}
}
@keyframes stroke-4 {
30% {
transform: scaleX(0);
}
40%, 100% {
transform: scaleX(1);
}
}
@keyframes stroke-5 {
40% {
transform: scaleX(0);
}
50%, 100% {
transform: scaleX(1);
}
}
最后,定义书页翻动的效果:
.book .page {
animation: flip 4s linear infinite;
transform-origin: left;
transform-style: preserve-3d;
}
@keyframes flip {
55% {
transform: rotateY(0) translateX(0) skewY(0);
}
70% {
transform: rotateY(-90deg) translateX(calc(-1 * var(--sw) / 2)) skewY(-20deg);
}
80%, 100% {
transform: rotateY(-180deg) translateX(calc(-1 * var(--sw))) skewY(0);
}
}
.book .page span {
backface-visibility: hidden;
}
大功告成!
原文地址:https://segmentfault.com/a/1190000015142453
如何用纯 CSS 创作一个记事本翻页动画的更多相关文章
- 如何用纯 CSS 创作一个小球上台阶的动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/PBGJwL 可交互视频 ...
- 如何用纯 CSS 创作一个小球反弹的动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OwWROO 可交互视频 ...
- 前端每日实战:85# 视频演示如何用纯 CSS 创作一个小球反弹的动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OwWROO 可交互视频 此视频是可 ...
- 如何用纯 CSS 创作一个渐变色动画边框
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/odpRKX 可交互视频教 ...
- 如何用纯 CSS 创作一个冒着热气的咖啡杯
效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/xjXxoz 可交互视频教程 此视 ...
- 如何用纯 CSS 创作一个荧光脉冲 loader 特效
效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/erRzzR 可交互视频教程 此视 ...
- 如何用纯 CSS 创作一个同心圆弧旋转 loader 特效
效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/OZmXQX 可交互视频教程 此视 ...
- 如何用纯 CSS 创作一个充电 loader 特效
效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/deNqdV 可交互视频教程 此视 ...
- 如何用纯 CSS 创作一个金属光泽 3D 按钮特效
效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/full/MGeRRO 可交互视频教程 此 ...
随机推荐
- (转)cookie和session的区别
转自 http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html http://justsee.iteye.com/blog/15 ...
- Windows类标识符及其妙用
Windows类标识符 百度百科这样解释: Windows的类标识符class identifier也称为CLASSID或CLSID,是与某一个类对象相联系的唯一标记(UUID).一个准备创建多个对象 ...
- sessionStorage 、localStorage
localStorage和sessionStorage使用时使用相同的API: localStorage.setItem("key","value");//以“ ...
- C# 面向对象之面向接口
接口的定义 与类不同的是接口用interface关键字 (1)接口中所有成员不能添加任何修饰符,默认为public,如果显示指定修饰符将会出现编译错误; (2)接口中不能包含字段.运算符重载.实例构造 ...
- Django (五) modeld进阶
day 05 models进阶 1.models基本操作 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 对于ORM框架里: 我们写的类表示数据库的表 ...
- 洛谷P2473||bzoj1076 [SCOI2008]奖励关
https://www.luogu.org/problemnew/show/P2473 https://www.lydsy.com/JudgeOnline/problem.php?id=1076 不会 ...
- (洛谷 P1429 平面最近点对(加强版) || 洛谷 P1257 || Quoit Design HDU - 1007 ) && Raid POJ - 3714
这个讲的好: https://phoenixzhao.github.io/%E6%B1%82%E6%9C%80%E8%BF%91%E5%AF%B9%E7%9A%84%E4%B8%89%E7%A7%8D ...
- IIS7文件无法下载问题处理
使用IIS建立了静态站点,内部放置了一些文件供内部局域网下载使用,但deb等文件格式无法下载. 解决办法: 1.在IIS管理器中点击站点,选择右侧的MIME类型. 2.在MIME类型中添加需要下载文件 ...
- 20180607pip install xxx报错SyntaxError invalid syntax
用pip安装时都要在cmd命令行里启动的,而在python中无法运行.退出python运行环境就再执行pip可以了.而且最好用管理员身份运行cmdC:\WINDOWS\system32>cd D ...
- 用vue.js实现购物车功能
购物车是电商必备的功能,可以让用户一次性购买多个商品,常见的购物车实现方式有如下几种: 1. 用户更新购物车里的商品后,页面自动刷新. 2. 使用局部刷新功能,服务器端返回整个购物车的页面html 3 ...