文章目录

  • 小程序引用图片的几种方式
  • 小程序如何引用svg图片?
  • 小程序根据主题色,动态修改svg颜色
  • 总结及注意点

小程序引用图片的几种方式

这一期我们直入主题,教大家如何动态改变图标的颜色。

首先,我们知道小程序引用图片的方式并不多。目前小程序并不支持直接引用svg文件,也不支持直接引用本地文件。总结下来,可行的方法有如下几种:

img的src引用

  1. 云文件的cloudID
  2. 图片的https链接
  3. 图片base64格式

字体图标

  1. 如uniapp的uni-icons插件,就是引用ttf文件,然后在text中使用图标对应的unicode码

background-image的url属性

  1. 图片的https链接
  2. data类型Url

注意:这篇文章针对纯色的svg进行改颜色,如果颜色不止一种,并不适用

小程序如何引用svg图片?

我们知道,如果直接引用图片,是很难修改颜色的,因为每个像素都已经填充了颜色,且进行了压缩。所以排除了img的src引用方式,以及background-image的第一种方式。

我们知道uni-icons的使用方法里可以配置icon的颜色,但是插件的图片有限,可能无法满足我们的需求。所以这里我们需要新的方法。

我们选择background-image的data类型url,引用svg格式的图片。具体怎么做呢?

首先,准备一个svg文件。svg很多图片都可以导出这种格式,如xd、iconfont等。我从iconfont中下载一个svg文件,如下:

<svg t="1576936511057" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1352" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M512.2 475.7c-8.2-0.3-16.1-2.4-23.4-6.1L192.6 330.2c-24.9-11.1-36.1-40.3-25-65.2 5-11.2 13.9-20.1 25-25l281.5-133.2a89.43 89.43 0 0 1 76 0L831.7 240c24.9 11.1 36.1 40.3 25 65.2-5 11.2-13.9 20.1-25 25L535.5 469.5c-7.2 3.8-15.2 5.9-23.3 6.2z m-76.5 452.5c-7.6 0-15.1-1.9-21.8-5.5L146.3 797.2c-17-8.9-27.5-26.5-27.3-45.6v-320c0.1-18 9.7-34.5 25.1-43.7 14.3-8.1 31.8-8.1 46.1 0l267.1 125.4c16.1 8.7 26.4 25.4 27.1 43.7v320.4c-0.2 17.9-9.6 34.4-24.9 43.7-7.2 4.3-15.4 6.8-23.8 7.1z m152.9 0c-8.3 0-16.5-2.2-23.8-6.3-15.3-9.3-24.7-25.8-24.9-43.7V556.9c0.4-18.2 10.4-34.8 26.2-43.7L835 387c14.2-7.5 31.4-7.1 45.2 1.1 15.5 9.1 25 25.7 25.1 43.7v319.8c0.4 18.9-9.7 36.5-26.2 45.6L610.5 922.8c-6.8 3.6-14.3 5.5-21.9 5.4z" p-id="1353" fill="#1296db"></path></svg>

可以看到,svg文件里用于路径颜色填充的属性是fill,fill后面跟了一个十六进制的颜色值,这是改颜色的关键所在。
这个svg文件是已经压缩好的,如果没有压缩,我们可以在线压缩以下先:在线压缩网址。
我们当然可以把svg直接转base64,然后用img src进行引用,但是base64编码后,我们无法修改其颜色。

那么有了这个svg文件,我们怎么在小程序中引用呢?

我们需要把这个svg格式先转为data类型的url。可以通过以下网址在线转换:在线svg内联格式生成。
这一步本质上是先对svg做了url-encode,主要是#</>这些符号做转义。然后在转义后的字符串前面加上data:image/svg+xml,字样。

转换后的svg格式如下:

"data:image/svg+xml,%3Csvg t='1576936511057' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='1352' xmlns:xlink='http://www.w3.org/1999/xlink' width='64' height='64'%3E%3Cdefs%3E%3Cstyle type='text/css'%3E%3C/style%3E%3C/defs%3E%3Cpath d='M512.2 475.7c-8.2-0.3-16.1-2.4-23.4-6.1L192.6 330.2c-24.9-11.1-36.1-40.3-25-65.2 5-11.2 13.9-20.1 25-25l281.5-133.2a89.43 89.43 0 0 1 76 0L831.7 240c24.9 11.1 36.1 40.3 25 65.2-5 11.2-13.9 20.1-25 25L535.5 469.5c-7.2 3.8-15.2 5.9-23.3 6.2z m-76.5 452.5c-7.6 0-15.1-1.9-21.8-5.5L146.3 797.2c-17-8.9-27.5-26.5-27.3-45.6v-320c0.1-18 9.7-34.5 25.1-43.7 14.3-8.1 31.8-8.1 46.1 0l267.1 125.4c16.1 8.7 26.4 25.4 27.1 43.7v320.4c-0.2 17.9-9.6 34.4-24.9 43.7-7.2 4.3-15.4 6.8-23.8 7.1z m152.9 0c-8.3 0-16.5-2.2-23.8-6.3-15.3-9.3-24.7-25.8-24.9-43.7V556.9c0.4-18.2 10.4-34.8 26.2-43.7L835 387c14.2-7.5 31.4-7.1 45.2 1.1 15.5 9.1 25 25.7 25.1 43.7v319.8c0.4 18.9-9.7 36.5-26.2 45.6L610.5 922.8c-6.8 3.6-14.3 5.5-21.9 5.4z' p-id='1353' fill='%231296db'%3E%3C/path%3E%3C/svg%3E"

我们将该svg文件保存在一个js中

//svg_model.js
const url = "data:image/svg+xml,%3Csvg t='1576936511057' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='1352' xmlns:xlink='http://www.w3.org/1999/xlink' width='64' height='64'%3E%3Cdefs%3E%3Cstyle type='text/css'%3E%3C/style%3E%3C/defs%3E%3Cpath d='M512.2 475.7c-8.2-0.3-16.1-2.4-23.4-6.1L192.6 330.2c-24.9-11.1-36.1-40.3-25-65.2 5-11.2 13.9-20.1 25-25l281.5-133.2a89.43 89.43 0 0 1 76 0L831.7 240c24.9 11.1 36.1 40.3 25 65.2-5 11.2-13.9 20.1-25 25L535.5 469.5c-7.2 3.8-15.2 5.9-23.3 6.2z m-76.5 452.5c-7.6 0-15.1-1.9-21.8-5.5L146.3 797.2c-17-8.9-27.5-26.5-27.3-45.6v-320c0.1-18 9.7-34.5 25.1-43.7 14.3-8.1 31.8-8.1 46.1 0l267.1 125.4c16.1 8.7 26.4 25.4 27.1 43.7v320.4c-0.2 17.9-9.6 34.4-24.9 43.7-7.2 4.3-15.4 6.8-23.8 7.1z m152.9 0c-8.3 0-16.5-2.2-23.8-6.3-15.3-9.3-24.7-25.8-24.9-43.7V556.9c0.4-18.2 10.4-34.8 26.2-43.7L835 387c14.2-7.5 31.4-7.1 45.2 1.1 15.5 9.1 25 25.7 25.1 43.7v319.8c0.4 18.9-9.7 36.5-26.2 45.6L610.5 922.8c-6.8 3.6-14.3 5.5-21.9 5.4z' p-id='1353' fill='%231296db'%3E%3C/path%3E%3C/svg%3E"
module.exports = url;

接下来,我们在一个模板中引用该svg。

<template><view><view :style="{backgroundImage: 'url('+svgData+')}'" class="icon"></view></view>
</template><script>import svg from './lib/svg_model.js'export default{data(){return {svgData:'"' + svg + '"',//需要在字符串前后加上一对引号(非常关键!)}},created(){}}
</script>
<style scoped>.icon{background-size: cover;display: inline-block;width: 70rpx;height: 70rpx;}
</style>

如果出现,说明引用成功!

小程序根据主题色,动态修改svg颜色

按照上述的格式,我们仅需要改变一个步骤,就可以修改svg的颜色。

原理是:先替换svg文件中所有的十六进制颜色为主题色,然后再填充到background-image的url中即可

我们写一个替换颜色的函数:

const changeColor = function(url,color){let res = url.replace(/%23[a-zA-Z0-9]{6}/g, color.replace("#", "%23"));//转义后的#等于%23,利用正则表达式,替换所有%23后6位为新的十六进制六位数。return res;
}

两行就搞定了,非常简单有木有~

然后,我们在created中替换svgData:

created(){this.svgData = changeColor(this.svgData,'#707070');
}

大功告成!

总结及注意点

这是自己摸索出来的方法,非常实用,分享给需要的你们。

需要注意的是,小程序目前好像不能支持svg中的text标签中的stroke属性,也就是如果有文字要改颜色,我建议你们把svg中的所有对象都转成path,这样统一修改fill后的颜色就可以了,肯定没问题。

未完待续,后面会陆续把小程序开发填的坑分享给大家,请持续关注哟~

uniapp之微信小程序开发——根据主题色动态修改svg的颜色相关推荐

  1. 微信小程序开发(一) 动态修改页面标题

    为提高微信小程序的用户体验,原则上设计页面时,页面顶部标题应随内容不同进行修改. 微信小程序固定架构 pages example example.js example.json example.wxm ...

  2. uniapp + vue3微信小程序开发(4)身份信息认证

    微信是无法获取用户的身份证信息,那么我们可以自己通过上传或者拍摄身份证,然后结合ocr进行识别,那么最后为了保证准确性,再通过人脸识别来比对,辨别是不是本人,关于人脸识别,在我这篇博客里介绍了 uni ...

  3. uniapp + vue3微信小程序开发(1)框架搭建

    uniapp内置vue2,很多小伙伴喜欢用,但是作为首批吃螃蟹的人,肯定会想用vue3来开发,那么会遇到哪些问题呢? 1.编辑器等工具 Hbuilder X 3.4.6版本及以上(编辑器也在不断更新, ...

  4. uniapp + vue3微信小程序开发(5)授权

    不知道大家在小程序授权的时候,会不会点击拒绝授权,然后第二次进来,哦豁..授权框就在也出不来了,这种问题,在很多线上正在使用的小程序也会出现的问题,所以说,大家貌似都不太注意这方面问题,下面就是我对这 ...

  5. uniapp 微信小程序配置全局主题色、实现动态修改主题色

    前言: 本文的实现目标是全局配置小程序的整体主题色,包括本地图标的色调.第一步实现在本地可以统一修改整体的主题色以及本地图标的颜色:第二步实现通过后台接口动态调整小程序前端的整体主题色以及本地图标颜色 ...

  6. uniapp + vue3微信小程序开发(3)微信授权登录

    整体思路: 接口获取openId => 用户微信信息入库 => 手机号授权入库 逻辑详解: 我们知道小程序都是需要openId的,那我们可以通过前端获取,也可以通过后端接口获取, 前端就是 ...

  7. uniapp手写_【转】uni-app框架纯手写微信小程序开发左侧滑动菜单

    本帖最后由 fengrui99 于 2020-7-22 14:38 编辑 原文来自:在学习的uni-app的微信小程序开发路上慢慢开始不一直依赖插件(但是使用插件是真的香,一直用一直香) 在大佬的指引 ...

  8. uniapp手写_uni-app框架纯手写微信小程序开发左侧滑动菜单

    原来到最后才发现有些东西,没有就真的没有.不行,就真的不行 唠叨一会 在学习的uni-app的微信小程序开发路上慢慢开始不一直依赖插件(但是使用插件是真的香,一直用一直香),在大佬的指引下学会自己去写 ...

  9. 1个月uni-app微信小程序开发上线实战专栏介绍

    一.专栏介绍: <uni-app开发微信小程序1个月上线实战>,目标带领1000位同学成功开发上线一个自己的个人小程序! 作者介绍:国服第二切图仔--资深前端开发工程师,具有六年以上的前端 ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task09. 环形链表
  2. [剑指offer]面试题第[67]题[Leetcode][JAVA][第8题] 字符串转换整数 (atoi)[字符串]
  3. TCP通信过程大讨论
  4. python 局域网主机扫描_python扫描局域网主机名
  5. c语言不用switch做计算器,求助这个题目~不用switch语句用多重if 或者嵌套if的做法...
  6. 淘宝API接口 item_search - 按关键字搜索淘宝商品
  7. Ubuntu服务器用户磁盘空间quota分配
  8. PHP添加文字图片水印
  9. 【RDMA】infiniband网卡安装|ib网卡命令|ibdump 用法说明
  10. 如何破坏Excel文件,让其显示文件已损坏方法
  11. php 上传图片方法
  12. web浏览器兼容性问题
  13. mysql数据库角色的使用
  14. rdo远程桌面管理快捷键在哪里?
  15. 领导艺术-八项管理定律
  16. 和ASP.NET AJAX应用程序环游地球
  17. 十四五数字经济发展规划出台 数字化转型为企业带来新的发展机遇
  18. 报表动态配置的技术实现
  19. 【架构】Lambda架构
  20. 设计分享|单片机按键控制继电器实现灯亮灭

热门文章

  1. CDEC2021 | 智领云CTO宋文欣:构建云原生数据中台,赋能合作伙伴
  2. C语言 - 深度剖析数据的存储
  3. Diagnostics - DID, DTC区别与联系
  4. [BZOJ4668]冷战
  5. PRML学习总结(6)——Kernel Methods
  6. 并发批量管理500台以上服务器脚本分享(shell版)
  7. 唯品会亿级数据服务平台实践
  8. 我与我的专业计算机作文500字,电脑让我欢喜让我忧作文500字
  9. 【BLE】nrf connect配置为服务端进行蓝牙主从通信实验
  10. SpringBoot集成MyBatis(微服务)