SVG+CSS动画实现动效(流光、呼吸等效果)

news2024/11/17 21:29:44

流光效果


  • 绘制流光线条
    创建SVG,根据UI给的背景图,定位到图上每条管道(即流光线条的路径)的起始点以及拐点,绘制折线。绘制折线的时候按照下图方框通过class分组,这几组的光线流动是同时出发的。
    svg相关知识点:https://www.w3school.com.cn/svg/index.asp
<svg width="100%" height="100%" class="added-wrap_svg" :class="{toPause: pause}">
    // 线条光晕
    <filter id="filter1" x="-120%" y="-120%" width="400%" height="400%">
      <feOffset result="offOut" in="SourceGraphic" dx="0" dy="0"></feOffset>
      <feGaussianBlur result="blurOut" in="offOut" stdDeviation="6"></feGaussianBlur>
      <feBlend in="SourceGraphic" in2="blurOut" mode="multiply"></feBlend>
    </filter>

    // 绘制折线
    <polyline class="cleanToMarket" points="1233,976 1239,983 1267,983"/>
    <polyline class="cleanToMarket" points="1233,992 1239,999 1274,999"/>
    <polyline class="cleanToMarket" points="1226,1010 1284,1010"/>
    <polyline class="cleanToMarket" points="1233,1028 1239,1022 1274,1022"/>
    <polyline class="cleanToMarket" points="1232,1045 1239,1039 1267,1039"/>
</svg>

折线样式

polyline{
  stroke: #E5DA40;
  fill: transparent;
  stroke-width: 2;
  stroke-linecap: round;
  animation: act 3s linear infinite;
}
  • 让光线动起来
    上边画出来的是一整条长的实线,接下来我们会用到SVG的两个属性:stoke-dasharray和stroke-dashoffset。

stoke-dasharray:用于创建虚线。
stroke-dasharray = ‘10’
stroke-dasharray = ‘10, 5’
stroke-dasharray = ‘20, 10, 5’
在这里插入图片描述
stroke-dasharray为一个参数时: 其实是表示虚线长度和每段虚线之间的间距,
如:stroke-dasharray = ‘10’ 表示:虚线长10,间距10,然后重复虚线长10,间距10
两个参数或者多个参数时:一个表示长度,一个表示间距,
如:stroke-dasharray = ‘10, 5’ 表示:虚线长10,间距5,然后重复虚线长10,间距5;
如:stroke-dasharray = ‘20, 10, 5’ 表示:虚线长20,间距10,虚线长5,接着是间距20,虚线10,间距5,之后开始如此循环

stroke-dashoffset:这个属性是相对于起始点的偏移,正数偏移x值的时候,相当于往左移动了x个长度单位,负数偏移x的时候,相当于往右移动了x个长度单位。

感兴趣的可以参考https://www.cnblogs.com/daisygogogo/p/11044353.html

这里相当于一条管道上,只有一段虚线,然后让这条虚线从左至右移动起来。
首先获取到所有的折线

var char = 'http://www.w3.org/2000/svg'
var polylines = document.getElementsByTagNameNS(char, 'polyline')

每条折线,获取到折线的长度,设置虚线,如第一组,设置虚线长80,间距为该条折线的长度,将偏移量设置为80px,虚线就会往左移动80px,这样初始时相当于虚线隐藏了。

然后,设置虚线移动动画,即设置偏移量为折线的长度。

这样,流光效果就出来了。

polylines.forEach((i, index) => {
      // 获取折线长度
      const len = i.getTotalLength()
      // 设置滤镜
      i.style.filter = 'url(#filter1)'
      // 设置虚线和间隔
      i.style.strokeDasharray = '80,' + len
      // 设置偏移量
      i.style.strokeDashoffset = 80
      // 设置动画名称
      i.style.animationName = 'act' + index

      var style = document.styleSheets[0]
      // 插入动画规则
      style.insertRule('@Keyframes act' + index + '{100% {stroke-dashoffset: ' + (-(len)) + '}}', 1)

      if (i.classList[0] === 'cleanToMarket') {
        i.style.strokeDasharray = '20,' + len
        i.style.strokeDashoffset = 20
        i.style.strokeWidth = 1
        // 动画延迟
        i.style.animationDelay = '3s'
      }
      if (i.classList[0] === 'marketToEmpowerment') {
        i.style.strokeDasharray = '30,' + len
        i.style.strokeDashoffset = 30
        i.style.strokeWidth = 1
        i.style.animationDelay = '6s'
      }
      if (i.classList[0] === 'operatioCcenter') {
        i.style.animationDelay = '9s'
      }
      if (i.classList[0] === 'empowermentToLib') {
        i.style.strokeDasharray = '60,' + len
        i.style.strokeDashoffset = 60
        i.style.strokeWidth = 1
        i.style.animationDelay = '9s'
      }
      if (i.classList[0] === 'libToEmpowerment') {
        i.style.strokeDasharray = '60,' + len
        i.style.strokeDashoffset = 60
        i.style.strokeWidth = 1
        i.style.animationDelay = '12s'
      }
      if (i.classList[0] === 'libToService') {
        i.style.animationDelay = '12s'
      }
      if (i.classList[0] === 'serviceToApply') {
        i.style.animationDelay = '15s'
      }
 })

上下浮动


@keyframes float{
  0%{transform:translateY(0)}
  50%{transform:translateY(6px)}
  100%{transform:translateY(0)}
}

忽闪


@keyframes dataMarket {  0% {    opacity: 1;  }  50% {    opacity: 0;  }  100% {    opacity: 1;  }}

发光


@keyframes showBlur{
  0% {
    filter: blur(0px);
  }
  50% {
    filter: blur(50px);
  }
  100% {
    filter: blur(0px);
  }
}

动画暂停


animation-play-state: paused

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大学生期末大作业】HTML+CSS+JavaScript — 模仿博客网站设计(Web)

你为什么不亲自下船&#xff0c; 就一次也好啊&#xff0c; 亲眼去看看这个世界。 目录 你为什么不亲自下船&#xff0c; 就一次也好啊&#xff0c; 亲眼去看看这个世界。 关于HTML5&#xff1a; 关于CSS&#xff1a; 关于JavaScript&#xff1a; 一、&#x1f30e;前言…

牛客前端刷题(四)——微信小程序篇

还在担心面试不通过吗?给大家推荐一个超级好用的刷面试题神器:牛客网,里面涵盖了各个领域的面试题库,还有大厂真题哦! 赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏…

Vue 使用 Vue-socket.io 实现即时聊天应用(Vue3连接原理分析)

目录 前言&#xff1a; 一、新建 Vue3 项目 二、下载相关依赖 2.1 后台服务 2.2 前端连接 2.3 启动项目 2.4 触发与接收事件 2.5 原因分析 三、vue3 使用socket的原理 3.1 socket对象实例 3.2 socket 触发事件 3.3 socket对象监听原生事件 3.4 vue-socket.io 源码解析 …

宝塔面板安装部署Vue项目,Vue项目从打包到上线

前期准备 1.宝塔面板已经成功安装到服务器 2.vue项目已经成功开发完成 开始 在宝塔面板中选择PHP项目添加站点&#xff0c;站点PHP版本设置为纯静态&#xff0c;输入域名或者IP 这是后你会获得一个网站文件目录 点击根目录进入目录后&#xff0c;若你的Vue项目么有打包好需…

可视化大屏的几种屏幕适配方案,总有一种是你需要的

假设我们正在开发一个可视化拖拽的搭建平台&#xff0c;可以拖拽生成工作台或可视化大屏&#xff0c;或者直接就是开发一个大屏&#xff0c;首先必须要考虑的一个问题就是页面如何适应屏幕&#xff0c;因为我们在搭建或开发时一般都会基于一个固定的宽高&#xff0c;但是实际的…

海康摄像头web无插件3.2,vue开发,Nginx代理IIS服务器

在vue中实现海康摄像头播放&#xff0c;采用海康web无插件3.2开发包&#xff0c;采用Nginx代理IIS服务器实现&#xff1b; 1 摄像头要求&#xff0c;支持websocket 2 Nginx反向代理的结构 3 vue前端显示视频流代码 参考地址&#xff1a; https://blog.csdn.net/Vslong/artic…

【Vue全家桶】新一代的状态管理--Pinia

&#x1f373;作者&#xff1a;贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 &#xff0c;一名很普通但不想普通的程序媛}贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛&#x1f933; &#x1f64a;语录&#xff1a;多一些不为什么的…

【微信小程序】一文带你了解数据绑定、事件绑定以及事件传参、数据同步

&#x1f41a;作者简介&#xff1a;苏凉&#xff08;专注于网络爬虫&#xff0c;数据分析&#xff0c;正在学习前端的路上&#xff09; &#x1f433;博客主页&#xff1a;苏凉.py的博客 &#x1f310;系列专栏&#xff1a;小程序开发基础教程 &#x1f451;名言警句&#xff1…

项目完成后的打包流程(超级详细)

* 打包&#xff1a; * 将多个文件压缩合并成一个文件 * 语法降级 * less sass ts 语法解析, 解析成css * .... * 打包后&#xff0c;可以生成&#xff0c;浏览器能够直接运行的网页 > 就是需要上线的源码&#xff01; 最简单的打包流程&#xff1a; 首先我们项目…

vue项目实现前端预览word和pdf格式文件

最近做vue项目遇到一个需求&#xff0c;就是前端实现上传word或pdf文件后&#xff0c;后端返回文件对应的文件流&#xff0c;前端需要在页面上展示出来。word预览简单一些&#xff0c;pdf预览我试过pdfjs,vue-pdf总是报各种奇奇怪怪的bug,但最终总算解决了问题&#xff0c;先看…

HttpServletResponse 类

a)HttpServletResponse 类的作用 HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来&#xff0c;Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息&#xff0c;HttpServletResponse 表示所有响应…

解决TypeError: Cannot read properties of null (reading ‘xxx‘)的错误

文章目录1. 文章目录2. 分析问题3. 解决错误4. 问题总结1. 文章目录 今天测试小姐姐&#xff0c;在测试某页面时&#xff0c;报出如下图的错误&#xff1a; TypeError: Cannot read properties of null (reading type)at w (http://...xxx.../assets/index.a9f96e7f.js:1052:19…

前端基础,超全html常用标签大汇总

<html></html>标签&#xff0c;整个html文件都会放在html标签里面 <head></head>标签&#xff0c;表示网页的头部信息&#xff0c;一般是为浏览器提供对应的网站需要的相关信息&#xff0c;浏览器中是不会显示的&#xff1b;比如&#xff1a;标题titl…

vue中PC端使用高德地图 -- 实现搜索定位、地址标记、弹窗显示定位详情

PC端高德地图使用步骤&#xff1a; 1、注册并登录高德开放平台获取 2、安装高德依赖&#xff08;amap-jsapi-loader&#xff09; 3、初始化地图 4、首次打开地图获取当前定位并标记 5、根据已有地址自动定位到指定地址并标记 6、新增、清除标记及自定义信息窗体 7、鼠标点击地…

iframe嵌套其它网站页面及相关知识点详解

在开发过程中会遇到需要 在一个页面中嵌套另外一个页面&#xff0c;就要使用到框架 标签&#xff0c;然后指定src就可以了。 基本语法&#xff1a; <iframe src"需要展示的网站页面的URL"></iframe>用法举例&#xff1a; <!DOCTYPE html> <h…

css ::before ::after 添加伪元素不生效

需求&#xff1a;想用伪元素来写蓝色小标 HTML结构&#xff1a; <div> <span class"course-configname">教程配置</span> </div> 1.一开始这样写&#xff1a;&#xff08;不生效&#xff09; .course-configname::before{content: ;width…

vue3.0-axios拦截器、proxy跨域代理

目录 1. vue-cli 1&#xff09;vue-cli 2&#xff09;安装vue-cli ①解决Windows PowerShell不识别vue命令的问题 3&#xff09;创建项目 4&#xff09;基于vue ui创建vue项目 5&#xff09;基于命令行创建vue项目 2. 组件库 1&#xff09;vue组件库 2&#xff09;v…

Three.js - 透视相机(PerspectiveCamera)(三)

简介 在three.js中&#xff0c;摄像机的作用就是不断的拍摄我们创建好的场景&#xff0c;然后通过渲染器渲染到屏幕中。想通过不同的角度观看场景&#xff0c;就需要修改摄像机的位置来拍摄场景。本文详细介绍的是透视相机&#xff08;PerspectiveCamera&#xff09; 它是用来…

React Hooks(钩子函数)

React Hooks什么是Hooks?UseState()useReducer()useContext()useEffect()useRef()自定义钩子函数React Hooks中可以对性能进行优化的函数useMemo()useCallback()useMemo()和useCallback()的区别什么是Hooks? 首先&#xff1a;React的组件创建方式&#xff0c;一种是类组件&a…

划水日常(16.5)关于出版图书有偿征集书名 ~

关于摸鱼日常已经断更两个月了&#xff0c;前段时间一直忙在项目上&#xff0c;再加上搭了个网站&#xff0c;你要说有事儿吧&#xff0c;其实事儿也不多。你要说没事儿吧&#xff0c;我就是不更。原因其实很简单&#xff0c;我懒&#xff01; 可直接跳过目录一&#xff0c;直至…