在没有JavaScript的情况下创建强大的CSS动画效果 - Web前端
作者:98wpeu发布时间:2026-09-08分类:网页前端技术浏览:22
在本文中,我们将仅使用CSS探索WEB上的动画世界。我们将首先使用svg和css组合创建一个简单的动画。然后,我们将仅使用html和CSS创建另外两个动画。我们还将讨论何时需要将javascript付诸行动以及CSS的局限性。
到本文结尾,您将能够使用CSS来创建动画,从而支持使用JavaScript。您还可以识别何时需要使用Javascript创建动画。
为了充分利用本文,假定您至少具有CSS和HTML的核心知识。
绘画效果动画
这是令人印象深刻的动画,看似易于创建。下面是我们的目标的屏幕截图。
我们首先需要为徽标创建SVG:
<svg xmlns="http://www.w3.org/2000/svg" width="279.15" height="343.95" overflow="visible" stroke="#000" stroke-width="1"> <path d="M110.57 248.64c-22.7-21.25-45.06-42.09-67.31-63.06-11.73-11.06-23.32-22.26-34.87-33.51C-2.6 141.35-2.86 128 8.02 117.42 47.67 78.82 87.46 40.35 127.21 1.84c.46-.44 1.03-.77 2.47-1.84 12.52 13.66 25.06 27.34 37.1 40.47-4.44 4.76-10.06 11.31-16.21 17.33-22.69 22.2-45.56 44.22-68.34 66.32-7.89 7.66-7.97 13.48.11 21.07 19.38 18.19 38.85 36.29 58.37 54.33 7.53 6.96 7.75 12.42.32 19.64-10.01 9.72-20.05 19.4-30.46 29.48z"/> <path d="M150.02 343.95c-13.41-13.03-26.71-25.97-40.2-39.08 1.23-1.32 2.19-2.44 3.24-3.46 27.8-26.95 55.61-53.89 83.42-80.83 8.32-8.05 8.41-13.92-.01-21.79-19.54-18.27-39.14-36.47-58.77-54.63-6.52-6.04-6.76-12.11-.37-18.33 10.24-9.96 20.52-19.87 31.15-30.16 6.33 5.89 12.53 11.58 18.65 17.37 27.53 26.03 55.07 52.05 82.52 78.16 12.57 11.96 12.66 24.78.33 36.75-38.99 37.85-78.04 75.64-117.07 113.45-.82.79-1.71 1.51-2.89 2.55z"/> </svg>
这是设置了SVG的笔。随意分叉它,以便您可以按照以下步骤进行操作。
设置好SVG后,我们现在将设置fill-opacity为0。我们稍后将对此进行动画处理:
svg {
fill-opacity: 0;
}
现在,我们可以集中精力绘制SVG。我们将通过使用CSSstroke-dashoffset和stroke-dashArray属性来实现。
该stroke-dasharray属性控制用于使笔划成为路径的间隙和破折号的模式。例如,stroke-dasharray: 10将其应用于SVG中的路径会产生虚线效果,其笔划和间隙长度为十个像素:
<!DOCtype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>绘制</title>
<style>
svg {
fill-opacity: 0;
}
svg path {
stroke-dasharray: 10;
}
</style>
</head>
<body>
<svg xmlns="HTTP://www.w3.org/2000/svg" width="279.15" height="343.95" overflow="visible" stroke="#000" stroke-width="1">
<path d="M110.57 248.64c-22.7-21.25-45.06-42.09-67.31-63.06-11.73-11.06-23.32-22.26-34.87-33.51C-2.6 141.35-2.86 128 8.02 117.42 47.67 78.82 87.46 40.35 127.21 1.84c.46-.44 1.03-.77 2.47-1.84 12.52 13.66 25.06 27.34 37.1 40.47-4.44 4.76-10.06 11.31-16.21 17.33-22.69 22.2-45.56 44.22-68.34 66.32-7.89 7.66-7.97 13.48.11 21.07 19.38 18.19 38.85 36.29 58.37 54.33 7.53 6.96 7.75 12.42.32 19.64-10.01 9.72-20.05 19.4-30.46 29.48z"/>
<path d="M150.02 343.95c-13.41-13.03-26.71-25.97-40.2-39.08 1.23-1.32 2.19-2.44 3.24-3.46 27.8-26.95 55.61-53.89 83.42-80.83 8.32-8.05 8.41-13.92-.01-21.79-19.54-18.27-39.14-36.47-58.77-54.63-6.52-6.04-6.76-12.11-.37-18.33 10.24-9.96 20.52-19.87 31.15-30.16 6.33 5.89 12.53 11.58 18.65 17.37 27.53 26.03 55.07 52.05 82.52 78.16 12.57 11.96 12.66 24.78.33 36.75-38.99 37.85-78.04 75.64-117.07 113.45-.82.79-1.71 1.51-2.89 2.55z"/>
</svg>
</body>
</html>
现在,对于我们在此处创建的动画,我们希望间隙和破折号的长度与相同path。也就是说,徽标轮廓的整个长度可以被认为是“一个破折号”,并且间隙也将是轮廓的整个长度。这个想法是,我们将从徽标轮廓作为间隙开始,然后在轮廓中以破折号进行动画处理。
但是徽标的轮廓多长时间?解决此问题的一种简单方法是设置长度。让我们通过添加pathlength="1"到每个路径来编辑SVG代码:
… <path pathLength="1" d="M110.57 … > …
这使绘制动画更加容易。现在我们已经设置了pathLength,我们还stroke-dasharray可以1在CSS中将设置为:
svg path {
stroke-dasharray: 1;
}
现在,这里似乎没有任何变化,但这没关系。徽标各部分的整个路径现在只是一个很大的破折号。(您可以通过pathLength="1"从其中一条路径中删除来进行试验。它会突然变成1px虚线和间隙的虚线。)
现在stroke-dashoffset,我们可以使用,它指定我们应该开始到破折号模式的距离。在我们的例子中,我们要设置stroke-dashoffset到1,所以我们开始一个gap,而不是一个dash。由于每个间隙的长度都是的整个长度path,因此我们现在将看到一个空白屏幕:
svg path {
stroke-dasharray: 1;
stroke-dashoffset: 1;
}
现在,我们可以有生stroke-dashoffset回0,这将给绘图效果:
svg path {
stroke-dasharray: 1;
stroke-dashoffset: 1;
Animation: draw 2s forwards;
}
@keyframes draw {
from {
stroke-dashoffset: 1;
}
to {
stroke-dashoffset: 0;
}
}
有了这个,我们现在有了这个:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="vIEwport" content="width=device-width, initial-scale=1.0">
<title>document</title>
<style>
svg {
fill-opacity: 0;
}
svg path {
stroke-dasharray: 1;
stroke-dashoffset: 1;
animation: draw 2s forwards;
}
@keyframes draw {
from {
stroke-dashoffset: 1;
}
to {
stroke-dashoffset: 0;
}
}
</style>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" width="279.15" height="343.95" overflow="visible" stroke="#000" stroke-width="1">
<path pathLength="1" d="M110.57 248.64c-22.7-21.25-45.06-42.09-67.31-63.06-11.73-11.06-23.32-22.26-34.87-33.51C-2.6 141.35-2.86 128 8.02 117.42 47.67 78.82 87.46 40.35 127.21 1.84c.46-.44 1.03-.77 2.47-1.84 12.52 13.66 25.06 27.34 37.1 40.47-4.44 4.76-10.06 11.31-16.21 17.33-22.69 22.2-45.56 44.22-68.34 66.32-7.89 7.66-7.97 13.48.11 21.07 19.38 18.19 38.85 36.29 58.37 54.33 7.53 6.96 7.75 12.42.32 19.64-10.01 9.72-20.05 19.4-30.46 29.48z" />
<path pathLength="1" d="M150.02 343.95c-13.41-13.03-26.71-25.97-40.2-39.08 1.23-1.32 2.19-2.44 3.24-3.46 27.8-26.95 55.61-53.89 83.42-80.83 8.32-8.05 8.41-13.92-.01-21.79-19.54-18.27-39.14-36.47-58.77-54.63-6.52-6.04-6.76-12.11-.37-18.33 10.24-9.96 20.52-19.87 31.15-30.16 6.33 5.89 12.53 11.58 18.65 17.37 27.53 26.03 55.07 52.05 82.52 78.16 12.57 11.96 12.66 24.78.33 36.75-38.99 37.85-78.04 75.64-117.07 113.45-.82.79-1.71 1.51-2.89 2.55z" />
</svg>
</body>
</html>
要完成动画,我们只需要对我们的动画fill-opacity:
svg {
width: 40%;
fill-opacity: 0;
// we set a delay of 2s so it won't start until our drawing is finished
animation: fadeOpacity 2s forwards 2s;
}
@keyframes fadeOpacity {
from {
fill-opacity: 0;
}
to {
fill-opacity: 1;
}
}
现在,我们有了最终的动画:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
svg {
width: 40%;
fill-opacity: 0;
animation: fadeOpacity 2s forwards 2s;
}
svg path {
stroke-dasharray: 1;
stroke-dashoffset: 1;
animation: draw 2s forwards;
}
@keyframes draw {
from {
stroke-dashoffset: 1;
}
to {
stroke-dashoffset: 0;
}
}
@keyframes fadeOpacity {
from {
fill-opacity: 0;
}
to {
fill-opacity: 1;
}
}
</style>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" width="279.15" height="343.95" overflow="visible" stroke="#000" stroke-width="1">
<path pathLength="1" d="M110.57 248.64c-22.7-21.25-45.06-42.09-67.31-63.06-11.73-11.06-23.32-22.26-34.87-33.51C-2.6 141.35-2.86 128 8.02 117.42 47.67 78.82 87.46 40.35 127.21 1.84c.46-.44 1.03-.77 2.47-1.84 12.52 13.66 25.06 27.34 37.1 40.47-4.44 4.76-10.06 11.31-16.21 17.33-22.69 22.2-45.56 44.22-68.34 66.32-7.89 7.66-7.97 13.48.11 21.07 19.38 18.19 38.85 36.29 58.37 54.33 7.53 6.96 7.75 12.42.32 19.64-10.01 9.72-20.05 19.4-30.46 29.48z" />
<path pathLength="1" d="M150.02 343.95c-13.41-13.03-26.71-25.97-40.2-39.08 1.23-1.32 2.19-2.44 3.24-3.46 27.8-26.95 55.61-53.89 83.42-80.83 8.32-8.05 8.41-13.92-.01-21.79-19.54-18.27-39.14-36.47-58.77-54.63-6.52-6.04-6.76-12.11-.37-18.33 10.24-9.96 20.52-19.87 31.15-30.16 6.33 5.89 12.53 11.58 18.65 17.37 27.53 26.03 55.07 52.05 82.52 78.16 12.57 11.96 12.66 24.78.33 36.75-38.99 37.85-78.04 75.64-117.07 113.45-.82.79-1.71 1.51-2.89 2.55z" />
</svg>
</body>
</html>
我敢打赌,这比您想象的要容易得多!我知道stroke-dashoffset和stroke-dasharray属性可能会有些混乱,但是当您将path长度设置为时1,使用它们会容易得多。
这是CSS与SVG结合的强大功能的简单示例。现在,让我们在下一个示例中进一步进行介绍。
CSS蜡烛动画
因此,在最后一个示例中,我们使用SVG时有点作弊。在下一个示例中,我们将仅使用CSS(当然还有HTML)。
通过此动画,我们将使用一些基本的CSS绘图。然后,我们将使用CSS创建触发事件。最后,我们将模拟火焰(尽我们所能!)。
相关推荐
- Windows 7:支持终止期限后的一年,数百万用户选择不升级 - Web前端
- 数据库:温故JSON语法规则的应用知识 - Web前端
- 如何执行Windows 10的全新安装:哪个选项最适合您? - Web前端
- FLEXBOX布局:使用弹性盒子进行高级布局 - Web前端
- 深入了解语句try...catch的基础知识和应用 - Web前端
- 【Nuxt.js扩展Vue】Vue应用程序使用Nuxt.js可以避免的7个问题 - Web前端
- JavaScript对象入门:JavaScript中的继承 - Web前端
- JavaScript标准内置对象:Float32Array的基础知识和应用 - Web前端
- JavaScript标准内置对象:Object【构造函数创建一个对象包装器】 - Web前端
- 扎克伯格宣布无限期禁止特朗普的Facebook,Instagram帐户 - Web前端
- 网页前端技术排行
-
- 1[Web前端]用javascript实现默认图片替代未显示的图片 - Web前端
- 2分析Iconfont-阿里巴巴矢量常用图标库 - Web前端
- 3jQuery实例教程:制作网页中可折叠的面板 - Web前端
- 4【第六章】Foundation之按钮和下拉功能 - Web前端
- 5基于jquery的滚动条滚动固定div(附演示下载) - Web前端
- 6jQuery编写widget的一些技巧分享 - Web前端
- 7分享精心挑选的12款优秀jQuery Ajax分页插件和教程 - Web前端
- 8jQuery实现鼠标移到元素上动态提示消息框效果 - Web前端
- 9在Mac/PC上远程调试iPhone/iPad上的网页 - Web前端
- 最近发表
-
- WordPress随机显示特色图片插件:Random Post Thumbnails
- KeePass实现Chrome浏览器自动填充密码方法一
- LNMP一键包nginx 301强制跳转到https教程
- KeePass实现Chrome浏览器自动填充密码方法二
- #建站# 免费的VPS管理软件Xshell8/Xftp8中文版下载
- 使用Xshell 8连接VPS教程_电脑登录vps的方法
- WordPress评论界面添加烟花????效果
- 不同浏览器书签同步方案:坚果云+Floccus_详细使用教程
- iOS端KeePassXC客户端APP:Strongbox Password Safe
- 给WordPress评论中的Gravatar头像图片添加ALT属性


