将html中的style内联样式转换为行内样式

本文介绍了一种将HTML中style标签内的内联样式转换为元素行内样式的JavaScript方法。该方法通过解析类名和样式规则,确保了样式的一致性和独立性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:因为有一段html需要传递到其他的地方,内联样式可能与其他的样式冲突,所以要将写在style标签中的内联样式转换为行内样式

思路:

 

    /**
    * 参数接收html字符串
     * 将内联样式表里面的样式改为行内样式
    * */
    transStyle(html){
        /**
         * 检测有没有style标签
        * */
        const h = $(html)[0]
        const style = h.getElementsByTagName('style')[0]
        if(!style) return html
        const shtml = style.innerHTML.replace(/\n\s*/g,'')
        /**
         * 解析类名,暂时只处理类名。
        * */
        let s1 = shtml.split('}')
        s1 = s1.filter(item=>item!=="")
        const styleMap = this.generateStyleMap(s1)
        styleMap.forEach((val,key)=>{
            /**
             * 根据key类名获取元素
            * 为元素添加val 行内样式
            * */
            const elements = h.getElementsByClassName(key)
            let v = val.replace(/\s*/g,'')
            if(v[v.length-1]==';')v = v.slice(0,-1)
            Array.prototype.forEach.call(elements, function (element) {
                const s = element.getAttribute('style')
                if(!s){
                    element.setAttribute('style',v)
                }else{
                    if(s[s.length-1]==';') element.setAttribute('style',s+v)
                    else element.setAttribute('style',s+";"+v)
                }
            });
        })
        style.parentNode.removeChild(style)
        return h.outerHTML
    }
    generateStyleMap(arr){
        const m = new Map()
        arr.forEach(item=>{
            let s2 = item.split('{')
            if(!(/,/).test(s2[0])){
                const k = s2[0].slice(1)
                this.addStyleMapItem(m,k,s2[1])
            }else{
                let s3 = s2[0].split(',')
                s3=s3.map(item=>item.slice(1))
                s3.forEach(i=>{
                    this.addStyleMapItem(m,i,s2[1])
                })
            }
        })
        return m
    }
    addStyleMapItem(map,key,addItem){
        if(map.has(key)){
            let v = map.get(key).trim()
            if(v[v.length-1]!==';') v=v+";"
            v = map.get(key)+addItem
            map.delete(key)
            map.set(key,v)
        }else{
            map.set(key,addItem)
        }
    }
React应用中使用`postcss-px-to-viewport`插件处理rem单位转换时,如果某些行内样式没有被转换,通常有以下几个原因: 1. **忽略规则**:检查你的PostCSS配置文件,确认是否对某些选择器设置了忽略转换。这可能是通过`.postcssrc.js`或`.postcss.config.js`文件中的`ignore`选项来指定的。 ```javascript module.exports = { plugins: [ require('postcss-px-to-viewport')({ unitToConvert: 'px', viewportWidth: 750, unitPrecision: 6, propList: ['*'], exclude: ['style', 'script'], // 这里可以排除不希望转换的元素 }), ], }; ``` 2. **非内联样式**:确保`postcss-px-to-viewport`只影响插入到文档中的样式,而不是直接写在HTML标签内的行内样式。对于行内样式,你可以手动转换它们,或者使用其他工具如Babel的stage-3提案`styled-components`。 3. **全局转换**:如果你使用了全局转换,那么行内样式可能会被默认包含在转换范围内。可以考虑将插件配置成仅作用于组件内的样式,或者在需要的地方使用`!important`声明阻止转换。 4. **特殊选择器**:某些属性或选择器可能因为不支持或者插件限制而不被转换。例如,某些浏览器内建的伪类或属性可能不会被处理。你可以查阅插件的文档,看看是否有这类说明。 如果上述情况都不是问题,你还可以尝试清除浏览器缓存,或者更新到最新版本的`postcss-px-to-viewport`,看是否解决了未转换的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值