svg矢量图标在html中的使用, (知识点:1.通过h5中的css实现点击变色,2.一个svg文件包含多个图标)
svg矢量文件体积小,不变形,比传统的png先进,比现在流行的icon-font灵活。然而在使用过程中还是遇到了很多坑。今天花了一天时间把经验整理出来,以供后来者借鉴。如果您从本文收益,请留言mark一下。
这里我们要实现的功能是,一个svg文件包含多个图形,这样的好处是,网络请求次数少,加载快速。否则一个网页有10个图标就要请求10次。
一、制作svg
1.用记事本新建一个mysvg.svg , 里面内容如下
<svg xmlns="http://www.w3.org/2000/svg">
</svg>
2.用 ai 制作了一个 svg文件, 把这个文件中的<svg>部分替换成symbol, 去掉所有属性,只保留viewbox ,并增加一个id属性(便于引用),然后拷贝到mysvg.svg中的svg标签中间 方便引用。
如下图:
<svg xmlns="http://www.w3.org/2000/svg">
<symbol viewBox="70 -135 400 400" id="buy">
<path class="st0" d="M360.8,215.5c-12.1,0-21.9,10.3-21.9,23.1s9.8,23.1,21.9,23.1s22-10.3,22-23.1S373,215.5,360.8,215.5z ">
<set to="blue" begin="click" restart="always" fill="remove" attributeName="fill"></set>
</path>
<path class="st0" d="M206.2,217.1c-11.7,0-21.2,10-21.2,22.3s9.5,22.3,21.2,22.3s21.2-10,21.2-22.3
C227.3,227.1,217.9,217.1,206.2,217.1z"/>
<path class="st0" d="M398.7,181.7c-0.2,0-0.3,0-0.5,0.1c-0.1,0-0.2-0.1-0.2-0.1H214.7c-15.8,0-17.5-3.6-20.7-15.1
c-0.8-3-1.7-6.2-2.7-9.7l188-27.9c24.1-3.6,28.4-14.5,28.4-34.7V45.8c0-17.6-13.7-32-30.4-32H192.5h-0.1c-0.1,0-0.2,0-0.3,0
c-6.6,0-12,5.8-12,13.1s5.4,13.1,12,13.1c0.1,0,0.2,0,0.3,0h0.1h173.6c8.4,0,15.2,7.2,15.2,16v22.6c0,14.2-0.4,16.6-15.4,18.8
l-183,28.9c-18-66.2-44-162.6-44-162.6c-0.9-3.5-3.9-5.8-7.3-5.8H95.1c-0.1,0-0.2,0-0.3,0.1c-0.2,0-0.4-0.1-0.6-0.1
c-6.7,0-12.2,5.9-12.2,13.3c0,7.3,5.4,13.3,12.2,13.3c0.2,0,0.5-0.1,0.7-0.1c0.1,0,0.1,0.1,0.2,0.1h18.4
c7.5,27.8,39.9,148,53.4,197.1c4.8,17.3,11.8,26.7,35.3,26.7h195.7c0.1,0,0.1,0,0.2,0c0.2,0,0.3,0.1,0.5,0.1
c6.7,0,12.2-5.9,12.2-13.3C410.9,187.6,405.4,181.7,398.7,181.7z"/>
</symbol>
<symbol viewBox="70 -135 400 400" id="sell">
<path class="st0" d="M206.2,217.1c-11.7,0-21.2,10-21.2,22.3s9.5,22.3,21.2,22.3s21.2-10,21.2-22.3
C227.3,227.1,217.9,217.1,206.2,217.1z"/>
</symbol>
</svg>
可如此增加多个svg文件到单独的svg文件中国
二、html中引用这个svg
css:
<style>
.mytest{
fill:#00f;
background-color:#600;
}
/* 点击时的样式
.mytest:active{
fill:#0f0;
}
</style>
html:
<svg class="mytest" ><use xlink:href="/images/mysvg.svg#buy" /></svg>
<svg class="mytest" ><use xlink:href="/images/mysvg.svg#sell" /></svg>
至此,已经实现。
注意:
1这样制作的svg无法通过img的src或 div的background-image引入
2.通过use 引入外部svg文件时, 在.svg文件中指定的css(用 <style>标记的属性),以及filter(滤镜),渐变色等通过ID的引用都不起作用。(直接指定的元素属性如fill stroke等可以生效)
需要在use所在的html文件中写css或filter,或渐变色
svg内部定义style方法如下
<style type="text/css"><![CDATA[
.green { fill: red; stroke: blue; stroke-width: 3 }
]]> </style>
但这样一来,svg代码就很分散了,吃相很差。 有一种最优雅的方式:直接将<svg>写到html文件中,这样svg中的css,filter,滤镜等都可以生效。但是这样html文件很臃肿,而且svg无法复用。
再进一步,还有两种方法
A.通过js 的ajax获取svg文件后附加到html中。
B:我开发用的是asp.net core, 在cshtml中插入下面一段
<div style="height:0px;">
@Html.Raw(Model.Include("/myEditor/dist/expression.svg"));
</div>
其中Include是模型类中写的一个方法,用于读取文件内容返回字符串。这种方式打开更快,因为客户端没有额外的http请求。注意这里之所以要用div包围住,就是因为svg会占用空间。而且div的display不能为none,否则css,filter,渐变色等引用会失效。
看到很多网站在用<!-- include file =""--> 来在html中包含另一个html,但是现在在asp.net core中似乎已经不起作用了,只能通过手动写个方法来实现同样功能。
3.通过<img> 或background引入svg时,svg文件中的css可起作用
4.<img>不可以引用symbol <img src=“/aaa.svg#haha"/>是不行的
5.使用symbol时 filter(滤镜)不能在svg内部定义,只能在use的地方定义
<filter id="blurMe">
<feGaussianBlur in ="SourceGraphic" stdDeviation="22" result="g1"/>
<feComposite in="g1" in2="g1" result="g2" operator="in"/>
<feComposite in="g2" in2="g1" result="g3" operator="in"/>
</filter>
<circle id="red_shy" fill="#D5234C" r="50" y="90" filter="url(#blurMe)">
6.
参考文献:https://blog.csdn.net/u010582082/article/details/70195629
svg矢量图标在html中的使用, (知识点:1.通过h5中的css实现点击变色,2.一个svg文件包含多个图标)的更多相关文章
- 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)
原文:在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据) 我们都知道,在asp.net中修改 ...
- Android中使用SVG矢量图(一)
SVG矢量图介绍 首先要解释下什么是矢量图像,什么是位图图像? 1.矢量图像:SVG (Scalable Vector Graphics, 可伸缩矢量图形) 是W3C 推出的一种开放标准的文本式矢量图 ...
- Android SVG矢量资源的使用方法
VectorDrawable 与 SVG Android 5.0(Lollipop, API 21)后,新增了<vector>标签,以VectorDrawable的形式支持SVG类型矢量图 ...
- Android使用SVG矢量创建很酷的动态效率!
尊重原创,欢迎转载.转载请注明: FROM GA_studio http://blog.csdn.net/tianjian4592 一个真正酷炫的动效往往让人虎躯一震,话不多说.咱们先瞅瞅效果: ...
- Android使用SVG矢量动画(二)
上篇我们学习了怎么显示SVG矢量图像,当然还有一个更强大的功能,就是让SVG图像动起来,先上一张效果图吧: 要实现上述动画效果,就得用AnimatedVectorDrawable这个类了,它就是负责V ...
- Android 使用 SVG 矢量图
android svg矢量图 可能包含的操作有: SVG图还包括改变颜色,透明度,大小,矩阵操作(平移.旋转.缩放),selector, (图标,背景,按钮),动画,等 setTint(int Col ...
- Perl+OpenGL 重绘inkscape生成的svg矢量图
Perl+OpenGL 重绘inkscape生成的svg矢量图 还不够完善,先挖个坑,后面慢慢填 Code: [全选] [展开/收缩] [Download] (Untitled.pl) =info A ...
- SVG矢量动画
一.概述 相较于png.jpg等位图通过存储像素点来记录图像,svg (Scalable Vector Graphics)拥有一套自己的语法,通过描述的形式来记录图形.Android并不直接使用原始的 ...
- Logo小变动,心境大不同,SVG矢量动画格式网站Logo图片制作与实践教程(Python3)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_207 曾几何时,SVG(Scalable Vector Graphics)矢量动画图被坊间称之为一种被浏览器诅咒的技术,只因为糟糕 ...
随机推荐
- python --爬虫基础 --爬取今日头条 使用 requests 库的基本操作, Ajax
'''思路一: 由于是Ajax的网页,需要先往下划几下看看XHR的内容变化二:分析js中的代码内容三:获取一页中的内容四:获取图片五:保存在本地 使用的库1. requests 网页获取库 2.fro ...
- leetcode-139-单词拆分(递归超时,动归解决)
题目描述: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字 ...
- [原创]php任务调度器 hellogerard/jobby
目录 简介 安装 标准使用 选项 项目实践 简介 一个强大的php层面上的定时任务调度器, 无需修改系统层面的crontab 实际中, php 结合 crontab 来实现定时任务是一种经得住考验的实 ...
- G - Game HDU - 5242 (数链剖分)
题目链接: G - Game HDU - 5242 题目大意:首先是T组测试样例,给出一颗以1节点为根的树,每个节点有各自的价值,有m次从根节点出发向下走到叶子节点的机会,每次会得到所有经过节点的权值 ...
- You need to use a Theme.AppCompat theme (or descendant) with this activity问题
You need to use a Theme.AppCompat theme (or descendant) with this activity问题 https://blog.csdn.net/j ...
- ArrayList分析
ArrayList概述 ArrayList继承了AbstractList,实现了List接口,底层基于动态数组,容量大小可以动态变化,ArrayList中可以添加null元素,另外,ArrayList ...
- 语言模型预训练方法(ELMo、GPT和BERT)——自然语言处理(NLP)
1. 引言 在介绍论文之前,我将先简单介绍一些相关背景知识.首先是语言模型(Language Model),语言模型简单来说就是一串词序列的概率分布.具体来说,语言模型的作用是为一个长度为m的文本确定 ...
- (一)Audio子系统之AudioRecord.getMinBufferSize
在文章<基于Allwinner的Audio子系统分析(Android-5.1)>中已经介绍了Audio的系统架构以及应用层调用的流程,接下来,继续分析AudioRecorder方法中的ge ...
- $scope作用域与依赖注入
一.$scope与$rootscope作用域 $scope下的数据作为该控制器下的数据moduel,只有在该控制器下才能够访问:而$rootScope则可以可以再任何有效的地方访问到,这个有效的地方指 ...
- java的instanceof简单使用
instanceof:是java中用来判断一个对象属于哪个类型的关键字 (instanceof是instance和of两个单词组成,但of并没有大写) eg: public class Test{ ...