用HTML和CSS实现星球大战开场动画(新手入门)
在本文中,我们将通过HTML和CSS来实现一个经典的星球大战开场动画。这个动画效果类似于电影《星球大战》中经典的文字滚动效果。我们将使用CSS的3D变换和动画特性来实现这一效果。通过这个项目,你将学习到如何使用CSS的transform
、animation
、keyframes
等属性来创建复杂的动画效果。
1. HTML结构
首先,我们来看一下HTML结构。HTML部分非常简单,主要由一个包含star
和wars
两个图片的容器以及一个包含文字的byline
组成。
xml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>星球大战</title>
<link rel="stylesheet" type="text/css" href="./commont.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>
1.1 HTML5文档声明
<!DOCTYPE html>
是HTML5的文档类型声明,它告诉浏览器这是一个HTML5文档。HTML5是最新的HTML标准,它引入了许多新的元素和API,使得开发者能够更轻松地创建现代化的网页。
1.2 字符编码和视口设置
<meta charset="UTF-8">
指定了文档的字符编码为UTF-8,这是一种广泛使用的字符编码,支持几乎所有的字符和符号。
<meta name="viewport" content="width=device-width, initial-scale=1.0">
设置了视口的宽度为设备的宽度,并且初始缩放比例为1.0。这个设置对于响应式设计非常重要,它确保了页面在移动设备上能够正确显示。
1.3 页面标题和样式表
<title>
标签定义了页面的标题,它将显示在浏览器的标题栏或标签页上。
<link rel="stylesheet" type="text/css" href="./commont.css">
引入了外部的CSS样式表,我们将在这个样式表中定义所有的样式和动画效果。
1.4 页面内容
页面内容主要包含在一个div
容器中,这个容器的类名为starwars
。容器中包含了两张图片和一个标题。
star.svg
和wars.svg
是两张SVG格式的图片,分别代表"STAR"和"WARS"。byline
是一个包含多个span
元素的标题,每个span
元素包含一个字母,这些字母将分别进行动画效果。
2. CSS样式
接下来,我们来看一下CSS样式部分。CSS部分主要分为两个部分:重置样式和业务样式。
2.1 重置样式
重置样式是为了消除不同浏览器之间的默认样式差异,确保页面在所有浏览器中显示一致。我们使用了Eric Meyer的Reset CSS,并对它进行了一些扩展。
css
/* Eric Meyer's Reset CSS v2.0 - http://meyerweb.com/eric/tools/css/reset/ */
/* 扩展版本 */
/* 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;
}
2.2 业务样式
业务样式部分定义了页面的布局和动画效果。
css
/* 业务样式 */
html, body {
height: 100vh;
}
body {
background: #000 url('./images/bg.jpg');
}
.starwars {
perspective: 800px;
transform-style: preserve-3d;
height: 17em;
width: 34em;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
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%;
}
2.2.1 页面布局
html, body { height: 100vh; }
:设置页面高度为视口高度,确保页面占满整个屏幕。body { background: #000 url('./images/bg.jpg'); }
:设置页面背景为黑色,并添加背景图片。.starwars
:设置容器的宽度和高度,并使用绝对定位将其居中显示。perspective: 800px;
和transform-style: preserve-3d;
用于创建3D效果。
2.2.2 图片和文字样式
img { width: 100%; }
:设置图片宽度为100%,确保图片填满容器。.star, .wars, .byline { position: absolute; }
:将图片和文字设置为绝对定位,以便进行精确的布局。.star { top: -0.75em; }
:将star
图片向上移动。.wars { bottom: -0.5em; }
:将wars
图片向下移动。.byline
:设置文字的样式,包括颜色、字体大小、文本对齐方式等。
2.3 动画效果
动画效果是本文的重点,我们通过CSS的animation
和keyframes
属性来实现。
css
/* 动画 */
.star{
/* 动画名称 + keyframes 定义动作 */
animation: star 10s ease-out infinite ;
}
@keyframes star{
0%{
opacity: 0;
transform: scale(1.5) translateY(-0.75em);
}
20%{
opacity: 1;
}
89%{
opacity: 1;
transform: scale(1);
}
100%{
opacity: 0;
transform: translateZ(-1000em);
}
}
.wars{
/* 动画名称 + keyframes 定义动作 */
/*ease-out 有大变小减速 */
animation: wars 10s ease-out infinite ;
}
@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);
}
}
.byline{
/*linear 匀速 */
animation: byline 10s linear infinite ;
}
.byline span{
animation: span 10s linear infinite ;
}
.byline span{
/*inline-block 行内块元素 更好的控制这些文本的布局和样式*/
display: inline-block;
}
@keyframes byline{
0%{
transform: translateZ(5em);
}
100%{
transform: translateZ(0em);
}
}
@keyframes span{
0%,10%{
opacity: 0;
transform: rotateY(90deg);
}
30%{
opacity: 1;
}
70%,86%{
transform: rotateY(0);
opacity: 1;
}
95%,100%{
opacity: 0;
}
}
2.3.1 star
和wars
动画
animation: star 10s ease-out infinite;
:为star
图片应用star
动画,动画持续时间为10秒,使用ease-out
缓动函数,并且无限循环。@keyframes star
:定义了star
动画的关键帧。动画开始时,图片透明度为0,放大1.5倍并向上移动;20%时,图片完全显示;89%时,图片恢复原始大小;100%时,图片透明度再次变为0,并向远处移动。
wars
动画与star
动画类似,只是动画的细节略有不同。
2.3.2 byline
动画
animation: byline 10s linear infinite;
:为byline
文字应用byline
动画,动画持续时间为10秒,使用线性缓动函数,并且无限循环。@keyframes byline
:定义了byline
动画的关键帧。动画开始时,文字向远处移动;100%时,文字恢复到原始位置。
2.3.3 span
动画
animation: span 10s linear infinite;
:为byline
中的每个字母应用span
动画,动画持续时间为10秒,使用线性缓动函数,并且无限循环。@keyframes span
:定义了span
动画的关键帧。动画开始时,字母透明度为0,旋转90度;30%时,字母完全显示;70%到86%时,字母旋转回0度;95%到100%时,字母透明度再次变为0。
3. 总结
通过这个项目,我们学习了如何使用HTML和CSS来创建一个复杂的动画效果。我们使用了CSS的transform
、animation
、keyframes
等属性来实现3D变换和动画效果。我们还学习了如何使用重置样式来消除浏览器之间的默认样式差异,确保页面在所有浏览器中显示一致。
这个星球大战开场动画效果不仅展示了CSS的强大功能,还为我们提供了一个很好的学习案例。通过这个案例,我们可以更好地理解CSS动画的工作原理,并能够将这些知识应用到其他项目中。
希望这篇文章对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言!