2022-08-05 随笔 less 自定义函数,实现传参返回值函数

我们想要实现一个 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 中将 lessvw 函数声明为全局函数

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'
      }
    })
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Sass&Gulp 一、sass介绍 (一) SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计...
    锋享前端阅读 5,455评论 0 3
  • (一)命名规范 1.1.1项目命名 全部采用小写方式,以中划线分隔。 正例:mall-management-sys...
    良辰_147f阅读 3,240评论 0 1
  • 写在开头 为什么会有这篇文章?众所周知,前端技术栈太过广泛,要一个技术人员选择一套高度可复用的前端架构也是挺费事费...
    peaktan阅读 5,655评论 0 3
  • 一、编程规范 (一)命名规范 1.1.1 项目命名 全部采用小写方式, 以中划线分隔。正例:mall-manage...
    谢小胖阅读 4,149评论 0 0
  • 安装Vite npm init vite@latest 安装eslint npm install eslint -...
    lowpoint阅读 5,117评论 0 1

友情链接更多精彩内容