1某寶方案
1.1 某寶的flexible.js
// i6為基準(zhǔn)悴侵,設(shè)計(jì)圖是i6二倍圖,二倍圖中32px = 1rem, 我在variables.less 寫(xiě)了變量 @baseFontSize 1rem=37.5px(蘋(píng)果6下)
// JavaScript Document
(function flexible (window, document) {
var docEl = document.documentElement; //獲取文檔根節(jié)點(diǎn)并保存到變量docEl中(相當(dāng)于獲取到html對(duì)象)
var dpr = window.devicePixelRatio || 1; //獲取像素比挽唉,如果window.devicePixelRatio為false是dpr為1,如果window.devicePixelRatio大于1藐翎,那么dpr賦值取大的數(shù)
function setBodyFontSize () {
if (document.body) { //獲取到body對(duì)象是否存在橘忱,個(gè)人覺(jué)得啰嗦
document.body.style.fontSize = (12 * dpr) + 'px';
}
else {
document.addEventListener('DOMContentLoaded', setBodyFontSize);
}
}
setBodyFontSize();
// set 1rem = viewWidth / 10
function setRemUnit () {
var rem = docEl.clientWidth / 10
docEl.style.fontSize = rem + 'px'
}
setRemUnit()
// reset rem unit on page resize
window.addEventListener('resize', setRemUnit)
window.addEventListener('pageshow', function (e) {
if (e.persisted) {
setRemUnit()
}
})
// detect 0.5px supports
if (dpr >= 2) {
var fakeBody = document.createElement('body')
var testElement = document.createElement('div')
testElement.style.border = '.5px solid transparent'
fakeBody.appendChild(testElement)
docEl.appendChild(fakeBody)
if (testElement.offsetHeight === 1) {
docEl.classList.add('hairlines')
}
docEl.removeChild(fakeBody)
}
}(window, document))
1.2 .less 通過(guò)函數(shù)方式封裝,然后傳進(jìn)去名字和值(重點(diǎn))
.rem(@name,@px) {
@{name}: unit(@px / 75, rem);
}
2 本人方案
2.1本人設(shè)計(jì)的flexible.js方案
// vue: 在入口頁(yè)(定義Vue實(shí)例的頁(yè)面)將其引入即可
function setRem () {
const baseSize = 16
const scale = document.documentElement.clientWidth / 375
// 設(shè)置頁(yè)面根節(jié)點(diǎn)字體大小
document.documentElement.style.fontSize = (baseSize * Math.min(scale, 2)) + 'px'
}
// 初始化
setViewport()
setRem()
window.onresize = function () {
setRem()
}
2.2 .less 文件使用
@baseFontSize: 32;
/* 通過(guò)函數(shù)方式封裝赡鲜,然后傳進(jìn)去名字和值 */
.rem(@name,@px) {
@{name}: unit(@px / @baseFontSize, rem);
}
//使用
.page-item {
margin: 0 auto;
.rem(max-width,750);
}