昨晚在公司沒回去,心血來潮想做完皮膚的需求,發現晚上效率真的是挺高的。
皮膚就是一部分樣式和資源。我的思路是先在原來的元件裡修改對應的樣式,然後把這部分樣式抽出來,單獨管理,同時抽取一些可以配置的變數。
經過一晚上的折騰,現在除了皮膚樣式的單獨打包外,都做完了。做的過程中主要遇到了3個問題:
1. vue的scoped私有模組裡無法覆蓋全域性樣式
vue自帶了scoped的模組化方案,會自動在元素上新增一個隨機的唯一id,然後在選擇器上加上這個id,使得該樣式不會影響其他模組,
這樣是避免了樣式影響別的地方,css modules也是類似的思路,不過css modules是改的class名字,
在改登入頁的時候發現那個elementui的dropdown樣式怎麼也改不了,通過檢視dom發現他是全域性的,在body下,並不在元件裡,而元件的樣式被私有化了,沒法覆蓋全域性。
於是,我在vue單檔案元件里加了兩個style標籤,一個加scoped,一個不加scoped,這樣可以在一個less裡寫私有樣式,一個less裡寫一些可以覆蓋全域性樣式的樣式。
<style lang='less' src='./global-login.less'></style>
<style lang='less' src='./login.less' scoped></style>
複製程式碼
這樣就解決了scoped裡面無法覆蓋全域性樣式的問題。
其實這也是scoped方案不完善的地方,css modules裡是可以在私有模組裡通過 :global(.className)
來宣告全域性樣式的,而scoped沒有處理這一點。
2. 圖片的顯示使用背景圖還是圖片標籤
寫樣式遇到圖片的時候,大多數情況下背景圖片和圖片標籤都能解決問題,但兩種方式並不都是合適的。
我覺得如果不需要用js去操作,或者本身只是輔助性的裝飾或說明的圖片,從意義上就是樣式的一部分,應該用背景圖片來做。只有當圖片需要使用js去操作或者有一定的業務含義的時候才有必要用圖片標籤。
此外,這裡要做的皮膚的切換,只是樣式的切換,如果使用圖片標籤來顯示的話,那麼也就沒法只通過樣式來切換皮膚了。
之前的實現都是通過img標籤來做的,無論從程式碼功能用作裝飾還是有業務含義的角度或從皮膚開發只應該修改的角度都得把這裡的標籤改成背景圖的方式。
我把img標籤替換成了div標籤,然後通過不同的class來區分圖示。前後的裝飾圖片使用偽元素 + 背景圖來做的。
把這些無意義的img標籤抽出來之後,html程式碼清爽了很多,而且抽出來的icon樣式複用性也很強。
.icon-suijidianming {
background-image: url('@{iconsDirPath}/suijidianming.png');
}
.icon-dadishu {
background-image: url('@{iconsDirPath}/dadishu.png');
}
.icon-fahongbao {
background-image: url('@{iconsDirPath}/fahongbao.png');
}
複製程式碼
3.皮膚資源的管理
皮膚相關的樣式和資源抽取出來之後,接下來就是如何管理這些樣式和資源了。
皮膚相關的樣式資源應該獨立出來,於是我在assets下單獨建了一個資料夾來存放皮膚相關的東西。
icons存小圖示,images放一些大圖片,less下面是樣式,以後還可能會有字型等資源。
因為皮膚主要涉及到登入頁、考勤頁、頂部選單三部分,於是我把images和less分成了這三部分,樣式因為有一些是全域性的,所以多了一個global.less檔案。
這些頁面的樣式,我只抽出了一些顏色變數,通用的東西並不是很多。
在common.less裡面引入variable.less,然後3個頁面皮膚的less檔案都引入common.less
其中@imagesDirPath和@iconsDirPath是兩個資原始檔的根路徑,所有的圖片資源的路徑基於這倆變數來寫,路徑變動的時候也很方便的調整。
還有一些通用的mixin,主要有兩個,一個是四個角的背景圖片,通過mixin的方式來簡化了程式碼
第二是icon的樣式,這裡使用了less 的 陣列 + 迴圈來批量生成
scss的語法比較接近類c語法,理解容易,less的語法看著稍微奇怪一些。而且less的function需要使用mixin來模擬。感覺沒有scss強大和易用。還有less的mixin並不能通過@import匯入,只能每個檔案都寫一遍,而sass可以。
總結
皮膚開發的過程中主要遇到了 scoped樣式模組化方案的坑、圖片的存在形態、less的一些坑這3個問題。
scoped樣式模組化方案的坑:樣式無法覆蓋的問題,是因為scoped方案沒有提供類似css modules在模組樣式裡面寫全域性樣式的語法,只能通過分開寫來解決。
圖片的存在形態:裝飾用的圖片應該作為背景圖片而存在,使用img標籤除了會使得dom結構不清晰外,也不容易修改顯示的內容。
less的一些坑:樣式整體使用less來管理,mixin和變數還有import和邏輯控制的語法,遇到一些不方便的地方比如mixin不支援匯入、沒有函式的功能,只能用mixin模擬、邏輯控制語法有些怪異等。感覺不如sass強大易用。
其他
皮膚的開發、抽取、單獨管理都做完了,下一步就是單獨打包了。 看了下時間,快6點了。晚上寫程式碼效率會比較高呢,算了下從開始做到現在,大概花了12小時,也就是不到2個工作日,還算正常。