webpack中如何使用雪碧圖的示例代碼
一、什么是雪碧圖?
CSS雪碧 即CSS Sprite,也有人叫它CSS精靈,是一種CSS圖像合并技術(shù),該方法是將小圖標(biāo)和背景圖像合并到一張圖片上,然后利用css的背景定位來(lái)顯示需要顯示的圖片部分。
二:為什么要用雪碧圖
結(jié)合我們公司的需求來(lái)說(shuō),因?yàn)橛泻芏嘟M件,每個(gè)組件下有大概50張圖片,每張圖片是一個(gè)請(qǐng)求,也就是發(fā)了300多個(gè)請(qǐng)求,這樣是很可怕的,所以為了優(yōu)化性能,減少http請(qǐng)求,決定采用雪碧圖的形式。
雪碧圖是將你想要的很多張圖片整理成一張圖片,然后通過(guò)background-*來(lái)進(jìn)行圖片識(shí)別和定位來(lái)達(dá)到之前的效果。
三:如何使用雪碧圖
雪碧圖在之前有很多方式,如ps之類,現(xiàn)在最佳的方案還是在webpack-spritesmith。
我其實(shí)對(duì)webpack并不是很了解,我現(xiàn)在列出使用方法和我在使用webpack時(shí)候遇到的問(wèn)題。
1.安裝
執(zhí)行命令行:npm install --save-dev webpack-spritesmith
2.在webpack.config.js中寫入
var path = require('path')
var SpritesmithPlugin = require('webpack-spritesmith')
//自定義樣式
var templateFunction = function (data) {
var shared = '.ico { background-size: TWpx THpx }'
.replace('TW', data.sprites[0].total_width / 2)
.replace('TH', data.sprites[0].total_height / 2)
var perSprite = data.sprites.map(function (sprite) {
return '&.element-N {\n width: Wpx;\n height: Hpx;\n background-position: Xpx Ypx;\n}'
.replace('N', sprite.name)
.replace('W', sprite.width / 2)
.replace('H', sprite.height / 2)
.replace('X', sprite.offset_x / 2)
.replace('Y', sprite.offset_y / 2)
.replace('TW', sprite.total_width / 2)
.replace('TH', sprite.total_height / 2)
}).join('\n')
return shared + '\n' + perSprite
}
module.exports = {
...
module: {
rules: [
{test: /\.styl$/, use: [
'style-loader',
'css-loader',
'stylus-loader'
]},
{test: /\.png$/, use: [
'file-loader?name=i/[hash].[ext]'
]}
]
},
resolve: {
modules: ['node_modules', 'spritesmith-generated']
},
plugins: [
new SpritesmithPlugin({
src: { //引入路徑
cwd: path.resolve(__dirname, 'src/images/ios/'),
glob: '*.png'
},
target: { //輸出路徑
image: path.resolve(__dirname, 'src/spritesmith-generated/ios.png'),
css: [
[path.resolve(__dirname, 'src/spritesmith-generated/sprite-1.css'), {
format: 'function_based_template'
}],
[path.resolve(__dirname, 'src/spritesmith-generated/sprite-2.css'), {
format: 'handlebars_based_template'
}]
]
},
customTemplates: {
'function_based_template': templateFunction, //自定義輸出什么樣的css樣式
},
apiOptions: {
cssImageRef: 'ios.png'
}
})
]
}
3.根據(jù)地址更改后執(zhí)行命令
wbpack
其實(shí)這樣已經(jīng)滿足了大部分需求,根據(jù)需要將你所在的輸入和輸出地址進(jìn)行更改即可,可以設(shè)置自己想要設(shè)置的的css(style-components、styl等),然后直接復(fù)制在自己的項(xiàng)目css文件,很有靈活性。
四:需要注意的點(diǎn)
我有的時(shí)候指定不同文件下的圖片合成一張雪碧圖,那該如何呢
例如我的需求是:
- resources
- ios
- images
- ant
- images
- ios
- images
- ios
- ...
翻譯: resources下有幾個(gè)文件夾(ios、ant、ios),相對(duì)應(yīng)下面images文件夾放著各自對(duì)應(yīng)的圖片。
需要注意下,它是支持glob的
src: {
//引入路徑
cwd: path.resolve(__dirname, 'src/images/ios/'),
glob: '*.png' //這里進(jìn)行更改
},
這里可以參考在這里根據(jù)需求進(jìn)行設(shè)置:http://www.globtester.com/
把glob改成
@(wechat|element|ios)/images/*.png
五:更深層次的需求
我其實(shí)是想在各自的文件夾下的圖片,生成各自文件夾下的雪碧圖和css,那該如何實(shí)現(xiàn)呢,我寫了一部分,還沒(méi)有寫完,感覺(jué)遇到了技術(shù)難點(diǎn),我呈現(xiàn)出代碼,會(huì)繼續(xù)優(yōu)化來(lái)實(shí)現(xiàn)
var path = require('path')
var SpritesmithPlugin = require('webpack-spritesmith')
var platforms = ['android', 'ant', 'element', 'ios', 'wechat']//, 'windows']
// var url = 'ant'
const TARGET = process.env.TARGET
console.log({ TARGET })
module.exports = [TARGET].map(l => {
console.log(l)
const url = l
const fn = (data) => {
console.log(url)
var shared = 'background-size: TWpx THpx\n'
.replace('TW', data.sprites[0].total_width / 2)
.replace('TH', data.sprites[0].total_height / 2)
var perSprite = data.sprites.map(function (sprite) {
return `&.${url}-N {\n width: Wpx;\n height: Hpx;\n background-position: Xpx Ypx;\n}\n`
.replace('N', sprite.name)
.replace('W', sprite.width / 2)
.replace('H', sprite.height / 2)
.replace('X', sprite.offset_x / 2)
.replace('Y', sprite.offset_y / 2)
.replace('TW', sprite.total_width / 2)
.replace('TH', sprite.total_height / 2)
}).join('\n')
return shared + '\n' + perSprite
}
return {
module: {
rules: [
{test: /\.styl$/, use: [
'style-loader',
'css-loader',
'stylus-loader'
]},
{test: /\.png$/, use: [
'file-loader?name=i/[hash].[ext]'
]}
]
},
entry: {
[url]: path.join(__dirname, url),
},
output: {
path: path.join(__dirname, '../parsed/', url),
filename: '[name].css'
},
resolve: {
modules: ['node_modules', 'spritesmith-generated']
},
plugins: [
new SpritesmithPlugin({
src: {
cwd: path.resolve(__dirname, 'images/'+url+'/'),
glob: '*.png' // '@(android|ant|element|ios|wechat|windows)/*.png'
},
target: {
image: path.resolve(__dirname, '../parsed/'+url+'/'+url+'.png'),
css: [
[path.resolve(__dirname, '../parsed/'+url+'/'+url+'.css'), {
format: 'function_based_template'
}]
]
},
customTemplates: {
'function_based_template': fn
}
})
]
}
})
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Boostrap柵格系統(tǒng)與自己額外定義的媒體查詢的沖突問(wèn)題
這篇文章主要介紹了Boostrap柵格系統(tǒng)與自己額外定義的媒體查詢的沖突問(wèn)題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Bootstrap下拉菜單更改為懸停(hover)觸發(fā)的方法
這篇文章主要為大家詳細(xì)介紹了Bootstrap下拉菜單更改為懸停(hover)觸發(fā)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
通過(guò)flv.js播放監(jiān)控示例深入探究直播流技術(shù)
本文記錄一下在使用 flv.js 播放監(jiān)控視頻時(shí)踩過(guò)的各種各樣的坑,雖然官網(wǎng)給的?Getting Started?只有短短幾行代碼,跑一個(gè)能播視頻的 demo 很容易,但是播放時(shí)各種各樣的異常會(huì)搞到你懷疑人生,下面我將自己踩過(guò)的坑,以及踩坑過(guò)程中補(bǔ)充的相關(guān)知識(shí),詳細(xì)總結(jié)一下2023-10-10

