本文将详细介绍如何使用纯CSS实现一个星空动画效果,从基础概念到具体实现步骤,帮助读者掌握这一技术。
CSS3 引入了 @keyframes 规则,允许我们创建自定义动画。通过定义关键帧(keyframes),我们可以控制元素在不同时间点的状态变化。基本语法如下:
- @keyframes animation-name {
- from { /* 起始状态 */ }
- to { /* 结束状态 */ }
- }
或者更详细的:
- @keyframes animation-name {
- 0% { /* 起始状态 */ }
- 50% { /* 中间状态 */ }
- 100% { /* 结束状态 */ }
- }
CSS3 还引入了 3D 变换功能,通过 transform 属性可以实现元素在三维空间中的旋转、缩放和平移。常用的 3D 变换属性包括:
为了确保子元素在 3D 空间中正确显示,需要设置 transform-style: preserve-3d。
首先,我们需要定义 HTML 结构。本文的示例中,我们将创建多个 div 元素来模拟星空中的星星和行星。HTML 结构如下:
- <!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>星空动画效果</title>
- <link rel="stylesheet" href="css/reset.css">
- <link rel="stylesheet" href="css/星空.css">
- </head>
- <body>
- <div class="box"></div>
- <div class="huabu">
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- </div>
- <div class="box2"></div>
- <div class="huabu2">
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- </div>
- <div class="box3"></div>
- <div class="huabu3">
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- </div>
- </body>
- </html>
接下来,我们定义 CSS 样式来实现星空动画效果。以下是完整的 CSS 代码:
- /* 重置样式 */
- html, body, h1, h2, h3, h4, h5, h6, div, ul, ol, li, dl, dt, dd, p {
- margin: 0;
- padding: 0;
- }
- ul, ol, li {
- list-style: none;
- }
- a {
- text-decoration: none;
- color: #333;
- }
- img, input, select, iframe, select {
- vertical-align: middle;
- }
- .fl {
- float: left;
- }
- .fr {
- float: right;
- }
- .clear::after {
- content: "";
- display: block;
- clear: both;
- }
- input, select, textarea {
- outline: none;
- border: none;
- }
-
- /* 背景设置 */
- body {
- background: url(../img/xk.jpg);
- background-size: cover;
- }
-
- /* 星空背景 */
- .huabu {
- width: 800px;
- height: 450px;
- margin: 100px auto;
- transform-style: preserve-3d;
- transform: rotateZ(30deg);
- animation: cc 1.5s infinite linear;
- }
-
- /* 星星样式 */
- .huabu > div {
- width: 100px;
- height: 100px;
- position: absolute;
- left: 0;
- top: 34px;
- border-radius: 50%;
- border: solid aqua;
- box-shadow: 0px 0px 10px 8px aquamarine;
- }
-
- /* 旋转星星 */
- .huabu > div:nth-child(2) {
- transform: rotateX(30deg);
- }
- .huabu > div:nth-child(3) {
- transform: rotateX(60deg);
- }
- .huabu > div:nth-child(4) {
- transform: rotateX(90deg);
- }
- .huabu > div:nth-child(5) {
- transform: rotateX(120deg);
- }
- .huabu > div:nth-child(6) {
- transform: rotateX(150deg);
- }
- .huabu > div:nth-child(7) {
- transform: rotateX(180deg);
- }
- .huabu > div:nth-child(8) {
- transform: rotateY(30deg);
- }
- .huabu > div:nth-child(9) {
- transform: rotateY(60deg);
- }
- .huabu > div:nth-child(10) {
- transform: rotateY(90deg);
- }
- .huabu > div:nth-child(11) {
- transform: rotateY(120deg);
- }
- .huabu > div:nth-child(12) {
- transform: rotateY(150deg);
- }
- .huabu > div:nth-child(13) {
- transform: rotateY(180deg);
- }
-
- /* 第二个星空背景 */
- .huabu2 {
- width: 900px;
- height: 400px;
- position: absolute;
- left: 362px;
- top: 104px;
- transform-style: preserve-3d;
- animation: cc1 3s infinite linear;
- transform: rotateX(60deg);
- }
-
- /* 第二个星空的星星样式 */
- .huabu2 > div {
- width: 100px;
- height: 100px;
- position: absolute;
- left: 0;
- top: 125px;
- border-radius: 50%;
- border: solid rgba(23, 17, 214, 0.803);
- box-shadow: 0px 0px 10px 8px blue;
- }
-
- /* 旋转第二个星空的星星 */
- .huabu2 > div:nth-child(2) {
- transform: rotateX(30deg);
- }
- .huabu2 > div:nth-child(3) {
- transform: rotateX(60deg);
- }
- .huabu2 > div:nth-child(4) {
- transform: rotateX(90deg);
- }
- .huabu2 > div:nth-child(5) {
- transform: rotateX(120deg);
- }
- .huabu2 > div:nth-child(6) {
- transform: rotateX(150deg);
- }
- .huabu2 > div:nth-child(7) {
- transform: rotateX(180deg);
- }
- .huabu2 > div:nth-child(8) {
- transform: rotateY(30deg);
- }
- .huabu2 > div:nth-child(9) {
- transform: rotateY(60deg);
- }
- .huabu2 > div:nth-child(10) {
- transform: rotateY(90deg);
- }
- .huabu2 > div:nth-child(11) {
- transform: rotateY(120deg);
- }
- .huabu2 > div:nth-child(12) {
- transform: rotateY(150deg);
- }
- .huabu2 > div:nth-child(13) {
- transform: rotateY(180deg);
- }
-
- /* 第三个星空背景 */
- .huabu3 {
- width: 350px;
- height: 350px;
- position: absolute;
- left: 600px;
- top: 180px;
- transform-style: preserve-3d;
- animation: cc2 3s infinite linear;
- }
-
- /* 第三个星空的星星样式 */
- .huabu3 > div {
- width: 200px;
- height: 200px;
- position: absolute;
- left: 0;
- top: 0;
- right: 0;
- bottom: 0;
- margin: auto;
- border-radius: 50%;
- border: solid rgb(232, 143, 19);
- box-shadow: 0px 0px 10px 8px orange;
- }
-
- /* 旋转第三个星空的星星 */
- .huabu3 > div:nth-child(2) {
- transform: rotateX(30deg);
- }
- .huabu3 > div:nth-child(3) {
- transform: rotateX(60deg);
- }
- .huabu3 > div:nth-child(4) {
- transform: rotateX(90deg);
- }
- .huabu3 > div:nth-child(5) {
- transform: rotateX(120deg);
- }
- .huabu3 > div:nth-child(6) {
- transform: rotateX(150deg);
- }
- .huabu3 > div:nth-child(7) {
- transform: rotateX(180deg);
- }
- .huabu3 > div:nth-child(8) {
- transform: rotateY(30deg);
- }
- .huabu3 > div:nth-child(9) {
- transform: rotateY(60deg);
- }
- .huabu3 > div:nth-child(10) {
- transform: rotateY(90deg);
- }
- .huabu3 > div:nth-child(11) {
- transform: rotateY(120deg);
- }
- .huabu3 > div:nth-child(12) {
- transform: rotateY(150deg);
- }
- .huabu3 > div:nth-child(13) {
- transform: rotateY(180deg);
- }
-
- /* 盒子样式 */
- .box {
- width: 800px;
- height: 450px;
- border: solid white 10px;
- margin: 100px auto;
- transform-style: preserve-3d;
- position: absolute;
- left: 350px;
- top: 14px;
- transform: rotateX(300deg) rotateZ(40deg) rotateY(340deg);
- border-radius: 50%;
- box-shadow: 0px 0px 20px 20px aqua;
- }
-
- .box2 {
- width: 800px;
- height: 400px;
- border: solid white 10px;
- margin: 100px auto;
- transform-style: preserve-3d;
- position: absolute;
- left: 394px;
- top: 4px;
- transform: rotateX(0deg) rotateZ(0deg) rotateY(0deg);
- border-radius: 50%;
- box-shadow: 0px 0px 20px 20px aqua;
- }
-
- /* 动画定义 */
- @keyframes cc {
- 0% {
- transform: rotateX(-60deg) rotateY(-30deg);
- }
- 100% {
- transform: rotateX(-60deg) rotateY(-30deg) rotateZ(360deg);
- }
- }
-
- @keyframes cc1 {
- 0% {
- transform: rotateX(60deg) rotateZ(0deg);
- }
- 100% {
- transform: rotateX(60deg) rotateZ(360deg);
- }
- }
-
- @keyframes cc2 {
- 0% {
- transform: rotateZ(0) rotateX(0);
- }
- 100% {
- transform: rotateZ(360deg) rotateX(360deg);
- }
- }
- body {
- background: url(../img/xk.jpg);
- background-size: cover;
- }
这段代码设置了页面的背景图像,并使用 background-size: cover 使背景图像覆盖整个页面。
- .huabu {
- width: 800px;
- height: 450px;
- margin: 100px auto;
- transform-style: preserve-3d;
- transform: rotateZ(30deg);
- animation: cc 1.5s infinite linear;
- }
.huabu 类定义了一个宽 800px、高 450px 的容器,居中显示,并应用了 3D 变换风格 transform-style: preserve-3d。同时,它还应用了一个名为 cc 的动画,持续时间为 1.5 秒,无限循环,线性过渡。
- .huabu > div {
- width: 100px;
- height: 100px;
- position: absolute;
- left: 0;
- top: 34px;
- border-radius: 50%;
- border: solid aqua;
- box-shadow: 0px 0px 10px 8px aquamarine;
- }
每个 .huabu 容器内的 div 元素代表一个星星。它们的宽度和高度均为 100px,绝对定位,圆形边框,带有蓝色边框和阴影效果。
- .huabu > div:nth-child(2) {
- transform: rotateX(30deg);
- }
通过 nth-child 选择器,我们为每个星星应用不同的 3D 旋转效果,使其在空间中形成不同的位置和角度。
- .huabu2 {
- width: 900px;
- height: 400px;
- position: absolute;
- left: 362px;
- top: 104px;
- transform-style: preserve-3d;
- animation: cc1 3s infinite linear;
- transform: rotateX(60deg);
- }
.huabu2 类定义了第二个星空背景,其大小和位置与第一个不同,并应用了不同的动画 cc1 和初始旋转角度。
- .huabu2 > div {
- width: 100px;
- height: 100px;
- position: absolute;
- left: 0;
- top: 125px;
- border-radius: 50%;
- border: solid rgba(23, 17, 214, 0.803);
- box-shadow: 0px 0px 10px 8px blue;
- }
每个 .huabu2 容器内的 div 元素代表第二个星空中的星星。这些星星的宽度和高度均为 100px,绝对定位,圆形边框,带有紫色边框和蓝色阴影效果。
- .huabu2 > div:nth-child(2) {
- transform: rotateX(30deg);
- }
- .huabu2 > div:nth-child(3) {
- transform: rotateX(60deg);
- }
- .huabu2 > div:nth-child(4) {
- transform: rotateX(90deg);
- }
- .huabu2 > div:nth-child(5) {
- transform: rotateX(120deg);
- }
- .huabu2 > div:nth-child(6) {
- transform: rotateX(150deg);
- }
- .huabu2 > div:nth-child(7) {
- transform: rotateX(180deg);
- }
- .huabu2 > div:nth-child(8) {
- transform: rotateY(30deg);
- }
- .huabu2 > div:nth-child(9) {
- transform: rotateY(60deg);
- }
- .huabu2 > div:nth-child(10) {
- transform: rotateY(90deg);
- }
- .huabu2 > div:nth-child(11) {
- transform: rotateY(120deg);
- }
- .huabu2 > div:nth-child(12) {
- transform: rotateY(150deg);
- }
- .huabu2 > div:nth-child(13) {
- transform: rotateY(180deg);
- }
通过 nth-child 选择器,为第二个星空中的每个星星应用不同的 3D 旋转效果,使其在空间中形成不同的位置和角度。
- .huabu3 {
- width: 350px;
- height: 350px;
- position: absolute;
- left: 600px;
- top: 180px;
- transform-style: preserve-3d;
- animation: cc2 3s infinite linear;
- }
.huabu3 类定义了第三个星空背景,其大小和位置与前两个不同,并应用了不同的动画 cc2 和初始旋转角度。
- .huabu3 > div {
- width: 200px;
- height: 200px;
- position: absolute;
- left: 0;
- top: 0;
- right: 0;
- bottom: 0;
- margin: auto;
- border-radius: 50%;
- border: solid rgb(232, 143, 19);
- box-shadow: 0px 0px 10px 8px orange;
- }
每个 .huabu3 容器内的 div 元素代表第三个星空中的星星。这些星星的宽度和高度均为 200px,绝对定位,圆形边框,带有橙色边框和橙色阴影效果。
- .huabu3 > div:nth-child(2) {
- transform: rotateX(30deg);
- }
- .huabu3 > div:nth-child(3) {
- transform: rotateX(60deg);
- }
- .huabu3 > div:nth-child(4) {
- transform: rotateX(90deg);
- }
- .huabu3 > div:nth-child(5) {
- transform: rotateX(120deg);
- }
- .huabu3 > div:nth-child(6) {
- transform: rotateX(150deg);
- }
- .huabu3 > div:nth-child(7) {
- transform: rotateX(180deg);
- }
- .huabu3 > div:nth-child(8) {
- transform: rotateY(30deg);
- }
- .huabu3 > div:nth-child(9) {
- transform: rotateY(60deg);
- }
- .huabu3 > div:nth-child(10) {
- transform: rotateY(90deg);
- }
- .huabu3 > div:nth-child(11) {
- transform: rotateY(120deg);
- }
- .huabu3 > div:nth-child(12) {
- transform: rotateY(150deg);
- }
- .huabu3 > div:nth-child(13) {
- transform: rotateY(180deg);
- }
通过 nth-child 选择器,为第三个星空中的每个星星应用不同的 3D 旋转效果,使其在空间中形成不同的位置和角度。
- .box {
- width: 800px;
- height: 450px;
- border: solid white 10px;
- margin: 100px auto;
- transform-style: preserve-3d;
- position: absolute;
- left: 350px;
- top: 14px;
- transform: rotateX(300deg) rotateZ(40deg) rotateY(340deg);
- border-radius: 50%;
- box-shadow: 0px 0px 20px 20px aqua;
- }
-
- .box2 {
- width: 800px;
- height: 400px;
- border: solid white 10px;
- margin: 100px auto;
- transform-style: preserve-3d;
- position: absolute;
- left: 394px;
- top: 4px;
- transform: rotateX(0deg) rotateZ(0deg) rotateY(0deg);
- border-radius: 50%;
- box-shadow: 0px 0px 20px 20px aqua;
- }
.box 和 .box2 类定义了两个白色的圆形盒子,分别应用了不同的 3D 旋转效果和位置,增强了星空动画的效果。
- @keyframes cc {
- 0% {
- transform: rotateX(-60deg) rotateY(-30deg);
- }
- 100% {
- transform: rotateX(-60deg) rotateY(-30deg) rotateZ(360deg);
- }
- }
-
- @keyframes cc1 {
- 0% {
- transform: rotateX(60deg) rotateZ(0deg);
- }
- 100% {
- transform: rotateX(60deg) rotateZ(360deg);
- }
- }
-
- @keyframes cc2 {
- 0% {
- transform: rotateZ(0) rotateX(0);
- }
- 100% {
- transform: rotateZ(360deg) rotateX(360deg);
- }
- }
这三个 @keyframes 规则定义了不同的动画效果,分别为 cc、cc1 和 cc2。每个动画通过改变 transform 属性的值,实现了元素在三维空间中的旋转效果。
通过上述步骤,我们使用纯 CSS 实现了一个复杂的星空动画效果。通过定义多个 div 元素模拟星星和行星,并使用 transform 和 animation 属性实现 3D 旋转和动画效果,最终呈现了一个动态且美观的星空场景。