UNPKG

rem-flexible

Version:

Build flexible page on mobile platform

81 lines (70 loc) 2.39 kB
/** * 可伸缩布局方案 * * ```ts * import flexible from 'rem-flexible' * // 在DOMContentLoaded事件触发前调用 * const reset = flexible() * * // 如果希望重置flexible对文档带来影响,试试调用 * reset() * ``` * * @see https://github.com/amfe/lib-flexible * @param designWidth=750 设计师起稿宽度 * @param pxPerRem=100 每个1rem多少px * @returns 返回重置函数,适用于UI测试场景 */ function flexible() { var designWidth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 750; var pxPerRem = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100; var rollback = []; // adjust body font size function setBodyFontSize() { var dpr = window.devicePixelRatio || 1; if (document.body) { document.body.style.fontSize = "".concat(12 * dpr, "px"); } else { document.addEventListener('DOMContentLoaded', setBodyFontSize); } } setBodyFontSize(); rollback.push(function () { document.body.style.fontSize = ''; document.removeEventListener('DOMContentLoaded', setBodyFontSize); }); // set 1rem = viewWidth / (10) function setRemUnit() { var htmlElement = document.documentElement; var rem = htmlElement.clientWidth / (designWidth / pxPerRem); htmlElement.style.fontSize = "".concat(rem, "px"); } setRemUnit(); // reset rem unit on page resize window.addEventListener('resize', setRemUnit); function onPageshow(e) { if (e.persisted) { setRemUnit(); } } window.addEventListener('pageshow', onPageshow); rollback.push(function () { document.documentElement.style.fontSize = ''; window.removeEventListener('resize', setRemUnit); window.removeEventListener('pageshow', onPageshow); }); // 返回重置函数 return function () { return rollback.forEach(function (fn) { return fn(); }); }; // detect 0.5px supports // if (dpr >= 2) { // const fakeBody = document.createElement('body') // const 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) // } } export { flexible as default };