...
大前端 css

移动端自适应不修改css源码使用js修改所有css单位px到rem

不想修改css源码怎样修改px为rem
这个问题困扰我很久
偶尔发现document下的styleSheets对象

document.styleSheets

只读属性,返回一个由 StyleSheet对象组成的数组,每个StyleSheet对象都是一个文档中链接或嵌入的样式表。
StyleSheet对象具有cssRules属性,是一个数组,同一个style中的每一条样式都是数组中的一项CSSStyleRule或CSSKeyframeRule等,并具有cssText等属性。其中CSSStyleRule对象的selectorText和style属性可修改。

selectorText和style

selectorText对应选择器名称比如

a{
    font-size:14px;
}

其中 a 就是selectorText
style对应的就是{}里的所有样式

{
    font-size:14px;
}

注意前面说到的selectorText和style属性是可修改的

我们只修改style,style对象下有个cssText属性,我们直接替换cssText属性的css字符串
比如要修改a选择器里面的字体14px为20px

document.styleSheets[0].cssRules[0].style.cssText='font-size:20px'

完整的代码如下


// 替换css px为rem
(function px2rem(window, document) {

    // 设计稿宽度
    const defWidth = 414 / 10;

    // 获取的html 的根元素
    const docEl = document.documentElement

    // set 1rem = viewWidth / 10    设置我们html 元素的文字大小
    function setRemUnit() {
        const rem = docEl.clientWidth / 10
        docEl.style.fontSize = rem + 'px'
    }
    // 初始化
    setRemUnit()

     // 当我们页面尺寸大小发生变化的时候,要重新设置下rem 的大小
     window.addEventListener('resize', setRemUnit)
     // 是我们重新加载页面触发的事件
     window.addEventListener('pageshow', function (e) {
         // e.persisted 返回的是true 就是说如果这个页面是从缓存取过来的页面,也需要从新计算一下rem 的大小
         if (e.persisted) {
             setRemUnit()
         }
     })

    // 修改所有css px为rem
    const toFixed = function (numb) {
        if (numb.toString().indexOf('.') > -1) {
            return numb.toFixed(5)
        }
        return numb;
    }

    // 隐藏根元素 防止闪耀(如果等到DOMContentLoaded结束再替换css会导致页面已经被渲染好了,整个页面布局会突然一下改变布局,很不好看,所以先对根节点隐藏起来,等到css被转换完成后再显示)
    docEl.style.display = 'none'

    /**
    * 这里等待styleSheets初始化完成
    */
    window.addEventListener('DOMContentLoaded', () => {
        for (const sheet of document.styleSheets) {
            // 为了防止将所有的style都转换,在link标签上添加attr px2rem="true"
            // 故标签变成 <link rel="stylesheet" px2rem="true" href="style.css">
            // 当然如果你要全部都转换就注释掉它
            if (sheet.ownerNode.getAttribute('px2rem') === null) continue;
            try {
                for (const item of sheet.cssRules) {
                    if (item.type != 1) continue
                    // 此处替换css中所有的px为rem
                    item.style.cssText = item.style.cssText.replace(/(\d+)px/g, function (e, px) {
                        return toFixed((px * 1) / defWidth) + 'rem';
                    })
                }
            } catch (error) { console.log(error) }
        }
        // 显示根元素
        docEl.style.display = 'initial'
    })

}(window, document));

代码写的很烂,大神误喷

转载请标明出处

把废旧的电视机顶盒华为悦盒ec6108v9刷成Ubuntu系统做家用NAS win10 route add 添加静态路由,双网卡一个内网一个外网路由配置,双网关路由配置
biu biu biu
MacStroke下载及appleScript 模拟按键脚本 共享打印机0x0000011b修复的另一种方法 yarn 设置淘宝镜像 yarn 错误There appears to be trouble with your network connection. Retrying... win11 安装限制去除 跳过TPM CPU检测 附软件 win11 桌面不满足要求水印去除 适用于跳过TPM CPU检测安装后的桌面水印