我们想要实现一个 vw 的 less 函数,他具有这样的功能:
.test {
height: vw(12); // height: 24px
width: vw(32); // width: 64
}
能够将我们传入的值转成 2 * value + 'px'
的形式
1. 通过 scss
实现
@function vw($value) {
@return $value * 2px;
}
// 使用
.test {
height: vw(12); // height: 24px
width: vw(32); // width: 64
}
2. 通过 less
实现
less
的函数虽然也可以传值,但是使用的混入的方式,不能像 scss
一样返回一个值。
但 less
可以通过自定义函数插件的形式来实现
新建 plugin.js
文件
// plugin.js
module.exports = {
install: function (less, pluginManager, functions) {
functions.add('vw', function (param) {
if (param.value) {
return Number(param.value) * 8 + 'px'
} else {
return Number(eval(`${param.operands[0].value}${param.op}${param.operands[1].value}`)) * 8 + 'px'
}
})
}
}
新建 test.less
文件
// test.less`
@plugin './plugin.js'
.test {
height: vw(12); // height: 24px
width: vw(32); // width: 64
}
3. 再 vite
中将 less
的 vw
函数声明为全局函数
vite.config.ts
export default defineConfig({
// ...
css: {
preprocessorOptions: {
less: {
additionalData: `@import "./src/styles/var/index.less";`,
javascriptEnabled: true
}
}
},
// ...
})
src/styles/var/index.less
@plugin './vw.js'
src/styles/var/vw.js
module.exports = {
install: function (less, pluginManager, functions) {
functions.add('vw', function (param) {
if (param.value) {
return Number(param.value) * 8 + 'px'
} else {
return Number(eval(`${param.operands[0].value}${param.op}${param.operands[1].value}`)) * 8 + 'px'
}
})
}
}