CSS 实现 3D 书本展开动效

一、前言

本文将使用纯 CSS 实现一个简单的 3D 书本展开动效。

2023-07-18-225831.gif

二、实现思路

实现这么一个书本动效 乍一看可能会感觉有些复杂,实际上并不难,遇到这种组合动效的需求时,我们只要将整体拆分成多个小步骤去做,就很简单了。

1. 拆分主体

在实现动效前,我们需要先将书本画出来,画一个本子,我们可以先简单分成三个元素:封皮、书脊、正文

image.png

2. CSS 变量声明与使用

本不打算加入这段,但考虑到有些没有用过的读者,还是简单讲一下。

在现代 CSS 中,在不使用预处理器的情况下,我们也可以声明 CSS 变量,在当前场景下,我们可以直接将书本的主题色与大小设置为变量,这样我们可以轻松的修改整个书本的样式。

变量声明

CSS 变量定义:带有前缀 -- 的属性名,比如 --example--name,表示声明一个变量。

:root 伪类匹配文档树的根元素。对于 HTML 来说,:root 表示 <html> 元素,除了优先级更高之外,与 html 选择器相同,我们可以在 :root 伪类中声明全局 CSS 变量。

:root {--color: red;
}

变量使用

可以通过 var() 函数使用声明的变量。

div {color: var(--color)
}

3. 绘制书本主体

根据第一步的拆分,我们将三个主要部分绘制出来。

<style>
:root {/* 书本的高度 */--main-height: 150px;/* 书本的颜色 */--theme-bg-color: rgba(239, 112, 155, .9);
}div {box-sizing: border-box;
}/* 书本主体  */
#book {position: relative;margin: 150px auto 80px auto;width: 150px;height: var(--main-height);cursor: pointer;
}/* 书脊 */
.book-side {position: absolute;left: -14px;width: 15px;height: var(--main-height);border-radius: 5px 0 0 5px;background-color: var(--theme-bg-color);
}/* 封面 */
.book--cover {position: absolute;top: 0;left: -1px;padding: 10px;width: 105px;height: var(--main-height);font-size: 18px;font-weight: 400;border-radius: 0 6px 6px 0;background-color: var(--theme-bg-color);
}/* 书本内容 Begin */
.book--content {padding: 4px 5px 4px 2px;width: 105px;height: var(--main-height);border-radius: 2px;background-color: var(--theme-bg-color);
}.book--inner {padding: 10px 0;width: 100%;height: 100%;color: #333;border-radius: 1px;box-shadow: 0px 2px 14px 0px rgba(0, 0, 0, 0.2);background-color: rgba(250, 250, 250, 0.8);
}
</style><body><div id="book"><div class="book-side"></div><div class="book--cover">封面</div><div class="book--content"><div class="book--inner"></div></div></div>
</body>

实现效果

Pasted image 20230719001446.png

4. 书本张开效果

现在虽然有了雏形,但是完全闭合的书本并不好看,我们让他有一点微微打开的效果。

通过 rotate 函数,以 x 轴为逆时针旋转 8°, 以 y 轴为顺时针旋转 30°

.book--cover {/** 省略... **/transform: rotateX(-8deg) rotateY(30deg);
}

实现效果如下,可以看到有了一些样子,但是旋转是以中心进行旋转的,偏离了书脊,不符合我们的预期。

Pasted image 20230719002422.png

可以通过 transform-origin 改变元素变型的原点 来调整旋转的位置。

image.png

设置 x 轴以左侧为旋转点,y 轴以中心为旋转点进行旋转。

.book--cover {/** 省略... **/transform: rotateX(-8deg) rotateY(30deg);transform-origin: left center;
}

实现效果

Pasted image 20230719004005.png

5. 实现动效

完成了书本的基本骨架绘制后,我们可以将动画效果加进来了

鼠标悬浮动效

通过 :hover 伪类设置鼠标悬浮后的效果, 和第四步其实一样,打开效果通过 rotateXrotateY 实现,为了模拟的更加真实,在掀开时加入阴影。

#book:hover .book--cover {transform: rotateX(-10deg) rotateY(50deg);box-shadow: 30px 0 10px 0 rgba(0, 0, 0, 0.2);
}

这样基本的打开效果就实现好了,但是太过直接,不够平滑,我们对元素加入过度效果。

.book--cover {/** 省略... **/transition: all .7s linear;
}

这样基本的鼠标效果就实现好了。

书本打开动效

通过 :active 伪类设置长按时的打开效果, 通过 scale 将书本整体适当放大, 并将 封皮 的打开效果尽量放大即可。

#book:active {transform: scale(1.7);
}#book:active .book--cover {transform: rotateX(-10deg) rotateY(138deg);
}

添加上面的代码后,便实现了长按打开的效果,为了放大效果更加自然平滑,对 #book 元素添加过渡效果

#book {/* 省略... */transition: all .7s linear;
}

如此整体功能就实现完成了。

6. 美化内容

功能完成后,我们便可以进一步对书本进行美化,现在整个书本太空,加入一些文字会显得更加丰满充实。

  <div id="book"><div class="book-side"></div><div class="book--content"><div class="book--cover">CSS 圣经</div><div class="book--inner"><div style="padding-left: 10px"><div>~~~</div><div>~~~~~~~~</div><div>~~~~~~~~</div><div>~~~~~~~~</div><div>~~~~~~~~</div></div></div></div></div>

Pasted image 20230719010316.png

三、完整代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>3D 书本动效</title><style>:root {--main-height: 150px;--theme-bg-color: rgba(239, 112, 155, .9);}div {box-sizing: border-box;}/* 书本主体  */#book {position: relative;margin: 150px auto 80px auto;width: 150px;height: var(--main-height);transition: all .7s linear;cursor: pointer;}/* 书脊 */.book-side {position: absolute;left: -14px;width: 15px;height: var(--main-height);border-radius: 5px 0 0 5px;background-color: var(--theme-bg-color);}/* 封面 */.book--cover {position: absolute;top: 0;left: -1px;padding: 10px;width: 105px;height: var(--main-height);font-size: 18px;font-weight: 400;border-radius: 0 6px 6px 0;transform-origin: left center;transform: rotateX(-8deg) rotateY(30deg);transition: all .7s linear;background-color: var(--theme-bg-color);}#book:active {transform: scale(1.7);}#book:hover .book--cover {transform: rotateX(-10deg) rotateY(50deg);box-shadow: 30px 0 10px 0 rgba(0, 0, 0, 0.2);}#book:active .book--cover {transform: rotateX(-10deg) rotateY(138deg);}/* 书本内容 Begin */.book--content {padding: 4px 5px 4px 2px;width: 105px;height: var(--main-height);border-radius: 2px;background-color: var(--theme-bg-color);}.book--inner {padding: 10px 0;width: 100%;height: 100%;color: #333;border-radius: 1px;box-shadow: 0px 2px 14px 0px rgba(0, 0, 0, 0.2);background-color: rgba(250, 250, 250, 0.8);}</style>
</head><body><div id="book"><div class="book-side"></div><div class="book--cover">CSS 圣经</div><div class="book--content"><div class="book--inner"><div style="padding-left: 10px"><div>~~~</div><div>~~~~~~~~</div><div>~~~~~~~~</div><div>~~~~~~~~</div><div>~~~~~~~~</div></div></div></div></div><p style="text-align:center">长按书本,即可展开书本</p>
</body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ的安装与使用

RabbitMQ的安装与使用 介绍一、RabbitMQ的安装1 查找镜像2 拉取镜像3 查看镜像4 创建容器5 查看容器6 访问测试 二、RabbitMQ的使用1 创建项目2 配置文件3 队列配置文件4 消费者5 生产者6 测试 三、交换器四、普通队列Demo五、死信队列Demo1 介绍2 示例2.1 配置2.2 生产者2.3 消…

10_Java泛型

一、为什么要有泛型 1.泛型的设计背景 集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象&#xff0c;所以在JDK1.5之前只能把元素类型设计为Object&#xff0c;JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定&#xff0c;其他的部分…

Qt C++春晚刘谦魔术约瑟夫环问题的模拟程序

什么是约瑟夫环问题&#xff1f; 约瑟夫问题是个有名的问题&#xff1a;N个人围成一圈&#xff0c;从第一个开始报数&#xff0c;第M个将被杀掉&#xff0c;最后剩下一个&#xff0c;其余人都将被杀掉。例如N6&#xff0c;M5&#xff0c;被杀掉的顺序是&#xff1a;5&#xff…

14. UE5 RPG使用曲线表格设置回复血量值

之前的文章中&#xff0c;我使用的都是固定的数值来设置血量回复或者蓝量回复&#xff0c;在这篇文章里面&#xff0c;介绍一下使用曲线表格。通过曲线表格我们可以设置多个数值&#xff0c;然后通过去通过修改索引对应的数值去修改回复的血量或者蓝量。 创建曲线表格 首先创…

林浩然与杨凌芸的Java奇遇记:字节流世界的二进制爱情

林浩然与杨凌芸的Java奇遇记&#xff1a;字节流世界的二进制爱情 The Java Adventure of Lin Haoran and Yang Lingyun: Binary Love in the Byte Stream World 在编程宇宙中&#xff0c;有一对程序员CP——林浩然和杨凌芸&#xff0c;他们共同编织着Java王国里那些神秘而又充满…

MySQL--SQL解析顺序

前言&#xff1a; 一直是想知道一条SQL语句是怎么被执行的&#xff0c;它执行的顺序是怎样的&#xff0c;然后查看总结各方资料&#xff0c;就有了下面这一篇博文了。 本文将从MySQL总体架构—>查询执行流程—>语句执行顺序来探讨一下其中的知识。 一、MySQL架构总览&a…

Swift Combine 使用从 PassthroughSubject 预定好的发送的事件测试订阅者 从入门到精通二十三

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

MSS与cwnd的关系,rwnd又是什么?

慢启动算法是指数递增的 这种指数增长的方式是慢启动算法的一个核心特点&#xff0c;它确保了TCP连接在开始传输数据时能够快速地探测网络的带宽容量&#xff0c;而又不至于过于激进导致网络拥塞。具体来说&#xff1a; 初始阶段&#xff1a;当TCP连接刚建立时&#xff0c;拥…

ubuntu屏幕小的解决办法

1. 安装vmware tools , 再点自适应客户机 执行里面的vmware-install.pl这个文件 &#xff1a;sudo ./vmware-install.pl 执行不了可以放到家目录&#xff0c;我放在了/home/book 里面 最后点这个自适应客户机 然后我这里点不了是因为我点了控制台视图和拉伸客户机&#xff0c…

【Java中23种设计模式-单例模式2--懒汉式2线程安全】

加油&#xff0c;新时代打工人&#xff01; 简单粗暴&#xff0c;学习Java设计模式。 23种设计模式定义介绍 Java中23种设计模式-单例模式 Java中23种设计模式-单例模式2–懒汉式线程不安全 package mode;/*** author wenhao* date 2024/02/19 09:38* description 单例模式…

鸿蒙开发 之 工具安装和环境搭建

DevEco Studio 面向HarmonyOS应用及元服务开发者提供的集成开发环境(IDE)&#xff0c; 助力高效开发。 ArkTS 语言 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&…

Flask 学习99-Flask-SocketIO 快速入门与使用

前言 flask-socketio 为flask应用提供了一个客户端与服务器之间低延迟的双向通讯 官网地址:https://flask-socketio.readthedocs.io/en/latest/intro.html 环境准备 先安装flask-socketio pip install flask-socketio说明Flask-SocketIO 与 js版本客户端不匹配,二者不能正…

机器学习之梯度下降法直观理解

形象化举例&#xff0c;由上图所示&#xff0c;假如最开始&#xff0c;我们在一座大山上的某处位置&#xff0c;因为到处都是陌生的不知道下山的路&#xff0c;所以只能摸索着根据直觉&#xff0c;走一步算一步。在此过程中&#xff0c;每走到一个位置的时候&#xff0c;都会求…

五步解决 Ubuntu 18.04 出现GLIBC_2.28 not found的解决方法

Ubuntu 18.04 出现GLIBC_2.28 not found的解决方法 参考debian网址https://packages.debian.org/buster/并搜索想要的软件或者工具等&#xff0c;如libc6,有结果如下&#xff1a; 具体就不介绍了&#xff0c;请浏览官网了解。 第一步&#xff1a;添加软件源&#xff0c;在/et…

STM32-点亮 LED

目录 1 、电路构成及原理图 2 、编写实现代码 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板&#xff0c;此笔记基于这款开发板记录。 1 、电路构成及原理图 首先&#xff0c;通过朗峰 F1 开发板 LED 部分原理图看到…

第三十六天| 435. 无重叠区间、763.划分字母区间、56. 合并区间

Leetcode 435. 无重叠区间 题目链接&#xff1a;435 无重叠区间 题干&#xff1a;给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 思考&#xff1a;贪心法。和452 用最少数量的…

Gin框架: HTML模板渲染之配置与语法详解

Gin的HTML模板配置 1 &#xff09;单一目录的配置 配置模板目录&#xff0c;在与main.go同级下, 新建目录&#xff0c;下面二选一&#xff0c;仅作举例, 这里选择 tpls templatestpls 在 tpls 目录下新建 news.html <!-- 最简单的 --> <h1>News Page</h1>&l…

如何在nginx增加健康检查接口

在docker中部署的nginx或者在nginx部署的nginx一般是需要一个健康检查接口的 这样的话&#xff0c;就可以确定容器当前的状态是否是健康的 那么&#xff0c;如何给nginx增加一个健康检查的接口呢&#xff1f; 接下来呢&#xff0c;我们就演示一个在nginx中如何增加健康检查的…

ArcGIS API for JavaScript 4.X 本地部署(js,字体)

0 目录&#xff08;4.19&#xff09; /4.19/ 1 修改文件 1.1 init.js 编辑器打开/4.19/init.js搜索文本[HOSTNAME_AND_PATH_TO_JSAPI]&#xff0c;然后将其连同前面的https://替换为http://ip地址/4.19&#xff0c;可以是localhost&#xff0c;只能本机引用 替换后&#xff…

Minio Server + Minio Client 数据迁移、备份

文章目录 1、概要2、mc安装3、添加minio集群4、数据同步4、cp 和 mirror 区别5、效果 1、概要 Minio Server Minio Client 实现minio 不同集群之间的数据迁移、数据备份 2、mc安装 $ wget http://dl.minio.org.cn/client/mc/release/linux-amd64/mc -P /usr/local/bin/ $ c…