解锁小程序中使用SVG新姿势
liuian 2025-01-20 14:46 14 浏览
SVG 的优势
- 清晰度: 可以进行放大,而不失真
- 更小的文件体积
- 可扩展性,可以动态颜色
- 动效 可以添加动效
在小程序中使用
目前小程序 的image标签已经支持了 svg 的显示
svg
<image src="./xx.svg"/>
如何动态的改变 svg 属性呢?
大体思路:把svg转成 base64 然后通过 image标签 src设置图片,再动态赋值svg颜色
- 把svg转成base64
如下一个svg 代码文件
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="24 24 48 48"><animateTransform attributeName="transform" type="rotate" repeatCount="indefinite" from="0" to="360" dur="1400ms"></animateTransform><circle cx="48" cy="48" r="20" fill="none" stroke="#eeeeee" stroke-width="2" transform="translate\(0,0\)"><animate attributeName="stroke-dasharray" values="1px, 200px;100px, 200px;100px, 200px" dur="1400ms" repeatCount="indefinite"></animate><animate attributeName="stroke-dashoffset" values="0px;-15px;-125px" dur="1400ms" repeatCount="indefinite"></animate></circle></svg>
- 转成base64,其实就是 对这个svg进行 encodeURIComponent 得到 如下代码
%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%2224%2024%2048%2048%22%3E%3CanimateTransform%20attributeName%3D%22transform%22%20type%3D%22rotate%22%20repeatCount%3D%22indefinite%22%20from%3D%220%22%20to%3D%22360%22%20dur%3D%221400ms%22%3E%3C%2FanimateTransform%3E%3Ccircle%20cx%3D%2248%22%20cy%3D%2248%22%20r%3D%2220%22%20fill%3D%22none%22%20stroke%3D%22%23eeeeee%22%20stroke-width%3D%222%22%20transform%3D%22translate%5C(0%2C0%5C)%22%3E%3Canimate%20attributeName%3D%22stroke-dasharray%22%20values%3D%221px%2C%20200px%3B100px%2C%20200px%3B100px%2C%20200px%22%20dur%3D%221400ms%22%20repeatCount%3D%22indefinite%22%3E%3C%2Fanimate%3E%3Canimate%20attributeName%3D%22stroke-dashoffset%22%20values%3D%220px%3B-15px%3B-125px%22%20dur%3D%221400ms%22%20repeatCount%3D%22indefinite%22%3E%3C%2Fanimate%3E%3C%2Fcircle%3E%3C%2Fsvg%3E
- 拼接base64
data:image/svg+xml;charset=utf-8,encodeURIComponent后的代码
2. 在对应svg属性上动态设置颜色,比如这里用到的是填充颜色
在js文件 data中定义 color 状态
在wxml中动态渲染
<image src="data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20viewBox%3D%2224%2024%2048%2048%22%3E%3CanimateTransform%20attributeName%3D%22transform%22%20type%3D%22rotate%22%20repeatCount%3D%22indefinite%22%20from%3D%220%22%20to%3D%22360%22%20dur%3D%221400ms%22%3E%3C%2FanimateTransform%3E%3Ccircle%20cx%3D%2248%22%20cy%3D%2248%22%20r%3D%2220%22%20fill%3D%22none%22%20stroke%3D%22%23{{color}}%22%20stroke-width%3D%222%22%20transform%3D%22translate%5C(0%2C0%5C)%22%3E%3Canimate%20attributeName%3D%22stroke-dasharray%22%20values%3D%221px%2C%20200px%3B100px%2C%20200px%3B100px%2C%20200px%22%20dur%3D%221400ms%22%20repeatCount%3D%22indefinite%22%3E%3C%2Fanimate%3E%3Canimate%20attributeName%3D%22stroke-dashoffset%22%20values%3D%220px%3B-15px%3B-125px%22%20dur%3D%221400ms%22%20repeatCount%3D%22indefinite%22%3E%3C%2Fanimate%3E%3C%2Fcircle%3E%3C%2Fsvg%3E" />
`注意:这里的颜色 由于是已经被编码了,所以# 已经被转义了 %23, 直接写颜色数字即可 `
当然你也可以 去掉%23 自己实现一个内部方法
if (color && color.startsWith('#')) {
return `%23${color.slice(1)}`;
}
这样其实就实现了 svg的动态渲染,可是这种写法,写在wxml中 不是特别的优雅,那么如何重构下让我们的代码看起来更优雅呢?
- 把 svg 单独存放 支持动态返回
- 动态复制 image src 属性
svg 动态函数
loading.svg.js 文件
export const loadingSvg = (color='#ddd') =>{
const svgXml = `<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="24 24 48 48"><animateTransform attributeName="transform" type="rotate" repeatCount="indefinite" from="0" to="360" dur="1400ms"></animateTransform><circle cx="48" cy="48" r="20" fill="none" stroke="${color}" stroke-width="2" transform="translate\(0,0\)"><animate attributeName="stroke-dasharray" values="1px, 200px;100px, 200px;100px, 200px" dur="1400ms" repeatCount="indefinite"></animate><animate attributeName="stroke-dashoffset" values="0px;-15px;-125px" dur="1400ms" repeatCount="indefinite"></animate></circle></svg>`
return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgXml)}`
}
逻辑层引入,setData
onLoad(){
const { loadingSvg } = require('./loading.svg.js')
const svgImg = loadingSvg('#eee')
this.setData({svgImg})
},
渲染层使用
<image src="{{svgImg}}"/>
这样看起来舒服多了!!!
相关推荐
- Flutter——输入部件
-
上一节介绍了文本部件,用于显示文本。但是在我们进行日常软件开发过程中,经常是需要获取用户键入的内容,比如用户名、密码、性别、喜好等等。Flutter提供了丰富的部件来处理用户输入,本节将主要介绍以下...
- flutter系列之:做一个图像滤镜
-
简介很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过css滤镜来实现这个功能。那么如果在flutter中,如果要实现这样的滤镜功能应该怎么处理呢?一起...
- 免费好用还高级!3个必须知道的设计网站,让你的PPT好看10倍
-
哈喽,大家早上好鸭~好久不见,我是三石,今天我又来进行PPT技巧分享啦~诶,这不前几天编辑部的萌萌就来找我约稿,说小叶子们对于神器网站的呼声很高,问我能不能写一篇文章汇总一下,我二话没说就答应了。常言...
- flutter软件开发笔记08-容器使用方法
-
在Flutter3中,容器组件是用于布局、装饰或约束子组件的核心部件,能让程序更加美观,如何学习呢,能快速的应用起来,下面通过例子,来快速理解各种容器组件的使用方法。一程序界面二代码实现imp...
- Tauri:下一代桌面应用开发框架?
-
大厂技术坚持周更精选好文本文为来自教育-智能学习-前端团队成员的文章,已授权ELab发布。智能学习前端团队自创立以来,团队专注于打破大众对教育的刻板印象,突破固有的教学思维,攻破各类...
- Google移动开发平台Flutter发布 iOS和Android开发者神器
-
在昨晚的FlutterLive2018上,Google宣布Flutter1.0正式发布。这是一个基于Dart的移动开发平台,旨在帮助开发者在iOS和Android两个平台上...
- Flutter如何内存优化
-
Flutter是一种流行的跨平台移动应用程序开发框架,它提供了一种高效的方式来构建美观、快速、可靠的应用程序。然而,随着应用程序规模的增加,内存管理成为了一个重要的问题。本文将探讨如何优化Flutte...
- 阿里卖家 Flutter for Web 工程实践
-
作者:马坤乐(坤吾)Flutter自2015年初次亮相以来,经过了多年的发展已经相当成熟,在阿里、美团、拼多多等互联网公司都有广泛的应用。在ICBU阿里卖家上90+%的新业务使用Flu...
- Flutter——按钮
-
上一节介绍了输入组件,让我们了解了输入框、单选、多选、进度条等部件。为了响应用户的点击或触摸操作,就需要学习一种新的部件-按钮。Flutter中有多种类型的按钮,用于响应用户的点击或触摸操作。接下来...
- Flutter vs React Native 性能测试结果
-
FluttervsReactNative性能测试结果:谁才是王者?大家好,我是猫哥。今天会去讲一下Flutter和ReactNative的性能比较的情况。首先说一下ReactNative猫哥...
- 定位Flutter内存问题很难么?
-
内存水位升高导致的稳定性问题严重影响app用户体验,所以开发者们非常关注Flutter的内存表现。随着Flutter业务越来越多,闲鱼也面临着oom导致的crash率提升的问题,下面我们结合项目中实际...
- 超详解析Flutter渲染引擎|业务想创新,不了解底层原理怎么行?
-
作者|万红波(远湖)出品|阿里巴巴新零售淘系技术部前言Flutter作为一个跨平台的应用框架,诞生之后,就被高度关注。它通过自绘UI,解决了之前RN和weex方案难以解决的多端一致性...
- flutter软件开发笔记25-内置组件总结
-
以下是Flutter内置的核心UI组件分类及常用组件列表,方便你系统化学习和掌握:1.基础组件组件名说明Text显示文本,支持样式、换行和富文本(TextSpan)Icon显示Materi...
- Flutter CarouselView 3.24版本的一个新组件
-
Flutter3.24带来了几个令人兴奋的新功能,其中最引人注目的是CarouselView小部件。这个小部件允许开发人员创建可滚动的、动态的项目列表,这些列表可以在进入和退出视图时调整大小,这对于...
- 详解Flutter如何用思源宋体炫出你的UI
-
如何实现使用思源宋体字体样式。首先,让我们来了解一下什么是资源素材管理。简单来说,它就是为了方便我们管理各种资源文件,比如图片、字体、音频等。在Flutter中,我们可以使用pubspec.yam...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
python使用fitz模块提取pdf中的图片
-
《人人译客》如何规划你的移动电商网站(2)
-
Jupyterhub安装教程 jupyter怎么安装包
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- table.render (33)
- uniapp textarea (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- react-admin (33)
- vscode切换git分支 (35)
- vscode美化代码 (33)
- python bytes转16进制 (35)