svg 使用中的疑惑点
svg,g ,defs,symbol 都是容器元素,使用起来给人许多疑惑
svg-spirite-loader在页面生成的svg标签有什么特点?
svg标签里面的symbol有什么用?
这些标签能够随意相互包裹么?
不能任意嵌套
经过实验发现:
- svg>g>svg>g可以任意嵌套
- defs symbol嵌套不会展示,因为这两个容器本来就不会展示
<svg xmlns="http://www.w3.org/2000/svg" style="fill: #cccccc" viewBox="0 0 8 8" width="16" height="16">
<g id="user-icon">
<g>
<g>
<svg>
<path id="user-icon_Rectangle-2" class="st0"
d="M4,0L4,0c2.21,0,4,1.79,4,4l0,0c0,2.21-1.79,4-4,4l0,0C1.79,8,0,6.21,0,4l0,0 C0,1.79,1.79,0,4,0z"></path>
<path id="user-icon_Combined-Shape-Copy" class="st1"
d="M4.23,2.94l0.52,1.59l1-0.85C5.7,3.61,5.67,3.52,5.67,3.43C5.67,3.19,5.85,3,6.08,3 C6.31,3,6.5,3.19,6.5,3.43c0,0.22-0.17,0.41-0.38,0.43L5.67,6H2.33L1.88,3.86C1.67,3.84,1.5,3.65,1.5,3.43C1.5,3.19,1.69,3,1.92,3 s0.42,0.19,0.42,0.43c0,0.09-0.03,0.18-0.08,0.25l1,0.85l0.52-1.59C3.62,2.86,3.51,2.69,3.51,2.5C3.51,2.22,3.73,2,4,2 s0.49,0.22,0.49,0.5C4.49,2.69,4.38,2.86,4.23,2.94z"
fill="#ffffff"></path>
</svg>
</g>
</g>
</g>
</svg>
可以用上面的例子测试
必须包裹在svg内部
g,defs,symbol use 外面必须包裹svg元素,否则这些元素是不起作用的;
// g元素外层没有svg元素
<g id="g1">
<rect id="rect1" width="1000" height="50" x="10" y="10" fill="#c00"/>
<circle id="circle1" cx="30" cy="30" r="10" fill="#00c"/>
</g>
<svg>
<use xlink:href="#g1" />
</svg>
单独一个g元素不会渲染;也不能被use元素复用
// g元素外层有svg元素
<svg>
<g id="g1">
<rect id="rect1" width="1000" height="50" x="10" y="10" fill="#c00"/>
<circle id="circle1" cx="30" cy="30" r="10" fill="#00c"/>
</g>
</svg>
<svg>
<use xlink:href="#g1" />
</svg>
上面的html能渲染出来两组图像。
g元素
g是用来组合读写的容器,看名字像是group的缩写,添加到g元素上的变换会应用到其所有的子元素上。
添加到g元素的属性会被其所有的子元素继承;比如fill会被子元素继承。
此外,g元素也可以用来定义复杂的对象,之后可以通过use元素来引用它们。
<svg style="width: 1000px" viewBox="10 10 1000 50">
<g id="aaa" fill="#ccc">
<rect id="rect1" width="1000" height="50" x="10" y="10" />
<circle id="circle1" cx="30" cy="30" r="10" fill="#00c"/>
</g>
</svg>
<svg style="width: 1000px" viewBox="10 10 1000 50">
<use xlink:href="#aaa" />
</svg>
use复用
use元素在SVG文档内取得目标节点,并在别的地方复制它们。它的效果等同于这些节点被深克隆到一个不可见的DOM中,然后将其粘贴到use元素的位置。
克隆之后样式可能会复制过去:
<style>
.special g{
fill: #0b97c4;
}
.clone g{
fill: red;
}
</style>
<div class="special">
<svg style="width: 1000px" viewBox="10 10 1000 50">
<g id="aaa" >
<rect id="rect1" width="1000" height="50" x="10" y="10" />
</g>
</svg>
</div>
<svg style="width: 1000px" viewBox="10 10 1000 50">
<use xlink:href="#aaa" />
</svg>
克隆导致上面渲染出来两个长方形颜色一致。
use出来的svg的颜色没有变成红色说明css选择器在此处不再起作用了。
此时如何去更改颜色呢,看调整svg颜色
defs
def -->define 定义以后需要重复使用的图形元素。
建议把所有需要再次使用的引用元素定义在defs元素里面。这样做可以增加SVG内容的易读性和可访问性。
在defs元素中定义的图形元素不会直接呈现。
你可以在你的视口的任意地方利用 元素呈现这些元素。
<div class="special">
<svg style="width: 1000px" viewBox="10 10 1000 50">
<defs>
<g id="aaa" >
<rect id="rect1" width="1000" height="50" x="10" y="10" />
</g>
</defs>
</svg>
</div>
<svg style="width: 1000px" viewBox="10 10 1000 50">
<use xlink:href="#aaa" />
</svg>
使用defs之后只能看到一个长方块。
symbol元素
symbol元素用来定义一个图形模板对象,它可以用一个元素实例化。
symbol元素对图形的作用是在同一文档中多次使用,添加结构和语义,和g,defs类似。
symbol元素本身是不呈现的。只有symbol元素的实例(亦即,一个引用了symbol的 元素)能呈现,类似于defs。
symbol 和svg 一样也可以使用viewBox。
vue中使用svg-sprite-loader之后就会在页面的body下面渲染一个下面结构的html代码
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
style="position: absolute; width: 0; height: 0" aria-hidden="true" id="__SVG_SPRITE_NODE__">
<symbol xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-7 1 24 24"
id="Sync">
<style type="text/css">
#Sync .st0 {
fill: none;
}
</style>
<desc>Created with Sketch.</desc>
<rect id="Sync_Rectangle-111" x="-7" y="1" class="st0" width="24" height="24"></rect>
<g>
<path d="M5,19.5c-2.9,0-5.3-1.9-6.2-4.5H1v-1h-2.4H-2h-0.4H-3v4h1v-2.3c1.1,2.8,3.8,4.8,7,4.8c3.8,0,6.9-2.8,7.4-6.5h-1 C10.9,17.1,8.2,19.5,5,19.5z"></path>
<path d="M12,8v2.3c-1.1-2.8-3.8-4.8-7-4.8c-3.8,0-6.9,2.8-7.4,6.5h1C-0.9,8.9,1.8,6.5,5,6.5c2.9,0,5.3,1.9,6.2,4.5H9v1h2.4H12h0.4 H13V8H12z"></path>
</g>
</symbol>
</svg>
调整svg大小
<svg>
<g id="g1">
<rect id="rect1" width="1000" height="50" x="10" y="10" fill="#c00"/>
</g>
</svg>
对上面的svg设置width="100" height="5"
或者 style="width:100px;height:5px"
之后,图像直接消失了。
消失的原因在于图像的位置在偏离左上角10px,10px的位置,设置svg的展示区域是从0,0偏离到width,height;而此处height只有5px,导致不能看到图像。
所以一般需要viewBox这个属性,值为:x y width height
,功能类似于截取svg图像;如果图像的尺寸/偏移和viewBox一致,放大缩小的操作作用域整个图像;如果viewBox和图像原始尺寸/偏移不一致,会导致只能展示一部分的图像。
<svg viewbox="0 0 1000 50"> // 设置原始值之后,然后设置属性或者样式就能完美生效了。
调整svg颜色
一般的svg有背景和图案组成,背景色透明,由页面背景决定;图案的颜色根据svg元素的继承特点使用fill设定。
方法一:
svg{
fill:red;
} // 需要特意设置fill
方法二:
svg{
fill:currentColor;
color:red;
} // 只需要设置color
特殊情况:
如果预先在内部设定了背景色或者图案色,
<svg xmlns="http://www.w3.org/2000/svg" class="special icon-user-icon icon-s-normal-tny" style="fill: #cccccc" viewBox="0 0 8 8" width="16" height="16">
<g id="user-icon">
<style type="text/css">
#user-icon .st1 {
fill: #ffffff;
}
</style>
<path id="user-icon_Rectangle-2" class="st0"
d="M4,0L4,0c2.21,0,4,1.79,4,4l0,0c0,2.21-1.79,4-4,4l0,0C1.79,8,0,6.21,0,4l0,0 C0,1.79,1.79,0,4,0z"></path>
<path id="user-icon_Combined-Shape-Copy" class="st1"
d="M4.23,2.94l0.52,1.59l1-0.85C5.7,3.61,5.67,3.52,5.67,3.43C5.67,3.19,5.85,3,6.08,3 C6.31,3,6.5,3.19,6.5,3.43c0,0.22-0.17,0.41-0.38,0.43L5.67,6H2.33L1.88,3.86C1.67,3.84,1.5,3.65,1.5,3.43C1.5,3.19,1.69,3,1.92,3 s0.42,0.19,0.42,0.43c0,0.09-0.03,0.18-0.08,0.25l1,0.85l0.52-1.59C3.62,2.86,3.51,2.69,3.51,2.5C3.51,2.22,3.73,2,4,2 s0.49,0.22,0.49,0.5C4.49,2.69,4.38,2.86,4.23,2.94z"
fill="#ffffff"></path>
</g>
</svg>
<svg class="sdsdsd" style="width: 16px;fill:red" viewBox="0 0 8 8">
<use xlink:href="#user-icon"/>
</svg>
<style>
.special .st1{
fill: blue!important;
}
body .sdsdsd .st1{
fill: orange!important;
}
</style>
比如上面的svg内部定义了一个style,直接设定了样式。外部使用style又设置了样式。非use使用(.special )可以改变内部path的fill;使用use情况(.sdsdsd)无法改变内部path的fill,css选择器在此处失效了,无法覆盖旧有样式。
如果必须要控制样式怎么办呢?
这时候可以使用css变量来定义内部的样式,通过改变css变量的值来修改颜色。
<svg xmlns="http://www.w3.org/2000/svg" class="special icon-user-icon icon-s-normal-tny" style="fill: #cccccc" viewBox="0 0 8 8" width="16" height="16">
<g id="user-icon">
<style type="text/css">
#user-icon .st1 {
fill: var(--color);
}
</style>
<path id="user-icon_Rectangle-2" class="st0"
d="M4,0L4,0c2.21,0,4,1.79,4,4l0,0c0,2.21-1.79,4-4,4l0,0C1.79,8,0,6.21,0,4l0,0 C0,1.79,1.79,0,4,0z"></path>
<path id="user-icon_Combined-Shape-Copy" class="st1"
d="M4.23,2.94l0.52,1.59l1-0.85C5.7,3.61,5.67,3.52,5.67,3.43C5.67,3.19,5.85,3,6.08,3 C6.31,3,6.5,3.19,6.5,3.43c0,0.22-0.17,0.41-0.38,0.43L5.67,6H2.33L1.88,3.86C1.67,3.84,1.5,3.65,1.5,3.43C1.5,3.19,1.69,3,1.92,3 s0.42,0.19,0.42,0.43c0,0.09-0.03,0.18-0.08,0.25l1,0.85l0.52-1.59C3.62,2.86,3.51,2.69,3.51,2.5C3.51,2.22,3.73,2,4,2 s0.49,0.22,0.49,0.5C4.49,2.69,4.38,2.86,4.23,2.94z"
fill="#ffffff"></path>
</g>
</svg>
<svg class="sdsdsd" style="width: 16px;fill:red" viewBox="0 0 8 8">
<use xlink:href="#user-icon"/>
</svg>
<style>
.special {
--color: blue!important;
}
body .sdsdsd {
--color: orange!important;
}
</style>
成功改变了颜色,但是此处又让人疑惑:使用css变量之后 css选择器好像又生效了......
svg 使用中的疑惑点的更多相关文章
- numpy使用中的疑惑
numpy中有一些常用的用来产生随机数的函数,randn就是其中一个,randn函数位于numpy.random中,函数原型如下: numpy.random.randn(d0, d1, ..., dn ...
- react-router(v4)
概要 开发单页应用, 首先绕不开的内容就是路由, react router v4 版本是最新的版本. 和之前的版本相比, 成熟了很多, 也简单了很多, 使用起来更加方便. 核心 component r ...
- Caffe和py-faster-rcnn日常使用备忘录
罗列日常使用中遇到的问题和解决办法.包括: { caffe使用中的疑惑和解释: 无法正常执行 train/inference 的情况: Caffe基础工具的微小调整,比如绘loss曲线图: 调试pyt ...
- 理解SVG坐标系统和变换: transform属性
SVG元素可以通过缩放,移动,倾斜和旋转来变换-类似HTML元素使用CSS transform来变换.然而,当涉及到坐标系时这些变换所产生的影响必然有一定差别.在这篇文章中我们讨论SVG的transf ...
- 理解SVG坐标系和变换:视窗,viewBox和preserveAspectRatio
SVG元素不像HTML元素一样由CSS盒模型管理.这使得我们可以更加灵活定位和变换这些元素-也许一眼看上去不太直观.然而,一旦你理解了SVG坐标系和变换,操纵SVG会非常简单并且很有意义.本篇文章中我 ...
- Windows程序设计笔记(二) 关于编写简单窗口程序中的几点疑惑
在编写窗口程序时主要是5个步骤,创建窗口类.注册窗口类.创建窗口.显示窗口.消息环的编写.对于这5个步骤为何要这样写,当初我不是太理解,学习到现在有些问题我基本上已经找到了答案,同时对于Windows ...
- 该如何以正确的姿势插入SVG Sprites?
大家好,我是苏南,今天要给大家分享的是SVG sprite(也叫雪碧图),所谓雪碧图,当然就不是我们常喝的雪碧饮料(Sprites)哦,哈哈- 当下流程的移动端,手机型号太多太多,今天工作项目中突然发 ...
- 使用icomoon把svg图片生成字体图标
今天看了使用icomoon来将svg转换成图标字体,本来是不会使用别人给的svg,也不清楚具体的好处是什么,查了svg以后,越来越懵,svg挺好的为什么要转成图标字体呢. 一.SVG介绍 SVG 是一 ...
- SVG路径动画解密
原文:SVG路径动画解密 原文链接:http://www.gbtags.com/gb/share/5581.htm SVG路径动画效果现在貌似越来越多网站都使用了,给我的感觉就像是一段时间的流行而已, ...
随机推荐
- 小师妹学JVM之:JDK14中JVM的性能优化
目录 简介 String压缩 分层编译(Tiered Compilation) Code Cache分层 新的JIT编译器Graal 前置编译 压缩对象指针 Zero-Based 压缩指针 Escap ...
- MFC中窗口启动后,CEdit编辑框默认光标位置设置,顺序的调节方法
MFC中窗口启动后,CEdit编辑框默认光标位设置,顺序的调节方法 在编辑界面按下ctrl+D键,就会出现所有控件的Tab键顺序,按照自己想要的顺序依次点击控件,就可以重新安排顺序.数值1就是默认停留 ...
- Appium 自动化实例代码
自动化连接 B站 开始 如果下载node.js 的话 可以检查一下appium环境 命令行: appium-doctor 如果没有 可以安装 appium-doctor :npm install ...
- WeChair项目Beta冲刺(4/10)
团队项目进行情况 1.昨日进展 Beta冲刺第四天 昨日进展: 前后端并行开发,项目按照计划有条不絮进行 2.今日安排 前端:扫码占座功能和预约功能并行开发 后端:扫码占座后端逻辑和预约功能逻辑 ...
- javaScript深入浅出之理解闭包
javaScript深入浅出之理解闭包 引言 闭包是个老生长谈的话题了,对于闭包网上也有很多不同的看法 <你不知道的javaScript>对于闭包是这么定义的:函数创建和函数执行不在同一个 ...
- .NETCore微服务探寻(二) - 认证与授权
前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...
- 面试题40:最小的 k 个数
import java.util.Arrays; /** * Created by clearbug on 2018/2/26. * * 面试题40:最小的 k 个数 * * 注意:因为前两天在陌陌面 ...
- Redis设置并查看最大连接数
在 Redis2.4 中,最大连接数是被直接硬编码在代码里面的,而在2.6版本中这个值变成可配置的. maxclients 的默认值是 10000,你也可以在 redis.conf 中对这个值进行修改 ...
- JavaWeb网上图书商城完整项目--day02-28.查询所有分类功能之left页面使用Q6MenuBar组件显示手风琴式下拉菜单
首先页面去加载的时候,会去加载main.js文件,我们在加载left.jsp.top.jsp body.jsp,现在我们修改main.jsp的代码,让它去请求的时候去访问的是不在直接去访问left.j ...
- Windows10系统下安装配置Tomcat 9.0.1
Tomcat9.0.1下载:https://tomcat.apache.org/download-90.cgi 配置jdk的环境变量(略) 在系统变量里新建变量名:CATALINA_BASE,变量值: ...