效果预览

在线演示

按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。

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> 用于绘制笔划:

    &lt;div class="book"&gt;
&lt;div class="page"&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;

重定义盒模型:

* {
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

最新文章

  1. 项目开发(Require + E.js)
  2. CRM(四川网脉系统)项目总结
  3. Hololens入门之语音识别(语音命令)
  4. IIS 7 的 500 內部錯誤
  5. IOS开发之控件篇UITabBarControllor第二章 - 遮掩TableView问题
  6. Swift面向对象基础(中)——Swift中的存储属性和计算属性
  7. VMware 虚拟机Red Hat 5.9 交换区及硬盘空间调整
  8. Java [Leetcode 326]Power of Three
  9. JQuery合并表格单元格
  10. ASP.NET MVC模型绑定的6个建议(转载)
  11. ios xcode如何在控制台打印frame
  12. Android 让他们自己控制开发的定义(一个)
  13. 安卓如何快速更新SDK
  14. mysql 严格模式 Strict Mode说明(text 字段不能加默认或者 不能加null值得修改方法)
  15. JDK源码分析(5)之 HashMap 相关
  16. git中如何撤销部分修改?
  17. 使用jquery获取父元素或父节点
  18. Delphi10.2 DPR文件
  19. webdriver +浏览器驱动
  20. 学习笔记 07 --- JUC集合

热门文章

  1. B - Halloween Costumes
  2. freertos之任务
  3. Unity Shader入门精要学习笔记 - 第14章非真实感渲染
  4. Unity Shader入门精要学习笔记 - 第13章 使用深度和法线纹理
  5. Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础
  6. [转]Ioc容器Autofac
  7. ASP.NET MVC 复制MVC项目代码到同一个项目的时候报错The request for ‘home’ has found the following matching controll
  8. How To Install and Secure phpMyAdmin on Ubuntu 12.04(MySQL图形管理)
  9. 洛谷 P3853 [TJOI2007]路标设置
  10. 关于h5中背景音乐的自动播放