前言
亲爱的掘友,假设若干年之后,你的好朋友结婚了,而作为一个对编码非常有兴趣的我们,除了手写贺卡表达祝福之外,是否可以运用我们的知识所学,去制作一个电子的贺卡,以表达最美好的祝福呢?
小项目准备工作
- html,css,js相关的基本知识
- 贺卡的祝福语,贺卡的封面和里面的图片
html部分
重点部分说明
这段代码是一个简单的HTML结构,其中包含了一个书籍的封面和祝福文字。
- HTML(Hypertext Markup Language) : HTML是用于创建网页的标记语言。它由一系列标签组成,这些标签描述了文档的结构和语义。
- CSS(Cascading Style Sheets) : CSS用于控制网页的样式和布局。在这段代码中,应用了一些CSS类来定义书籍封面的样式,例如
.book-cover
和.front-cover
。 - 3D 变换(3D Transformations) : 代码中使用了一些带有3D效果的CSS类,如
.p3d
和.flip
,这些类可以通过CSS 3D变换属性(例如transform
)来实现元素在3D空间中的旋转、倾斜等效果。 - DIV(Division)元素:
<div>
元素是HTML中用于创建容器的标签,可以将其他元素组织在一起,并对它们应用样式或脚本。 - 文本内容: 在代码中包含了一段祝福小王和小张的结婚祝福语录,通过
<p>
标签表示段落,这段文字将显示在书籍封面的正面。
这些基础知识涵盖了HTML和CSS的基本概念,以及一些关于3D变换的简单理解。
代码部分
1 | xml复制代码 <div class="book p3d"> <!-- 书籍容器 --> |
html部分小结
我们描述了一个带有3D效果的书籍容器,其中包括书籍封面和书籍正面封面。
<div class="book p3d">
:这是整个书籍容器的主要部分,具有类名”p3d”,表示使用了某种3D效果。<div class="book-cover p3d">
:这是书籍封面的部分,同样具有类名”p3d”,表示封面也应用了3D效果。
* `<div class="page back flip"></div>`:这个元素代表书籍封面的背面页,有翻转的效果,类名"flip"指示它可以实现翻转动画效果。
* `<div class="page front p3d">`:这个元素代表书籍封面的正面页,同样具有类名"p3d",表示它也应用了3D效果。
+ `<div class="shadow"></div>`:这个元素代表书籍封面的阴影效果。
+ `<div class="pic"></div>`:这个元素代表书籍封面的图片,即封面图。
<div class="front-cover p3d">
:这是书籍正面封面的部分,同样具有类名”p3d”,表示正面封面也应用了3D效果。
* `<div class="page front flip p3d">`:这个元素代表正面封面的正面页,具有翻转和3D效果。
+ `<p>...</p>`:这个段落包含了祝福的文字内容,描述了对小王和小张的祝福。
* `<div class="page back"></div>`:这个元素代表正面封面的背面页。
css部分
接下来,让我们用css对它进行装饰
重点部分说明
要理解这段CSS代码,首先需要一些基础知识:
- Box Model:了解盒模型,包括内容、内边距、边框和外边距等部分,以及如何使用box-sizing属性来调整盒模型的计算方式。
- CSS选择器:熟悉CSS选择器,包括元素选择器、类选择器、ID选择器、伪类和伪元素等,以及它们的优先级规则。
- Transform和Perspective:了解CSS的transform属性和perspective属性,以及它们在页面中创建2D和3D变换效果的能力。
- CSS动画和过渡:了解如何使用CSS动画和过渡来实现元素的动态效果。
- 背景图像和渐变:了解如何使用CSS设置背景图像和渐变色。
- 视角和透视:理解透视视角的概念,以及如何使用透视属性来创建3D效果。
一旦掌握了这些基础知识,就可以开始解析这段代码。我们主要实现了一个带有3D效果的书籍容器,其中包括书籍封面和正面封面。具体的CSS规则会应用于不同的元素,例如.book、.page、.front、.back等,以及一些属性如transform、background-color、background-image等,用来定义元素的外观和行为。
代码部分
1 | css复制代码/* 重置默认样式 */ |
css部分小结
这段 CSS 代码主要用于创建一个具有翻书效果的书籍样式。
- 通用样式:
* 将所有元素的边距、填充、边框设置为零,盒子模型设为边框盒模型。
- HTML 和 Body 样式:
* 设置 HTML 和 Body 元素的高度为100%。
* 设置页面字体为 Helvetica,字体大小为100%的基础上增加25%。
- 书籍容器样式 (.book):
* 设置书籍容器的宽度和高度为300px,绝对定位并水平垂直居中。
* 鼠标悬停时显示指针,并禁止选择内容。
* 应用3D旋转效果,使其看起来像倾斜的书本。
- 页面样式 (.page):
* 设置页面的宽度和高度为300px,绝对定位在左上角。
* 设置内边距为1em,并设置文本首行缩进为2em。
- 正面样式 (.front) 和 背面样式 (.back):
* 设置正面背景颜色为 #d93e2b(深红色),背面背景颜色为白色。
- 封面样式 (.front-cover):
* 设置封面旋转的原点在左侧中点。
* 设置封面的背面为一个指定的图片,并应用3D效果。
- 3D效果样式 (.p3d):
* 设置子元素在三维空间内保持平铺。
- 翻转效果样式 (.flip):
* 通过旋转180度实现翻转效果。
- 图片容器样式 (.pic) 和 阴影样式 (.shadow):
* 设置图片容器和阴影的样式和位置,其中图片容器有一张指定的背景图片,阴影为半透明黑色。
js部分
重点部分说明
这段 JavaScript 代码实现了鼠标按住并移动时的交互效果,主要用于控制书籍封面的翻转和阴影效果。
- 定义了变量
hold
,用于标识鼠标是否按住。 - 获取了书籍封面的元素节点,并定义了一个函数
clamp
用于限制值的范围在指定的最小值和最大值之间。 - 给封面元素添加了鼠标按下事件监听器 (
onmousedown
),当鼠标按下时将hold
设置为true
。 - 给窗口添加了鼠标松开事件监听器 (
onmouseup
),当鼠标松开时将hold
设置为false
。 - 给窗口添加了鼠标移动事件监听器 (
onmousemove
),当鼠标移动时执行相应操作:
* 如果鼠标按住 (`hold == true`),则执行以下操作:
+ 计算鼠标移动的角度,并根据窗口宽度和鼠标位置来计算旋转角度,使封面随鼠标移动而旋转,实现翻书效果。
+ 根据计算得到的角度,通过设置封面元素的 `transform` 属性来实现旋转。
+ 针对书籍封面上的图片容器 (`pic`) 和阴影 (`shadow`),可能还需要根据旋转角度来调整它们的倾斜角度,以使得交互效果更加逼真。
代码部分
1 | xml复制代码<script> |
js部分小结
当鼠标按下时,设置 hold
变量为 true
,表示鼠标已按下。 当鼠标松开时,将 hold
变量设置为 false
,表示鼠标已经松开。 监听鼠标移动事件,在鼠标移动时执行相应操作。 通过 document.querySelector('.front-cover')
获取页面中 class 为 .front-cover
的元素。 定义了一个 clamp
函数,用于限制一个值在指定范围内。 计算旋转角度 angle
,根据鼠标位置调整角度,使封面元素随鼠标水平移动而旋转,并限制旋转角度在 -180 到 0 度之间。 使用 style.transform
属性将计算得到的旋转角度应用到封面元素,实现立体效果。 通过 console.log(e.pageX)
输出鼠标横坐标位置。
实现效果图(可翻阅)
项目小结
完成这个小项目后,有没有感觉自己就像是一位魔术师,把一本普通的书变成了一个会动的对象!虽然并没有让书飞起来或者变出兔子,但能让书封面随着鼠标的动作而自如地翻转,也是一种小小的魔法吧!
在编写代码的过程中,我们学到了如何使用JavaScript来捕捉鼠标事件,并根据鼠标位置的变化来实现元素的旋转效果。虽然刚开始可能有些困难,但通过不断调试和尝试,最终成功实现了预期的效果。
最重要的是,通过这个项目,我们更深入地理解了前端开发中的交互性设计,以及如何通过简单的动画和交互来增加用户体验。总的来说,虽然是个小项目,但收获颇丰,让我们更加热爱前端开发这个神奇的领域!
本文转载自: 掘金