一片文章走天下

101 阅读2分钟

npm

官网

https://www.npmjs.com/
https://socket.dev/npm/package 非常友好的阅读npm readme

postcss-px-to-viewport

postcss-px-to-viewport-8-plugin - 升级版

postcss-px-to-viewport-update - 升级版

  • px自动转vw

原理

  • 元素尺寸 / 设计基准 * 100
  • 通过递归解析css语法树,批量转换px
  • 指定忽略的css选择器规则
npm i -D postcss-px-to-viewport
npm i -D postcss-px-to-viewport-8-plugin
npm i -D postcss-px-to-viewport-update 

module.exports = {
  plugins: {
    'postcss-px-to-viewport': {
      unitToConvert: 'px',  // 需要转换的单位,默认为"px"
      viewportWidth: 1920, //  设计稿的视口宽度
      unitPrecision: 5, // 单位转换后保留的精度
      propList: ['*'], // 能转化为vw的属性列表
      viewportUnit: 'vw', //  希望使用的视口单位
      fontViewportUnit: 'vw', // 字体使用的视口单位
      selectorBlackList: ['--ignore'], // 需要忽略的CSS选择器包含关系 因此--ignore 表示忽略转换
      minPixelValue: 1, // 最小的转换数值,如果为1的话,只有大于1的值会被转换
      mediaQuery: false, // 媒体查询里的单位是否需要转换单位
      replace: true, // 是否直接更换属性值,而不添加备用属性
      exclude: [], // 忽略某些文件夹下的文件或特定文件
      include: undefined,  // 如果设置了include,那将只有匹配到的文件才会被转换,例如只转换 'src/mobile' 下的文件 (include: /\/src\/mobile\//)
      landscape: false, // 是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape)
      landscapeUnit: 'vw' // 横屏时使用的单位
    }
  }
}

css内敛样式转换

封装pxToVw方法

import postcss from '/postcss.config'

export const pxToVw = function pxToVw(size) {
    return 100 * size / postcss.plugins['postcss-px-to-viewport'].viewportWidth + 'vw'
}

自定义vue指令 v-px-to-vw

Vue.directive('v-px-to-vw', {
    inserted(element) {
        // 获取元素的行内样式
        const style = element.style.cssText // 正则表达式匹配 px 单位
        const newStyle = style.replace(/(\d+)px/g, (match, p1) => pxToVw(Number(p1))) // 设置转换后的样式
        element.style.cssText = newStyle
    }
)

<template>
   <div v-px-to-view style="height: 100px;width:200px;">
      px-to-vw
      <p class="p-txt p--ignore">
         忽略转换css p--ignore
      </p>
      <p :style="style">
         使用pxToVw方法转vw
      </p>
   </div>
</template>
<script>
import { pxToVw } from '@/utils/index'
export default {
    computed: {
      style() {
          return {
             fontSize: pxToVw('100px')
          }
      }
    }
}
</script>
<style>
.p--ignore {
   width: 100px;
}
.p-txt {
  font-size: 20px; // 20vw
}
</style>

社区

postcss-px-to-viewport 在npm有很多或扩展的版本,可以仔细研究下。

postcss-px-to-viewport-update: 增加了单行css注释编译

.class2 {
  padding-top: 10px; /* px-to-viewport-ignore */
  /* px-to-viewport-ignore-next */
  padding-bottom: 10px;
  /* Any other comment */
  border: 1px solid black;
  margin-bottom: 1px;
  font-size: 20px;
  line-height: 30px;
}

js注释

函数参数注释


/** 
 * @name sleep 延迟
 * @description Sleep
 * @param {string} time - 100
 * @returns {Promise} - a promise
 * **/
function sleep(time) {
  return new Promise((resolve) => setTimeout(resolve, time))
}

/**
 * @param { HTMLElement } element
 * @param {Window} window
 * **/
function resize(element, window) {}

变量声明注释

/** @type {{ name: string; age: number }} */
let person

/** @type {(s: string, b: boolean) => void} */
let myCallback

/** @type {number[]} */
let years


/**
- @typedef {object} Color
- @property {number} chroma
- @property {number} hue
*/

/** @type {Color[]} */
const colors = [
    { chroma: 0.2, hue: 262 },
    { chroma: 0.2, hue: 28.3 }
]

从 *.d.ts 文件导入类型:

/** @param {import('./types').User} user */
const deleteUser = (user) => {}

vue

vue自定义指令

www.kancloud.cn/ruizhang/vu…

image.png