首页 > 其他分享 >svg动画 - 仪表盘

svg动画 - 仪表盘

时间:2023-08-21 15:35:20浏览次数:48  
标签:动画 const svg midc rate 仪表盘 长度 event 360

案例:

 

<svg width="65" height="66" viewBox="0 0 65 66" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.102" fill-rule="evenodd" clip-rule="evenodd" d="M32.4409 0.808594C50.2637 0.808594 64.7115 15.2563 64.7115 33.0786C64.7115 50.9008 50.2637 65.3486 32.4409 65.3486C14.6186 65.3486 0.170898 50.9008 0.170898 33.0786C0.170898 15.2563 14.6186 0.808594 32.4409 0.808594Z" fill="#0094FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27.4463 55.4393H37.7239C38.1166 55.4393 38.4348 55.7576 38.4348 56.1503C38.4348 56.5435 38.1166 56.8618 37.7239 56.8618H27.4463C27.0536 56.8618 26.7354 56.5435 26.7354 56.1503C26.7354 55.7576 27.0536 55.4393 27.4463 55.4393Z" fill="#0084FD"/>

<circle class="small-circle-mid-bg" fill="none" cx="32.4410" cy="33.0789" r="24.5621" stroke="#297FFF" stroke-opacity="0.26" stroke-width="8" stroke-dasharray="119.2595 153.3337" transform="rotate(130 32.4410 33.0789)" />

<circle class="small-circle-mid" fill="none" cx="32.4410" cy="33.0789" r="24.5621" stroke="blue" stroke-width="8" stroke-dasharray="119.2595 153.3337" transform="rotate(130 32.4410 33.0789)" />

<path opacity="0.502" fill-rule="evenodd" clip-rule="evenodd" d="M32.2407 15.1298C42.0432 15.1298 49.9902 23.0762 49.9902 32.8787C49.9902 42.6818 42.0432 50.6282 32.2407 50.6282C22.4382 50.6282 14.4912 42.6818 14.4912 32.8787C14.4912 23.0762 22.4382 15.1298 32.2407 15.1298Z" stroke="#0066FE"/>
</svg>

<script type="text/javascript">
    const midc = document.querySelector(".small-circle-mid");
    const totalLen = midc.getTotalLength();
    const maxLen = totalLen * 280 / 360;

    let rate = 0;
    let currLen = 0;
    
    document.onkeydown = function(event){
        if (event.key == 'w') {
            rate = rate + 0.5;
        } else if (event.key == 's') {
            rate = rate - 0.5;
        } else {
            return;
        }
        (rate > 100) && (rate = 100);
        (rate < 0) && (rate = 0);
        currLen = rate * maxLen / 100;
        midc.setAttribute('stroke-dasharray', `${currLen} ${totalLen}`);
    }
</script>

 

 讲解:

 js功能:按w增长,按s降低

stroke-dasharray:接收一个数组,【实心线长度  空白线长度 实心线长度  空白线长度 。。。】, 起始点是x轴的正轴方向

<svg width="65" height="66" viewBox="0 0 65 66" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle class="small-circle-mid-bg" fill="none" cx="32.4410" cy="33.0789" r="24.5621" stroke="#297FFF" stroke-opacity="0.26" stroke-width="8"></circle>
<circle class="small-circle-mid" fill="none" cx="32.4410" cy="33.0789" r="24.5621" stroke="blue" stroke-width="8" stroke-dasharray="10 153.3337" transform="rotate(0 32.4410 33.0789)"></circle>
</svg>

 

可以通过旋转角度改变起始点

<svg width="65" height="66" viewBox="0 0 65 66" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle class="small-circle-mid-bg" fill="none" cx="32.4410" cy="33.0789" r="24.5621" stroke="#297FFF" stroke-opacity="0.26" stroke-width="8"></circle>
<circle class="small-circle-mid" fill="none" cx="32.4410" cy="33.0789" r="24.5621" stroke="blue" stroke-width="8" stroke-dasharray="10 153.3337" transform="rotate(30 32.4410 33.0789)"></circle>
</svg>

 

也可以通过改变 stroke-dashoffset 改变起始点,设置的是起始点的偏移长度,如果要用角度换算长度,可以用 总【长度 * 角度 / 360】 来获取长度

153.3337 * 90 / 360 = 38.333425

<svg width="65" height="66" viewBox="0 0 65 66" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle class="small-circle-mid-bg" fill="none" cx="32.4410" cy="33.0789" r="24.5621" stroke="#297FFF" stroke-opacity="0.26" stroke-width="8"></circle>
<circle class="small-circle-mid" fill="none" cx="32.4410" cy="33.0789" r="24.5621" stroke="blue" stroke-width="8" stroke-dasharray="10 153.3337" transform="rotate(0 32.4410 33.0789)" stroke-dashoffset="-38.33"></circle>
</svg>

 

 

 几个比较好用的svg原生函数:

midc
<circle class=​"small-circle-mid" fill=​"none" cx=​"32.4410" cy=​"33.0789" r=​"24.5621" stroke=​"blue" stroke-width=​"8" stroke-dasharray=​"10 153.3337" transform=​"rotate(0 32.4410 33.0789)​" stroke-dashoffset=​"-38.33">​</circle>​

midc.getBBox(): 获取左上角定点的位置和宽高,中心位置可以计算的出来 cx = x + width / 2 , cy = y + height / 2
SVGRect {x: 7.878902435302734, y: 8.516799926757812, width: 49.12419891357422, height: 49.12419891357422}

midc.getTotalLength(): 可以获取路径的总长度
153.333740234375

midc.getPointAtLength(38.333425):可以获取路径上指定位置的点的坐标
SVGPoint {x: 32.44101333618164, y: 57.64099884033203}

midc.getBoundingClientRect():这个还不能确定有啥用,但是给的好像是在屏幕上的位置和宽高
DOMRect {x: 15.878902435302734, y: 16.516799926757812, width: 49.12419509887695, height: 49.12419891357422, top: 16.516799926757812, …}

 

 

标签:动画,const,svg,midc,rate,仪表盘,长度,event,360
From: https://www.cnblogs.com/LcxSummer/p/17646150.html

相关文章

  • Python通过matplotlib包和gif包生成gif动画
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • Android实现人脸识别动画效果
    效果展示实现步骤1.绘制圆圈遮罩这里我们是用了混合模式来实现圆圈部分的扣除,这里我们用到了PorterDuff.Mode.CLEAR/***绘制圆圈遮罩*@paramcanvas*/privatevoiddrawCircleMask(Canvascanvas){canvas.save();//目标图Dst......
  • 使用Canvas API实现交互式绘图和动画:基础知识和实践经验
    CanvasAPI是HTML5中的一个重要特性,它允许开发者在网页上直接绘制图形、图像、文本等内容,并且可以通过JavaScript进行控制和交互。在本文中,我们将介绍CanvasAPI的基础知识,包括如何创建Canvas元素、设置Canvas的属性、绘制基本形状和路径、以及使用图片和文字等高级功能。创建Can......
  • 瞅瞅吧!你可能会用到的 css 动画库
    原文链接:推荐几个你可能会用到的CSS动画库Animate.cssOBNOXIOUS.CSSCSShakeAnimXYZAimistaHover.cssMagicCSS如果你有正在用的觉得不错的库,可以在下方评论喔~......
  • 黑魂224 更改导演动画轴模型
    在TesterDirector脚本里添加两个变量: 在上方添加一个 usingUnityEngine.Timeline;在Update函数添加新的代码。可以在TesterDirector脚本里实现随意切换模型进行导演动作。 ......
  • 黑魂233 导演动画和代码联动
    给Director物体新建一个脚本,TesterDirector 然后将Director插件放进pd变量里: 在代码里添加导演动画激活的按钮:只要按下T键,就会执行。前提是得先把PlayOnWake消钩。 然后再添加这几个代码,让导演动画可以重复播放: ......
  • 黑魂232 导演动画
    创建一个空物体,改名Director。把Playable放进去, 然后在黑骑士模型里增加两个空物体作为开关武器的按钮,然后分别把武器放进去。 然后要将剑盾里的插件修改成filter和MeshRenderer: 然后在脚本文件夹里新建一个Timeline插件: 这里是要先将Director物体绑定好刚刚创建的t......
  • Threejs实现动画
    这节讲用threejs实现动画的效果,之前有讲过用定时循环执行的方式实现threejs的动画效果,但是那种方式并非专门用于动画效果的制作,一方面如果多个物体都需要添加动画效果,定时循环执行体的内容会变得很多,另一方面之前的方式移动或者改变颜色都会很麻烦且不丝滑,这里介绍的是专门用于动画......
  • 解决 electron-forge 打包的 setup.exe 在安装动画未结束前就开了程序的主界面问题
    问题描述:electron-forge打包的setup.exe在安装动画未结束前就开了程序的主界面问题。问题演示图片:修复后的演示图片:原因这种setup.exe被称为Squirrel.Windows为什么安装动画未结束就启动了程序,原因在下面的文档里,这里是electron-forge相关文档:Handlingstartup......
  • 显示 jpg、png、gif 图片及 gif 动画
    unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ExtCtrls;typeTForm1=class(TForm) Button1:TButton; Button2:TButton; Button3:TButton; Button4:TButton; procedureButton1Click(Sender:......