前言
在这篇文章中,我们将详细介绍如何使用HTML5和CSS3创建一个《星球大战》(Star Wars)主题的网页,并添加一些酷炫的动画效果。我们将从基础的HTML结构开始,逐步介绍CSS样式和动画的实现方法。
效果大致如下:
可以想象一下,在茫茫宇宙中有两艘飞船相遇,他们一同“时空跳跃”,飞向遥远的远方。
1. HTML5 版本声明头
首先,我们需要声明HTML5文档类型,并设置文档的基本结构。HTML5版本声明头如下:
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>星球大战</title>
<link rel="stylesheet" href="./common.css">
</head>
<body>
<div class="starwars">
<img src="./images/star.svg" class="star" alt="星">
<img src="./images/wars.svg" class="wars" alt="战">
<h2 class="byline">
<span>T</span>
<span>h</span>
<span>e</span>
<span>F</span>
<span>o</span>
<span>r</span>
<span>c</span>
<span>e</span>
<span>A</span>
<span>w</span>
<span>a</span>
<span>k</span>
<span>e</span>
<span>n</span>
<span>s</span>
</h2>
</div>
</body>
</html>
2. CSS 重置
不同的浏览器对元素的默认样式处理方式不同,因此我们需要使用CSS重置来确保所有浏览器的一致性。在大型项目中,如果不进行 CSS 重置,随着时间的推移,不同浏览器的默认样式差异可能会导致网页样式出现混乱,难以维护。 你可以:
直接在项目中添加CSS重置代码
- 将你喜欢的CSS重置代码复制到这个文件中。例如,你可以使用Eric Meyer Reset或Normalize.css的代码。
- 在你的主CSS文件中导入这个重置文件,或者直接在HTML文档的
<head>部分通过<link>标签引入
使用Normalize.css
- 下载Normalize.css 或者通过CDN引入。
- 在HTML文档的
<head>部分引入 Normalize.css。
另外,使用通配符 * 也能简单粗暴地重置所有元素的CSS(即 * { margin: 0; padding: 0; }),但由于性能问题,它并不推荐在实际项目中使用。
这里我们使用了Eric Meyer的重置CSS:
css
/* Eric Meyer's Reset CSS v2.0 - http://meyerweb.com/eric/tools/css/reset/ */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
3. 基础样式
接下来,我们设置一些基础样式,包括页面的高度、背景色和背景图片:
css
html, body {
height: 100vh;
}
body {
background: #000 url('./images/bg.jpg');
}
4. 主要容器样式
.starwars 是主要的容器,我们为其设置3D透视效果,并将其居中定位:
css
.starwars {
perspective: 800px;
transform-style: preserve-3d;
height: 17em;
width: 34em;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
perspective: 800px;:设置了 3D 透视效果,值为 800px,表示观察者距离屏幕的距离。transform-style: preserve-3d;:保留 3D 转换效果,确保子元素在 3D 空间中正确渲染。height: 17em;和width: 34em;:定义了容器的高度和宽度。position: absolute;:将容器设置为绝对定位,使其脱离文档流。top: 50%;和left: 50%;:将容器的顶部和左边缘定位在父元素的中心。transform: translate(-50%, -50%);:通过平移将容器自身的大小移动到父元素的中心,实现水平和垂直居中。- 在不确定元素是否居中时,我们可以使用背景大法:
background: red;此时盒子在页面中的占位会显示出来,帮助我们判断元素是否居中。
5. 图片和标题样式
把图片和标题设置绝对定位,并调整它们的位置:
css
img {
width: 100%;
}
.star, .wars, .byline {
position: absolute;
}
.star {
top: -0.75em;
}
.wars {
bottom: -0.5em;
}
.byline {
color: #fff;
font-size: 2.25em;
left: -2em;
right: -2em;
text-align: center;
text-transform: uppercase;
top: 42%;
}
6. 动画效果
在介绍动画效果前,我们得先理解一个概念————关键帧(Keyframe)。
简单来说,关键帧是指动画序列中设定的特定时间点上的图像或状态。这些时间点上的图像定义了动画的主要变化或动作的关键位置。
在两个关键帧之间,可以通过插值(Interpolation)的方法自动生成中间的过渡帧,从而实现平滑的动画效果。插值可以是线性的,也可以是非线性的(如贝塞尔曲线),具体取决于动画师希望达到的效果。
在《星球大战》中,我们需要达成动画通过逐渐改变文字的透明度和旋转角度,创造出一种文字从侧立状态逐渐旋转并显现,然后再次消失的效果。 我们的飞船运动效果具体代码如下:
css
.star {
animation: star 10s ease-out infinite;
}
.wars {
animation: wars 10s ease-out infinite;
}
.byline {
animation: movie-byline 10s linear infinite;
}
.byline span {
animation: spin-letters 10s linear infinite;
display: inline-block;
}
@keyframes star {
0% {
opacity: 0;
transform: scale(1.5) translateY(0.5em);
}
20% {
opacity: 1;
}
89% {
opacity: 1;
transform: scale(1);
}
100% {
opacity: 0;
transform: translateZ(-1000em);
}
}
@keyframes wars {
0% {
opacity: 0;
transform: scale(1.5) translateY(-0.75em);
}
20% {
opacity: 1;
}
90% {
opacity: 1;
transform: scale(1);
}
100% {
opacity: 0;
transform: translateZ(-1000em);
}
}
@keyframes movie-byline {
0% {
transform: translateZ(5em);
}
100% {
transform: translateZ(0em);
}
}
@keyframes spin-letters {
0%, 10% {
opacity: 0;
transform: rotateY(90deg);
}
30% {
opacity: 1;
}
70%, 86% {
transform: rotateY(0);
opacity: 1;
}
95%, 100% {
opacity: 0;
}
}
在上述代码中发生了以下几件事:
-
0%, 10%:在动画开始的 0% 到 10% 阶段,文字是完全透明的(opacity: 0),并且绕 Y 轴旋转了 90 度(transform: rotateY(90deg))。这意味着文字在这个阶段是看不见的,并且是侧立的。 -
30%:在动画进行到 30% 时,文字突然变得完全不透明(opacity: 1),这意味着文字在这个阶段完全显现出来。 -
70%, 86%:在动画的 70% 到 86% 阶段,文字保持完全不透明(opacity: 1),并且不再绕 Y 轴旋转(transform: rotateY())。这意味着文字在这个阶段是稳定的,没有任何旋转。 -
95%, 100%:在动画的最后 5% 阶段,文字再次变得完全透明(opacity: 0),这意味着文字在这个阶段再次消失。
总结
通过以上步骤,我们成功地创建了一个《星球大战》主题的网页,并添加了酷炫的动画效果。这些效果包括文字的透明度变化、旋转和缩放,以及整体的3D透视效果。希望这篇文章对你有所帮助,让你能够在自己的项目中实现类似的动画效果。
点个赞再走吧~