用HTML和CSS实现星球大战开场动画(新手入门)

用HTML和CSS实现星球大战开场动画(新手入门)

在本文中,我们将通过HTML和CSS来实现一个经典的星球大战开场动画。这个动画效果类似于电影《星球大战》中经典的文字滚动效果。我们将使用CSS的3D变换和动画特性来实现这一效果。通过这个项目,你将学习到如何使用CSS的transformanimationkeyframes等属性来创建复杂的动画效果。

1. HTML结构

首先,我们来看一下HTML结构。HTML部分非常简单,主要由一个包含starwars两个图片的容器以及一个包含文字的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.svgwars.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的animationkeyframes属性来实现。

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 starwars动画
  • 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的transformanimationkeyframes等属性来实现3D变换和动画效果。我们还学习了如何使用重置样式来消除浏览器之间的默认样式差异,确保页面在所有浏览器中显示一致。

这个星球大战开场动画效果不仅展示了CSS的强大功能,还为我们提供了一个很好的学习案例。通过这个案例,我们可以更好地理解CSS动画的工作原理,并能够将这些知识应用到其他项目中。

希望这篇文章对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言!

相关推荐
卖报的小行家_几秒前
Vue3源码,拦截对象,对比Vue2
前端
蒜香拿铁3 分钟前
vue3自动导入组合式api
前端·javascript
日升4 分钟前
Chrome 134 版本开发者工具(DevTools)更新内容
前端·chrome·浏览器
Mike_jia5 分钟前
一篇文章带你了解一款强大的本地镜像库系统---Harbor
前端
_一条咸鱼_5 分钟前
Vue 框架组件模块之弹窗组件深度剖析(四)
前端
某哈压力大6 分钟前
制作一个简单的水印组件
前端·vue.js
小old弟7 分钟前
Git简明指南:从入门到基本操作
前端·git
Cutey9167 分钟前
解决在 UniApp 中,deep不生效的问题
前端·javascript·面试
阿丽塔~7 分钟前
React.memo()和 useMemo()的用法是什么,有哪些区别
前端·javascript·react.js
光阴独白8 分钟前
Apple Login for JavaScript
前端·apple