移動端h5屏幕適配方案(使用PostCSS插件)
Rem + PostCSS插件
使用PostCSS插件將項(xiàng)目中的px單位自動轉(zhuǎn)換為rem,搭配JS動態(tài)設(shè)置根字體大小(監(jiān)聽window.resize)。
vite配置
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import pxtorem from 'postcss-pxtorem'
// https://vite.dev/config/
export default defineConfig({
plugins: [vue()],
css: {
postcss:{
plugins: [
pxtorem({
rootValue: 75,//根據(jù)設(shè)計(jì)稿進(jìn)行配置,如果設(shè)計(jì)稿寬度為750則配置75
propList: ['*'],
unitPrecision: 5,
minPixelValue: 2,
exclude: /node_modules/i,
}),
],
}
},
})
配合的js代碼,監(jiān)聽視口變化改變根元素大小
// 處理各機(jī)型適配的fontsize
function handleRem() {
const baseSize = 75;// 與postcss配置中的rootValue保持一致
const scale = document.documentElement.clientWidth / 750;
document.documentElement.style.fontSize =
baseSize * Math.min(scale, 2) + 'px';
}
// 初始化設(shè)置根元素的值
handleRem()
// 監(jiān)聽窗口變化,根據(jù)窗口變化來改變根元素的值
window.addEventListener('resize', handleRem)
Viewport單位
使用純CSS的視口單位(vw, vh)進(jìn)行布局,視口變化時元素尺寸自動縮放
vite配置
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import postcsspxtoviewport from 'postcss-px-to-viewport'
export default defineConfig({
plugins: [vue()],
css: {
postcss: {
plugins: [
postcsspxtoviewport({
unitToConvert: 'px', // 要轉(zhuǎn)換的單位
viewportWidth: 750, // 設(shè)計(jì)稿的視口寬度,一般是375
unitPrecision: 5, // 轉(zhuǎn)換后的精度,即小數(shù)點(diǎn)位數(shù)
propList: ['*'], // 指定轉(zhuǎn)換的CSS屬性的單位,*代表全部css屬性都轉(zhuǎn)換
viewportUnit: 'vw', // 指定需要轉(zhuǎn)換成的視口單位,建議使用vw
fontViewportUnit: 'vw', // 字體使用的視口單位
selectorBlackList: ['.ignore-'], // 指定不轉(zhuǎn)換為視口單位的類名
minPixelValue: 1, // 默認(rèn)值1,小于或等于1px則不進(jìn)行轉(zhuǎn)換
mediaQuery: false, // 是否在媒體查詢的css代碼中也進(jìn)行轉(zhuǎn)換,默認(rèn)false
replace: true, // 是否直接更換屬性值,而不添加備用屬性
exclude: [/node_modules/], // 忽略某些文件夾下的文件或特定文件
})
]
}
}
})
Flexible / Rem
淘寶舊方案,通過JS模擬viewport和rem,主要解決過去移動端高清屏的適配問題。沒有具體實(shí)踐過
針對特殊情況進(jìn)行處理
以下兩種方案均適配上面的Rem + PostCSS插件和Viewport單位 比如場景:滾動到遮住頭部組件的位置,頭部位置在設(shè)計(jì)稿上是150px,這種怎么實(shí)現(xiàn)
- 方案1:就是通過offsetHeight,直接獲取到針對于不同機(jī)型上真實(shí)的px值
- 方案2:使用方法進(jìn)行轉(zhuǎn),直接傳入設(shè)計(jì)稿上的高度就完事,會自動適配出對應(yīng)px然后進(jìn)行scrolltop的賦值即可
// 根據(jù)設(shè)計(jì)稿上的px,計(jì)算出當(dāng)前設(shè)備真實(shí)適配的 px 值
/**
* @param px 設(shè)計(jì)稿的px值
* @param isFormat 是否返回帶px單位的字符串,默認(rèn)true
* @param designWidth 設(shè)計(jì)稿的寬度,默認(rèn)750px,根據(jù)實(shí)際情況修改
* @returns 適配后的px值
* */
export const pxValueToPx = (px: number, isFormat: boolean = true, designWidth: number = 750) => {
// 基準(zhǔn)設(shè)計(jì)稿寬度(通常為 750px)
const _designWidth = designWidth;
// 獲取當(dāng)前設(shè)備的屏幕寬度
const windowWidth = document.documentElement.clientWidth;
// 計(jì)算縮放比例
const scale = windowWidth / _designWidth;
// 返回自適應(yīng)后的 px 值
return isFormat ? `${px * scale}px` : px * scale;
}
總結(jié)
到此這篇關(guān)于移動端h5屏幕適配方案的文章就介紹到這了,更多相關(guān)移動端h5屏幕適配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VS?Code中搭建JavaScript運(yùn)行環(huán)境超詳細(xì)過程
這篇文章主要介紹了JavaScript從瀏覽器到服務(wù)端的演變,以及如何在VSCode中安裝和配置Node.js和相關(guān)插件來運(yùn)行JavaScript代碼,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
js 遞歸json樹實(shí)現(xiàn)根據(jù)子id查父id的方法分析
這篇文章主要介紹了js 遞歸json樹實(shí)現(xiàn)根據(jù)子id查父id的方法,結(jié)合實(shí)例形式分析了JavaScript遞歸遍歷json進(jìn)行數(shù)據(jù)查詢的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
javascript利用apply和arguments復(fù)用方法
這篇文章主要介紹了javascript利用apply和arguments復(fù)用方法,有需要的朋友可以參考一下2013-11-11
完美解決手機(jī)瀏覽器頂部下拉出現(xiàn)網(wǎng)頁源或刷新的問題
下面小編就為大家分享一篇完美解決手機(jī)瀏覽器頂部下拉出現(xiàn)網(wǎng)頁源或刷新的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
微信小程序登錄數(shù)據(jù)解密及狀態(tài)維持實(shí)例詳解
這篇文章主要介紹了微信小程序登錄數(shù)據(jù)解密及狀態(tài)維持,結(jié)合實(shí)例形式分析了微信小程序解密敏感信息及獲取session保持登陸狀態(tài)的相關(guān)操作技巧,需要的朋友可以參考下2019-05-05

