整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          如何快速的寫出一個Vue的icon組件?這篇文章來教你

          隨著Vue的誕生,它似乎就被人寄予厚望,不僅僅是因?yàn)槠漭p量級的MVVM設(shè)計方式,而且其實(shí)現(xiàn)了組件化開發(fā)模式,所以越來越多的人會拿Vue和AngularJS、React Native做比較。具體關(guān)于它們的比較,我不做過多描述,使用哪個應(yīng)該根據(jù)使用場景出發(fā)。

          Vue.js

          最近,因?yàn)橛袠I(yè)務(wù)需要使用Vue去開發(fā),所以我們需要自己封裝出Vue.js的各種常用組件。今天就給大家介紹一下我封裝Vue的icon組件的過程。當(dāng)然這篇文章不是Vue.js,Webpack類的基礎(chǔ)教學(xué)課程,而是在大家有些基礎(chǔ)的情況下去看的。所以文章中只介紹了部分重點(diǎn)的代碼,以及代碼的截圖,如果有不大能看懂的地方可以先學(xué)下Vue和webpack的基礎(chǔ)。如果真的有需要可以在評論處評論,我可以出些Vue,Gulp,Webpack等基礎(chǔ)文章。

          icon組件外觀

          首先我們看一下icon組件運(yùn)行出來后的模樣

          icon組件

          icon組件實(shí)現(xiàn)過程

          • 項(xiàng)目搭建

          icon組件實(shí)現(xiàn)后是一個可以直接使用的npm包,使用的是Yeoman構(gòu)建工具,配和Gulp+Webpack,生成的工作目錄結(jié)構(gòu)如下

          目錄結(jié)構(gòu)

          (1)config文件夾下是webpack的配置文件

          (2)src下是Vue組件的源文件

          (3)example文件夾下是示例,剛看到的截圖就是example文件夾下的文件運(yùn)行后的樣子

          • icon源文件編寫

          項(xiàng)目結(jié)構(gòu)生成好后,編寫icon組件的源文件就是最重要的了。

          icon組件是一個.vue文件,其中包含template,style和script。

          我實(shí)現(xiàn)的icon組件樣式是借助于ionicons,所以要借助于ionicons的樣式文件,因此會有以下的代碼

          引入ionicons的樣式

          然后考慮icon組件應(yīng)該具備的幾項(xiàng)屬性,一個是樣式,利用type變量去控制;一個是顏色,利用color變量去控制;一個是大小,利用size變量去控制。所以template中有以下代碼

          template代碼

          在script中有以下代碼

          script代碼

          同時預(yù)先定義好icon組件大中小的幾個樣式,因此在style中會有以下代碼

          style代碼

          至此icon組件的源碼編寫就結(jié)束了,但并不是整個工程就結(jié)束了,需要對webpack進(jìn)行設(shè)置,而這也是最重要的部分。

          因?yàn)槲覀冊趇con組件的源碼中引入了ionicons的樣式,所以需要在webpack的配置文件中加入對css文件的解析loader,而css文件中又會引入woff,svg等文件,因此又要加入對這些文件的解析loader,如果不加入的對css,tff,svg等文件解析的話會報錯

          在webpack.base.js文件中加入以下代碼

          webpack的配置

          • 樣例的訪問

          在源文件和webpack配置好后,就可以通過在example文件夾下寫demo了。

          在demo.vue文件中,使用<icon>標(biāo)簽即可訪問到自定義的icon組件

          icon組件的例子

          通過type,size,color三個參數(shù)來定義我們需要的icon組件的樣式,運(yùn)行出來后的例子就如一開始運(yùn)行出來的一樣,是不是很好看呢?

          總結(jié)

          Vue的組件還有很多,例如form表單類的,View視圖類,Navigation導(dǎo)航類等,都需要一個個去編寫,不過只要我們搞懂Vue的運(yùn)行模式和Webpack的編譯模式就可以很方便的寫出來了。

          如果喜歡的話,記得關(guān)注小編噢,小編后續(xù)會堅(jiān)持出更多技術(shù)性的文章,如果有任何問題,也歡迎提問,小編都會盡力解答的。

          前端的開發(fā)過程中,需要用到大量的圖片,當(dāng)使用這些圖片一段時間后,會發(fā)現(xiàn)這個過程是千篇一律的,設(shè)計,切圖,適配。當(dāng)然,許多人也喜歡用字體圖標(biāo)。時間久了,這很枯燥,作為一個前端,不就是喜歡折騰嗎?不折騰不舒服斯基,那么這次就來嘗試用純css繪制動畫線性icon吧。

          當(dāng)我第一次使用純css線性icon的時候,那感覺就像呼吸到了新鮮空氣一般,它的高可擴(kuò)展性、易使用、加載速度快的特定給我留下了非常深刻的印象。

          線性圖標(biāo)使用了什么技術(shù)呢?

          其實(shí)很容易猜到,它使用了svg技術(shù)。整個開始過程其實(shí)是把svg放到一個背景中,然后用一張線性漸變的背景覆蓋在上方,然后使用css的mix-blend-mode的屬性來裁剪、混合。最后線性漸變背景的混合模式設(shè)置為mix-blend-mode: screen后,線性漸變會漸漸消失在白色背景上。這就形成了我們的漸變圖標(biāo)。

          下面是具體的代碼實(shí)現(xiàn):

          一、編寫背景樣式

          背景圖可以是亮的或是暗的,如果是暗背景,那漸變層需要設(shè)置mix-blend-mode: multiply,如果背景圖是亮的,那漸變的混合屬性需要設(shè)置為mix-blend-mode:screen,下面,我們選擇一個亮的背景:

          二、添加線性圖標(biāo)

          <divclass="icon-background"><svgxmlns="http://www.w3.org/2000/svg"viewBox="0 0 50 62"><rectx="19"y="6"width="12"height="4"/><rectx="1"y="38"width="48"height="4"/><linex1="25"y1="1"x2="25"y2="6"/><linex1="25"y1="42"x2="25"y2="58"/><lineclass="cls-1"x1="38"y1="42"x2="44"y2="61"/><linex1="12"y1="42"x2="6"y2="61"/><linex1="8.53"y1="53"x2="41.47"y2="53"/><polygonpoints="3 38 16.75 25.99 24.59 31.99 36.92 20 47 29.82 47 37.98 3 38"/><circlecx="14"cy="18"r="3"/><polygonpoints="31 8 31 10 19 10 19 8 3 8 3 38 47 38 47 8 31 8"/></svg></div>

          svg的顏色需要設(shè)置為黑色:

          svg{ color:#000; position:relative; opacity:.9; width:100%; height:100%; display:block; transition:transform .3s ease;}

          三、制作漸變層

          該層需要緊跟著icon層,并且需要設(shè)置漸變屬性



          四、添加動畫效果

          該步驟非常簡單,只要使用keyframes并配以旋轉(zhuǎn)動畫即可。

          Vue3 已切換到默認(rèn)版本,現(xiàn)在新做的項(xiàng)目基本都直接用 Vue3 了, 但是升級到 Element Plus 后很多人都感覺 icon 的使用方式不習(xí)慣、不好用,今天就跟大家分享一個簡單又方便的方法,用熟悉的方法使用 icon。

          只需要用到 UnoCSS

          UnoCSS 是 antfu 開發(fā)的一個原子化 CSS 引擎,這里就不詳細(xì)說了,大家感興趣可以去讀一下他的文章【重新構(gòu)想原子化CSS - 知乎】。

          • antfu 為 Vue3 生態(tài)寫了很多優(yōu)秀的工具,牛逼Plus。

          正文開始

          以下教程都是只針對 Vite,VueCli 的要自己研究下。

          安裝依賴

          # @iconify-json/ep 是 Element Plus 的圖標(biāo)庫
          npm i -D unocss @iconify-json/ep
          

          修改 vite.config.ts 配置

          // vite.config.ts
          import { defineConfig } from 'vite'
          import vue from '@vitejs/plugin-vue'
          
          import Unocss from 'unocss/vite'
          import { presetIcons } from 'unocss'
          
          export default defineConfig({
            plugins: [
              vue(),
          
              // 添加以下配置
              Unocss({
                presets: [
                  presetIcons({
                    scale: 1.2,
                    warn: true
                  }),
                ],
                // 以下配置是為了可以直接使用標(biāo)簽 <i-ep-edit />
                variants: [
                  {
                    match: (s) => {
                      if (s.startsWith('i-')) {
                        return {
                          matcher: s,
                          selector: (s) => {
                            return s.startsWith('.') ? `${s.slice(1)},${s}` : s
                          },
                        }
                      }
                    },
                  },
                ],
              })
            ]
          })
          
          

          修改 main.ts

          // 在 main.ts 里添加以下代碼
          import 'uno.css'
          

          可以開始寫代碼

          • 使用方法:前綴 i-ep- + "圖標(biāo)名", "i-ep-lock"
          <template>
            <div style="margin: 50px;">
              <el-space direction="vertical" alignment="left">
                <!-- 直接使用 -->
                <el-space>
                  <!-- 使用class -->
                  <div class="i-ep-lock"></div>
                  <!-- 使用標(biāo)簽 -->
                  <i-ep-edit />
                </el-space>
          
                <!-- 組件里使用 -->
                <el-button icon="i-ep-avatar">Button</el-button>
          
                <el-input prefix-icon="i-ep-search" suffix-icon="i-ep-pointer" ></el-input>
          
                <el-menu>
                  <el-menu-item >
                    <el-icon class="i-ep-menu"></el-icon>
                    <span>Navigator Two</span>
                  </el-menu-item>
                </el-menu>
          
              </el-space>
            </div>
          </template>
          

          運(yùn)行效果

          使用注意

          UnoCSS 是關(guān)鍵詞匹配按需生成的,所以要注意以下使用方法

          <!-- 錯誤 -->
          <script steup>
          const icon = 'lock';
          </script>
          
          <div :class="`i-ep-${icon}`"></div>
          <div :class="`i-ep-${isLock ? 'lock' : 'menu'}`"></div>
          
          <!-- 正確 -->
          <script steup>
          const icon = 'i-ep-lock';
          </script>
          
          <div :class="icon"></div>
          <div :class="isLock ? 'i-ep-lock' : 'i-ep-menu'"></div>
          

          如果你的 icon 變量是從接口獲取的,要修改 UnoCSS 的配置

          Unocss({
            // 添加以下配置, safelist 是預(yù)生成 i-ep-lock 的樣式不管代碼有沒有使用這個圖標(biāo)
            safelist: ['i-ep-lock', 'i-ep-menu']
          })
          

          快速把整個圖標(biāo)庫載入

          import epIcons from '@iconify-json/ep'
          
          Unocss({
            // 修改成以下配置
            safelist: [
              ...Object.keys(epIcons.icons.icons).map(name => `i-${epIcons.icons.prefix}-${name}`),
            ],
          })
          

          使用任意的圖標(biāo)集

          Ic?nes 可以在這個找自己喜歡的圖標(biāo)集,我們挑 ant design 來說一下。

          # 安裝依賴
          npm i @iconify-json/ant-design -D
          
          <template>
            <div style="margin: 50px;">
              <el-space direction="vertical" alignment="center">
          
                <!-- 直接使用 -->
                <el-space>
                  <div class="i-ant-design:account-book-filled"></div>
                  <i-ant-design:carry-out-twotone />
                </el-space>
          
                <!-- 組件里使用 -->
                <el-button icon="i-ant-design:percentage-outlined">Button</el-button>
          
                <el-input prefix-icon="i-ant-design:search-outlined" suffix-icon="i-ant-design:heart-filled" ></el-input>
          
                <el-menu>
                  <el-menu-item >
                    <el-icon class="i-ant-design:align-center-outlined"></el-icon>
                    <span>Navigator Two</span>
                  </el-menu-item>
                </el-menu>
          
              </el-space>
          
            </div>
          </template>
          

          完美配合


          ant Design 圖片完美配合

          最后

          大家開始愉快地寫代碼吧。更多的使用配置大家可以去看一下文檔也參考一下我寫的一個后臺模板里的配置MDAdmin(基于 Vue3 + Ts + Element Plus)。


          主站蜘蛛池模板: 天天看高清无码一区二区三区| 国产一区二区高清在线播放| 国产成人综合一区精品| 国产一区二区影院| 亚洲AV无码一区二区三区牛牛| 激情爆乳一区二区三区| 国产精品无码一区二区三区不卡 | 丝袜无码一区二区三区| 国产天堂在线一区二区三区| 国产精品日本一区二区在线播放| 日韩三级一区二区| 欧美日韩国产免费一区二区三区| 国产av熟女一区二区三区| 日本在线观看一区二区三区| 亚洲午夜电影一区二区三区| 91久久精一区二区三区大全| 欧美日韩精品一区二区在线视频| 精品无码一区二区三区亚洲桃色| 国产av一区二区三区日韩| 国产日韩一区二区三区在线观看 | 久久亚洲色一区二区三区| 亚洲日本一区二区一本一道| 国产福利一区视频| 一区二区三区午夜| 精品久久国产一区二区三区香蕉 | 麻豆国产一区二区在线观看| 亚洲国产精品综合一区在线| 国产一区二区三区乱码网站| 精品无码国产一区二区三区AV | 国产对白精品刺激一区二区| 国产精品视频分类一区| 无码日韩精品一区二区免费| 国产福利一区二区| 丰满人妻一区二区三区免费视频 | 久久蜜桃精品一区二区三区| 精品亚洲AV无码一区二区| 国产对白精品刺激一区二区| 在线|一区二区三区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 免费无码A片一区二三区| 亚洲色偷精品一区二区三区|