svg动画图形绘制

news2024/12/26 3:09:30

先介绍下绘制图形的标签

1:线段:line
2:矩形:rect
3: 圆形:circle
4:多边形:polyline(不会自动连接起点和终点)
5: 多边形:polygon (会自动连接起点和终点)

viewBox 的后2值和svg的宽高设置一致即可 viewBox:‘0 0 width height’

具体原因:看我其他关于他的讲解

1:线段:line案例

line的属性讲解:

1: x1,y1指的是第一个坐标点
2:x2,y2指的是 第二个坐标点
(二个坐标点连接为一条直线)
3: stroke-width:线段的宽度
4:stroke:线段的颜色

<template> 
    <div class="container">
      <svg width="100" height="100" viewBox="0 0 100 100">
        <line
          x1="0"
          y1="10"
          x2="100"
          y2="10"
          stroke-width="2"
          stroke="blue"
        ></line>
      </svg>
    </div> 
</template>
<script>
export default {
  name: "SvgAnimation",
};
</script>
<script setup></script>

<style lang="scss" scoped>
.container {
  margin-top: 30px;
  text-align: center;
  svg {
    border: 1px solid red;
  }
}
</style>

在这里插入图片描述
2:矩形:rect

rect的属性讲解:

x指的是x轴的坐标
y是y轴的坐标
stroke-dasharray指的是线段和空白进行绘制成的边框
width指的是矩形的宽
height指的是矩形的高
(有了x,y坐标和宽高就可以组成一个矩形)
stroke:是线段的颜色
stroke-width:线段的宽度
fill:矩形的填充颜色 (置为none是无填充)

<template> 
    <div class="container">
      <svg width="120" height="120" viewBox="0 0 120 120">
        <rect
          class="rect"
          x="10"
          y="10"
          width="100"
          height="100"
          stroke="blue"
          fill="none"
          stroke-width="3"
        ></rect>
      </svg>
    </div> 
</template>
<script>
export default {
  name: "SvgAnimation",
};
</script>
<script setup></script>

<style lang="scss" scoped>
.container {
  margin-top: 30px;
  text-align: center;
  svg {
    border: 1px solid red;
  }
}
</style>

在这里插入图片描述
3:圆形 circle
circle属性讲解:

这里是引用
1:cx:距离x轴左侧的距离
2:cy距离y轴顶部的距离
3:r半径
4: stroke-width线段的宽度
5:stroke线段的颜色
6:fill 填充色(none无填充 transparent无填充 red填充色是红色)

<template> 
     <div class="container">
      <svg width="101" height="101" viewBox="0 0 101 101">
        <circle
          cx="51"
          cy="51"
          r="50"
          stroke-width="1"
          stroke="green"
          fill="transparent"
        ></circle>
      </svg>
    </div>
</template>
<script>
export default {
  name: "SvgAnimation",
};
</script>
<script setup></script>

<style lang="scss" scoped>
.container {
  margin-top: 30px;
  text-align: center;
  svg {
    border: 1px solid red;
  }
}
</style>

在这里插入图片描述

4-5:多边形polygon和polyline

区别:polygon会把起点和终点进行连接在一起
polylinen不会把起点和终点连接在一起

多边形属性讲解

1:points是绘制多个坐标点的
eg: points=“20,10,80,50,20,90”=>=> 形成三个坐标点(20,10),(80,50),(20.90)
2: stroke-width线段的宽度
3:stroke线段的颜色
4:fill图形的填充颜色(fill="none"是无填充色)

<template> 
    <div class="container">
      <svg width="100" height="100" viewBox="0 0 100 100">
        <polyline
          points="20,10,80,50,20,90"
          stroke-width="2"
          stroke="red"
          fill="none"
        ></polyline>
      </svg>
    </div>
    <div class="container">
      <svg width="100" height="100" viewBox="0 0 100 100">
        <polygon
          points="20,10,80,50,20,90"
          stroke-width="2"
          stroke="red"
          fill="none"
        ></polygon>
      </svg>
    </div> 
 </template> 
 <script>
 export default {
   name: "SvgAnimation",
 };
 </script>
 <script setup></script>

 <style lang="scss" scoped>
  .container {
   margin-top: 30px;
   text-align: center;
   svg {
    border: 1px solid red;
  }
}
</style>

在这里插入图片描述

polygon绘制梯形

 <template>
  <div class="container">
    <svg width="100" height="100" viewBox="0 0 100  100">
      <polygon
        points="30 30 80 30 90 60 20 60"
        fill="red"
        stroke="black"
      ></polygon>
    </svg>
  </div>
</template>
<script>
export default {
  name: "SvgAnimation",
};
</script>
<script setup></script>

<style lang="scss" scoped>
.container {
  margin-top: 30px;
  text-align: center;
  svg {
    border: 1px solid red;
  }
}
 
</style>

在这里插入图片描述

更多属性讲解

1:stroke-dasharray

stroke-dasharray:10 有一个参数就是 10像素的线段 10像素的空白
stroke-dasharray:10 20 有2个参数就是 10像素的线段 20像素的空白
stroke-dasharray:10 20 30 有3个参数就是 10像素的线段 20像素的空白 30像素的线段 10像素的空白 20像素的线段依次排列

 <template>
  <div>
    <div class="container">
      <svg width="200" height="200" viewBox="0 0 200 200">
        <rect
          class="rect"
          x="10"
          y="10"
          stroke-dasharray="10 2 30"//此属性可以写在标签内也可以写在css样式内
          width="100"
          height="100"
          stroke="blue"
          fill="none"
          stroke-width="3"
        ></rect>
      </svg>
    </div>
  </div>
</template>
<script>
export default {
  name: "SvgAnimation",
};
</script>
<script setup></script>

<style lang="scss" scoped>
.container {
  margin-top: 30px;
  text-align: center;
  svg {
    border: 1px solid red;
  }
}
 
</style>


在这里插入图片描述
2.matrix 复杂变形 对当前的坐标体系进行变换(从原始默认的坐标转换到最新的坐标)

<template>
  <div class="container">
    <svg width="200" height="200" viewBox="0 0 200 200">
      <circle
        cx="100"
        cy="100"
        r="50"
        stroke-width="6"
        stroke="red"
        fill="transparent"
      ></circle>
      <!-- 圆的周长:  2Πr  2*3.1415927*50  加在@keyframes 的stroke-dasharray属性中-->
      <circle
        class="circle-yuan"
        cx="100"
        cy="100"
        r="50"
        stroke-width="6"
        stroke="yellow"
        fill="transparent"
      ></circle>
    </svg>
  </div>
 </<template>>
 
<script>
export default {
  name: "SvgAnimation",
};
</script>
<script setup></script>

<style lang="scss" scoped>
.container {
  margin-top: 30px;
  text-align: center;
  svg {
    border: 1px solid red;
  }
}
.circle-yuan {
  animation: circle-yuan 5s linear infinite;
}
@keyframes circle-yuan {
 //314是计算的圆的周长
  from {
    stroke-dasharray: 0 314;//开始的时候(from) 0的线段 314的空白
  }
  to {
    stroke-dasharray: 314 0;//结束的时候(to) 314的线段 0的空白--》代表进度条完成一圈
  }
}
</style>

在这里插入图片描述
此时我们发现 进度条的起始点是在右侧的中心区域我们想在最上面的中心区域作为起始点需要一个属性 matrix
计算公式:
假如我们的圆圈的坐标点: [0,0] [100,0] [100,50] [0,50]
transform=“matrix(2 1 -1 2 50 0 )” 6个参数 (a d b e c f)
上面的6个参数相当于2个组合:[2,-1,50] ==> 2x+(-1)y+50=x [1,2,0]=>1x+2y+0=y
把每一个数组的值套用上面的公式: x坐标的值用2x+(-1)y+50=x y轴坐标值用[1,2,0]=>1x+2y+0=y
得到的最新的坐标点就是我们需要旋转的点
[50,0] [250,100] [200,200] [0,100] ==>最终的点位进行绘制图形

看下面的图 我们知道了 原始的坐标点 想转移坐标点改变起始位置 对上面的公式进行反推 那么就是得出了matrix的6个值
在这里插入图片描述

<template> 
  <div class="container">
    <svg width="200" height="200" viewBox="0 0 200 200">
      <circle
        cx="100"
        cy="100"
        r="50"
        stroke-width="6"
        stroke="red"
        fill="transparent"
      ></circle>
      <!-- 圆的周长  2Πr  2*3.1415927*50 -->
      <circle
        class="circle-yuan"
        cx="100"
        cy="100"
        r="50"
        stroke-width="6"
        stroke="yellow"
        fill="transparent"
        transform="matrix(0 -1 1 0 0 200)"
      ></circle>
    </svg>
  </div>
</template>

<script>
export default {
  name: "SvgAnimation",
};
</script>
<script setup></script>

<style lang="scss" scoped>
.container {
  margin-top: 30px;
  text-align: center;
  svg {
    border: 1px solid red;
  }
}
.circle-yuan {
  animation: circle-yuan 5s linear infinite;
}
@keyframes circle-yuan {
  from {
    stroke-dasharray: 0 314;
  }
  to {
    stroke-dasharray: 314 0;
  }
}
</style>

在这里插入图片描述

<template>
 <div class="container">
 
    <svg width="200" height="200" viewBox="0 0 200 200">
      <rect
        x="0"
        y="0"
        width="200"
        height="200"
        stroke="yellow"
        stroke-width="4"
        fill="none"
      ></rect>
      计算出矩形的周长 (+)*2
      <rect
        class="rect-process"
        x="0"
        y="0"
        width="200"
        height="200"
        stroke="red"
        stroke-width="4"
        fill="none"
        transform="matrix(0 1 -1 0 200 0)"
      ></rect>
    </svg>
  </div>
</template>
script>
export default {
  name: "SvgAnimation",
};
</script>
<script setup></script>

<style lang="scss" scoped>
.container {
  margin-top: 30px;
  text-align: center;
  svg {
    border: 1px solid red;
  }
}
 
.rect-process {
  animation: rect-process 5s linear infinite;
}
@keyframes rect-process {
  from {
    stroke-dasharray: 0 800;
  }
  to {
    stroke-dasharray: 800 0;
  }
}
</style>

矩形进度条
在这里插入图片描述

3:stroke-dashoffset: 正数偏移x值的时候,相当于往左移动了x个长度单位,负数偏移x的时候,相当于往右移动了x个长度单位。

 <div class="container">
    <svg class="line-content" width="200" height="200" viewBox="0 0 200 200">
      <line
        class="line"
        x1="0"
        y1="100"
        x2="200"
        y2="100"
        stroke="red"
        stroke-width="2"
      ></line>
    </svg>
  </div>
</template>

<script>
export default {
  name: "SvgAnimation",
};
</script>
<script setup></script>

<style lang="scss" scoped>
.container {
  margin-top: 30px;
  text-align: center;
  svg {
    border: 1px solid red;
  }
} 
.line {
//默认的时候是200的线段和200的空白
  stroke-dasharray: 200;
  //往左位移了200像素 只剩200的空白了 
  stroke-dashoffset: 200;
 // transition:为属性定义过度(width  height等等)  :name  过度时间  速度 延迟时间
  transition: stroke-dashoffset 0.5s ease-out;
}
.line-content {
  //鼠标悬入的时候把位移置为0(默认值) 就是又出现默认的情况只剩200的线段和200的空白
  &:hover {
    .line {
      stroke-dashoffset: 0;
    }
  }
}
</style>

初始状态和结束状态
在这里插入图片描述

鼠标悬入
在这里插入图片描述
鼠标离开
在这里插入图片描述

4.getTotalLength()方法是获取图形的长度的

<template>
  <div class="container">
    <svg class="icon" viewBox="0 0 1024 1024" width="200" height="200">
      <path
        class="logo"
        d="M448 917.376C448 917.333333 576 917.333333 576 917.333333c0.085333 0 0-42.709333 0-42.709333C576 874.666667 448 874.666667 448 874.666667c-0.085333 0 0 42.709333 0 42.709333z m371.349333-173.034667C809.6 745.877333 799.573333 746.666667 789.333333 746.666667a21.333333 21.333333 0 0 1-21.333333-21.333334V384a21.333333 21.333333 0 0 1 21.333333-21.333333 191.146667 191.146667 0 0 1 92.373334 23.637333C828.202667 234.517333 681.045333 128 511.296 128 341.290667 128 193.749333 234.816 140.458667 387.328A191.125333 191.125333 0 0 1 234.666667 362.666667a21.333333 21.333333 0 0 1 21.333333 21.333333v341.333333a21.333333 21.333333 0 0 1-21.333333 21.333334 192 192 0 0 1-148.906667-313.216 21.269333 21.269333 0 0 1 0.042667-8.682667C127.36 228.288 304.469333 85.333333 511.274667 85.333333c209.706667 0 388.544 146.944 427.008 347.093334l0.213333 1.344A191.210667 191.210667 0 0 1 981.333333 554.666667c0 70.4-37.909333 131.968-94.421333 165.397333-57.642667 100.693333-154.752 174.762667-268.778667 204.074667A42.517333 42.517333 0 0 1 576 960h-128c-23.573333 0-42.666667-19.157333-42.666667-42.624v-42.752c0-23.552 18.922667-42.624 42.666667-42.624h128c23.573333 0 42.666667 19.157333 42.666667 42.624v5.141333a392.810667 392.810667 0 0 0 200.682666-135.424zM85.333333 554.666667c0.298667 133.589333 128 148.949333 128 148.949333V406.144s-128.298667 14.933333-128 148.522667z m853.333334 0c0.298667-133.589333-128-148.522667-128-148.522667v297.472s127.701333-15.36 128-148.949333z"
        p-id="3965"
      ></path>
    </svg>
  </div>
</template>

<script>
export default {
  name: "SvgAnimation",
};
</script>
<script setup>
import { onMounted } from "vue";
onMounted(() => {
  const logo = document.getElementsByClassName("logo")[0];
  console.log(logo.getTotalLength());// 6919.53759765625
});
</script>
<style lang="scss" scoped>

.logo {
  stroke: red;
  stroke-width: 4;
  animation: logo 5s linear 1 forwards;
}
@keyframes logo {
  0% {
    fill: white;
    stroke: red;
    stroke-dasharray: 6919.53759765625;
    stroke-dashoffset: 6919.53759765625;
  }
  50% {
    fill: white;
    stroke: red;
    stroke-dasharray: 6919.53759765625;
    stroke-dashoffset: 0;
  }
  75% {
    fill: red;
    stroke: white;
  }
  100% {
    fill: blue;
    stroke: white;
  }
}
</style>

效果:
先进行描边
在这里插入图片描述
在填充颜色
在这里插入图片描述
最后定格填充颜色
在这里插入图片描述

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

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

相关文章

SAP FICO 理解统驭科目记账与特殊记账

统驭科目记账与特殊记账 【背景】 统驭科目通常分为三类&#xff1a;资产&#xff08;A&#xff09;、客户&#xff08;D&#xff09;和供应商&#xff08;K&#xff09;&#xff0c;在创建会计科目时可在”控制数据“选项卡下进行选择。 在创建客户/供应商主数据的时候&#…

Vue插槽Slot的使用

1、认识插槽Slot 在开发中&#xff0c;我们会经常封装一个个可复用的组件&#xff1a; 前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示&#xff1b;但是为了让这个组件具备更强的通用性&#xff0c;我们不能将组件中的内容限制为固定的div、span等等这些…

【零基础】学python数据结构与算法笔记15-欧几里得、RSA

文章目录前言95.欧几里得算法96.RSA算法介绍97.RSA算法测试98.算法课程总结总结前言 学习python数据结构与算法&#xff0c;学习常用的算法&#xff0c; b站学习链接 95.欧几里得算法 求最大公约数 欧几里得算法&#xff1a;gcd(a,b) gcd(b,a mod b) #mod取余 例&#xff1a…

04.自定义类型:结构体

1 结构体的声明 1.1 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag { member-list;//成员列表 }variable-list;//变量列表 EG: 描述一位学生&#xff1a; struct Stu {char name[…

Comparable+Comparator+Cloneable接口

文章目录ComparableComparatorCloneable浅拷贝深拷贝Comparable 当我们需要对一个自己写的类进行排序(Collections.sort和Arrays.sort)的时候&#xff0c;,就要使用到Comparable接口。 该接口中有一个compareTo方法&#xff0c;该方法其实就是一比较规则。 public interface…

货币银行学

建立大脑知识库 外汇储备不宜太高&#xff0c;2022年是3万亿。 美元贬值&#xff0c;大宗商品会更贵。 大宗商品 [1] &#xff08;Commodities&#xff09;是指可进入流通领域&#xff0c;但非零售环节&#xff0c;具有商品属性并用于工农业生产与消费使用的大批量买卖的物质商…

Oracle Id生成算法 —— 雪花算法

背景 近几日&#xff0c;被主键ID生成折磨的不太行&#xff0c;于是就在寻找一种合适的主键生成策略&#xff0c;选择一种合适的主键生成策略&#xff0c;可以大大降低主键ID的维护成本。 主键ID生成方法 最常用的4种主键ID生成方法 UUID&#xff1a;全局唯一性&#xff0c…

【框架】Spring

1、IOC 1、自动化配置 xml文件 注册bean 属性注入&#xff1a;setter&#xff0c;构造方法&#xff0c;p命名空间&#xff0c;外部注入 复杂属性&#xff1a;对象ref&#xff0c;数组array&#xff0c;list&#xff0c;map 依赖注入&#xff1a;ctx.getBean()Java配置类 Conf…

InterruptedException异常解析

Either re-interrupt this method or rethrow the “InterruptedException”. 请重新中断此方法或重新引发“InterruptedException”。 文章目录问题描述问题解析sonar检测提示规则解决方案问题描述 public void run () {try {while (true) {// do stuff}}catch (InterruptedE…

webgl变换矩阵理论详解

文章目录前言矩阵运算矩阵加减矩阵数乘矩阵乘矩阵矩阵转置逆矩阵正交矩阵矩阵变换的一般规则行主序和列主序行向量和列向量复杂变换时的顺序变换矩阵进行图形变换uniform传递矩阵平移缩放旋转组合变换实例总结前言 在webgl中将图形进行平移、旋转、缩放等操作时可以在着色器中…

11.1 使用关联容器

文章目录关联容器的类型使用map使用set关联容器中元素是按关键字保存和访问的&#xff0c;支持高效关键字查找和访问。顺序容器中元素是按他们在容器中的位置保存访问的。关联容器有两个主要类型&#xff1a;set和map。 set&#xff1a;每个元素包含一个关键字&#xff0c;想知…

OPC实践:通过 python-docx 读取 docx 文档

概述 本文记录下列命令执行的过程&#xff0c;通过对过程中的关键步骤进行记录&#xff0c;掌握 python-docx 库中 opc 与 parts 模块的源码、以及加深对 OPC 的理解。 import docx# fp 为 docx 文件路径&#xff0c; docx 包含一个 hello 字符串、一张 jepg 图片及一个表格…

<Python的列表和元组>——《Python》

目录 1.列表 1.1 列表的概念 1.2 创建列表 1.3 访问下标 1.4 切片操作 1.5 遍历列表元素 1.6 新增元素 1.7 查找元素 1.8 删除元素 1.9 连接列表 2. 元组 1.列表 1.1 列表的概念 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少,…

初识 Bootstrap(前端开发框架)

初识 Bootstrap&#xff08;前端开发框架&#xff09;参考Bootstrap特点获取目录结构jQuery 与 Popper准备工作包含 jQuery 与 Poppermetabox-sizing基本模板无注释版本注释版本参考 项目描述Bootstrap 官方教程https://getbootstrap.net/docs/getting-started/introduction/百…

字节青训前端笔记 | HTTP 使用指南

本节课介绍 Http 协议的基本定义和特点&#xff0c;在此基础上&#xff0c;对于 Http 协议的发展历程及报文结构展开进一步分析。 从输入字符串到打开网页 输入地址浏览器处理输入信息浏览器发请求到达服务器服务器返回信息浏览器读取响应信息浏览器渲染页面加载完成 什么是…

KVM虚拟化简介 | 初识

目录 1、kvm架构 2、架构解析 3、kvm和qemu的作用 1、kvm架构 2、架构解析 从rhel6开始使用&#xff0c;红帽公司直接把KVM的模块做成了内核的一部分。xen用在rhel6之前的企业版中默认内核不支持&#xff0c;需要重新安装带xen功能的内核KVM 针对运行在x86 硬件上的、驻留在内…

配置 Git 连接 GitHub

文章目录0.安装 Git1.注册 GitHub 账号2.配置 Git 的用户名和邮箱3.为本机生成 SSH 密钥对4.将公钥拷贝到 GitHub 上5.测试0.安装 Git Git 官网链接&#xff1a;https://git-scm.com/ Git 官网下载链接&#xff1a;https://git-scm.com/downloads 1.注册 GitHub 账号 GitHu…

蓝桥杯STM32G431RBT6学习——定时器PWM输出

蓝桥杯STM32G431RBT6学习——定时器PWM输出 前言 PWM波输出作为定时器的一个常用功能&#xff0c;也属于高频的考点。从数据手册的定时器解析可以了解到&#xff08;上篇描述&#xff09;&#xff1a;除了基本定时器&#xff08;TIM6、7&#xff09;外&#xff0c;其他所有定…

全国产网管型工业交换机的几种管理方式

全国产网管型工业交换机按其字面上的意思&#xff0c;一是全国产化&#xff08;工业交换机&#xff09;&#xff0c;就是交换机内部95%以上元器件的国内生产制造&#xff0c;重要的硬件芯片&#xff0c;比如交换机芯片、管理芯片、接口芯片等必须是国内厂商在国内研发、生产、制…

学习记录664@项目管理之项目进度管理

什么是项目进度管理 项目进度管理包括为管理项目按时完成所需的7个过程&#xff0c;具体为: 规划进度管理过程一一制定政策、程序和文档以管理项目进度。定义活动过程一一识别和记录为完成项目可交付成果而需采取的具体行动。排列活动顺序过程一一识别和记录项目活动之间的关…