在 Vue 中编写 SVG 图标组件的方法
在考虑了将矢量图标从图标字体迁移到内联SVG的原因之后,我在Vue.js中找到了一个用SVG替换图标字体的解决方案,同时仍能保持使用图标字体的灵活性和易用性——能够使用CSS轻松改变图标的大小、颜色以及其它属性。
一种流行的方法是使用v-html指令和npm模块html-loader来将SVG导入到我们的Vue模板中,并在Vue的生命周期函数mounted()中修改渲染的
创建Svg-icon组件
让我们创建Svg-icon.vue组件文件,并在里面接收三个prop变量。
- icon是一个字符串类型的prop变量用来传递.svg文件名的导入
- hasFill是一个布尔类型的prop变量来告诉组件fill属性是否用于更改
元素的颜色,默认值为false即不使用fill属性 - growByHeight是一个布尔类型的prop变量来决定height或width是否相对于font-size进行缩放,默认值为true即使用height
我们将.svg图标文件通过require()传递给html-loader方法,该方法会将文件字符串化,并且通过v-html指令将其渲染为
所有对
- 将由growByHeight定义的
元素的height或width属性设置为1em(font-size的一倍)并对另一个元素使用widthToHeight。由于并非所有的SVG都是正方形的,因此我们从渲染的元素计算withToHeight比率,以便SVG在父元素的font-size属性大小改变的时候按比例缩放到其原始尺寸。 - 为了设置
元素的fill属性,我们需要覆盖掉SVG文件内部附带的fill属性。当hasFill值为true的时候,我们从 元素及其子元素中递归地删除fill属性。然后使用CSS选择器将fill值添加到其父元素或 元素就可以了。 - 还可以向元素中添加例如class等其它DOM属性,这些属性可用于设置组件中的范围样式
创建微笑图标
让我们使用FontAwesome和我们的Svg-icon组件中的图标字体创建一个微笑图标。
使用图标字体
.smile-icon{ font-size:24px; color:#aaa; &:hover{ color:#666; } }
.smile-icon类的CSS选择器以及伪类选择器:hover来设置图标的font-size和color属性。
使用Svg-icon组件
上面的实现和图标字体方法相同,除了.smile-icon类在父元素中,在Svg-icon组件中,color属性被替换为fill。我们还必须确保smile-solid.svg文件位于Svg-icon组件的require()方法指定的路径(./assets/svg/)中。
渲染成HTML
这是由v-html的输出渲染的HTML。注意:会删除掉所有的fill属性,并将height和width属性添加到