<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
npm install svg-sprite-loader -D
或者
yarn add svg-sprite-loader -D
const path = require('path'); module.exports = { chainWebpack:config =>{ const dir = path.resolve(__dirname,'src/assets/icons') config.module .rule('svg-sprite') .test(/.svg$/) .include.add(dir).end() //設定 icons 目錄走 svg-sprite 規則 .use('svg-sprite-loader').loader('svg-sprite-loader').options({extract : false}).end() .use('svgo-loader').loader('svgo-loader') .tap(options => ({...options,plugins:[{removeAttrs:{attrs:'fill'}}]})).end()//安裝外掛去除svg中的fill屬性 config.plugin('svg-sprite').use(require('svg-sprite-loader/plugin'),[{plainSprite: true}]) config.module.rule('svg').exclude.add(dir)//其他svg loader 排除 icons 目錄 } }
也可以這麼設定
const { defineConfig } = require('@vue/cli-service') // 加在頭部 const path = require('path') function resolve (dir) { return path.join(__dirname, dir) } module.exports = defineConfig({ transpileDependencies: true, chainWebpack (config) { config.plugins.delete('prefetch') // set svg-sprite-loader config.module .rule('svg') .exclude.add(resolve('src/assets/icons')) .end() config.module .rule('icons') .test(/.svg$/) .include.add(resolve('src/assets/icons')) .end() .use('svg-sprite-loader') .loader('svg-sprite-loader') .options({ // symbolId: 'icon-[name]' symbolId: '[name]' }) .end() } })
注意:src/assets/icons這個資料夾放著你的svg檔案
<template> <div class="icon-wrapper"> <svg class="icon" aria-hidden="true"> <use :href="iconName" rel="external nofollow" ></use> </svg> </div> </template> <script> export default { name: 'IconSvg', props: { name: String, prefix: { type: String, default: 'icon-' } }, computed: { iconName() { // return `#${this.prefix}${this.name}` return `#${this.name}` } } } </script> <style scoped> .icon-wrapper { display: inline-block; } .icon { width: 100%; height: 100%; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } </style>
import Vue from 'vue' import App from './App.vue' import router from './router' // 引入原生的svg檔案 // 定義一個載入目錄的函數 const requireAll = requireContext => requireContext.keys().map(requireContext) const req = require.context('./assets/icons', false, /.svg$/) // 載入目錄下的所有的 svg 檔案 requireAll(req) // 全域性註冊IconSvg元件 const IconSvg = () => import('./components/svg/IconSvg'); const components = { IconSvg } Object.keys(components).forEach(item => { Vue.component(item, components[item]) }) Vue.config.productionTip = false new Vue({ router, render: h => h(App) }).$mount('#app')
使用的話有多種形式,我們一個一個來看。
1、使用自己編寫的svg檔案
在src/assets/icons資料夾下面建立circle.svg(一定是這個資料夾,因為這個資料夾下的svg檔案會被你的svg外掛解析)
<?xml version="1.0"?> <svg viewBox="0 0 120 120" version="1.1" xmlns="http://www.w3.org/2000/svg"> <circle cx="60" cy="60" r="50"/> </svg>
經過svg-sprite-loader外掛的解析,你在html裡面可以看到有個id為circle(和svg名稱一樣)的一個symbol標籤掛載在svg標籤下面
這個時候直接使用就可以了
<template> <div class="home"> <IconSvg name="circle"/> </div> </template> <script> export default { name: 'HomeView', components: { } } </script> <style scoped> </style>
2、將svg標籤封裝到一個vue檔案中
建立SvgList.vue元件
<template> <svg width="0" height="0" preserveAspectRatio="none"> <defs> <!-- 這是個圓 --> <symbol id="icon-circle" viewBox="0 0 200 200"> <circle cx="60" cy="60" r="50" /> </symbol> <!-- 這是個動畫 --> <symbol id="icon-circle" viewBox="0 0 200 200"> <rect width="10" height="10"> <animate attributeName="rx" values="0;5;0" dur="10s" repeatCount="indefinite" /> </rect> </symbol> <!-- 這是個正方形 --> <symbol id="icon-circle" viewBox="0 0 200 200"> <rect x="10" y="10" width="100" height="100"/> </symbol> </defs> </svg> </template> <script> export default { };
使用如下
<template> <div class="home"> <!-- 這裡要使用這個元件,否則svg標籤引入不進來 --> <svg-list /> <IconSvg name="icon-circle" class="icon1"/> <IconSvg name="icon-rect" class="icon1"/> </div> </template> <script> import SvgList from '../components/SvgList.vue' export default { name: 'HomeView', components: { SvgList } } </script> <style scoped> .icon1 { width: 100px; height:100px; color: red; } </style>
3、使用iconfont的svg程式碼
在src/assets/icons這個資料夾下面去建立heart.svg(一定是這個資料夾,因為這個資料夾下的svg檔案會被你的svg外掛解析)
<svg t="1660895988570" class="icon" viewBox="0 0 1171 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1570" width="200" height="200"> <path d="M1001.6 153.6s0-3.2 0 0c-118.4-118.4-304-121.6-425.6-12.8-121.6-108.8-307.2-105.6-422.4 9.6-118.4 118.4-121.6 310.4-3.2 428.8l3.2 3.2 355.2 352c38.4 38.4 99.2 38.4 137.6 0l355.2-352c118.4-118.4 118.4-310.4 0-428.8z m-115.2 249.6c-9.6 0-16-6.4-16-16 0-57.6-48-105.6-105.6-105.6-9.6 0-16-6.4-16-16s6.4-16 16-16c76.8 0 137.6 60.8 137.6 137.6 0 9.6-6.4 16-16 16z" fill="#343231" p-id="1571"> </path> </svg>
使用
<template> <div class="home"> <IconSvg name="heart" class="icon1"/> </div> </template> <script> export default { name: 'HomeView', components: { } } </script> <style scoped> .icon1 { width: 100px; height:100px; color: chocolate; } </style>
效果
在這裡你會遇到一個問題,那就是給這個svg改顏色改不掉,你只要把svg標籤裡的fill屬性去掉就可以了,或者把fill屬性設定成none。還有一個stroke輪廓顏色也是可以設定的。
4、直接引入整個iconfont的svg圖片
生成symbol程式碼
在index.html中引入上面的symbol程式碼
<!DOCTYPE html> <html lang=""> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <link rel="icon" href="<%= BASE_URL %>favicon.ico" rel="external nofollow" > <title><%= htmlWebpackPlugin.options.title %></title> </head> <body> <noscript> <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> </noscript> <div id="app"></div> <!-- built files will be auto injected --> <!-- 引入svg程式碼 --> <script src="//at.alicdn.com/t/c/font_1803779_bgkm96l1xgp.js"></script> </body> </html>
看控制檯已經全部引入進來了
使用
<template> <div class="home"> <IconSvg name="iconjiahao" class="icon1"/> <IconSvg name="iconqicheqianlian-1" class="icon2"/> <IconSvg name="iconxinaixin" class="icon2"/> <IconSvg name="iconjinzhi" class="icon1"/> <IconSvg name="iconcart" class="icon1"/> </div> </template> <script> export default { name: 'HomeView', components: { } } </script> <style scoped> .icon1 { width: 100px; height:100px; color: chocolate; } .icon2 { width: 100px; height:100px; color: darkorange; } </style>
效果
提示:當然你也可以上傳svg圖片到iconfont平臺,然後再下載下來使用,但是在下載下來的時候一定要去去除顏色並提交,這樣你的svg圖片就可以隨心所欲的改顏色了
到此這篇關於如何在vue中使用svgsymbols的文章就介紹到這了,更多相關vue使用svgsymbols內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45