- 對于除echart圖外的適配我們添加的是px轉rem方式
比如使用插件postcss-pxtorem
查看 postcss-pxtorem
postcss.config.cjs
文件配置
module.exports = {
plugins: {
autoprefixer: {
overrideBrowserslist: [
'Android 4.0',
'iOS 10.0',
'Chrome > 31',
'ff > 31',
// 'ie >= 8',
'> 1%'
],
grid: true
},
// 'postcss-flexbugs-fixes': {},
// 'postcss-inset': {}
// postcss-pxtorem 插件的版本需要 >= 5.0.0
'postcss-pxtorem': {
// rootValue: 37.5, // 設計稿寬度除以 10, 開頭大寫的Px 不轉換 => height: 100Px, 內聯樣式不轉換,需要 / 75 轉成 rem
rootValue(/*{ file }*/) {
return 1920 / 10
},
unitPrecision: 5, // 計算結果保留 6 位小數
// selectorBlackList: ['.no-rem', 'no-rem'], // 要忽略的選擇器并保留為px。
propList: ['*'], // 可以從px更改為rem的屬性 感嘆號開頭的不轉換
replace: true, // 轉換成 rem 以后,不保留原來的 px 單位屬性
mediaQuery: true, // 允許在媒體查詢中轉換px。
minPixelValue: 2, // 設置要替換的最小像素值。
// exclude: /node_modules/i // 排除 node_modules 文件(node_modules 內文件禁止轉換)
exclude: null
}
}
}
- 對于echart圖設置option的時候的像素是px單位的,在winddow resize的時候重新設置當前窗口尺寸下的像素值
// 用法:
// 數組參數
const { remPx } = usePx2rempx<number[]>([6, 2, 1, 12, 2])
// 單個值
const { remPx } = usePx2rempx(14)
usePx2rempx
// vue3 ts
import { cloneDeep, debounce, isArray, isNumber, isPlainObject } from 'lodash-es'
import { onMounted, onUnmounted, ref, type Ref } from 'vue'
export const base = 1920
export const rootValue = base / 10
export function rem2px(rem: number, root?: number) {
if (!rem) return rem
if (root) {
return rem * root
}
return rem * rootValue
}
export function px2remPx(px: number) {
const clientWidth =
window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth
if (!clientWidth) return 0
const fontSize = clientWidth / base
return px * fontSize
}
export default function px2rem(px?: number, root?: number) {
if (!px) return px
if (root) {
return `${px / root}rem`
}
return `${px / rootValue}rem`
}
export default function usePx2rempx<T>(px: number | number[] | any): { remPx: Ref<T> } {
const remPx = ref()
function changeValue() {
if (isArray(px)) {
remPx.value = px.map((value) => px2remPx(value))
} else if (isPlainObject(px)) {
const newRemPx = cloneDeep(px)
Object.keys(px).forEach((key) => {
newRemPx[key] = px2remPx(px[key] as number)
})
remPx.value = newRemPx
} else if (isNumber(px)) {
remPx.value = px2remPx(px)
}
}
changeValue()
const outerWidth = ref(window.outerWidth)
const outerHeight = ref(window.outerHeight)
const eventHandler = debounce(() => {
changeValue()
setTimeout(() => {
outerWidth.value = window.outerWidth
outerHeight.value = window.outerHeight
}, 250)
}, 150)
onMounted(() => {
window.addEventListener('resize', eventHandler)
})
onUnmounted(() => {
window.removeEventListener('resize', eventHandler)
})
return { remPx }
}