美文网首页
将内联样式的px转化为rem

将内联样式的px转化为rem

作者: __橘生淮南 | 来源:发表于2018-04-02 22:47 被阅读0次

最近有个需求,运营希望将135编辑器里面的排版可以复制到我们自己的后台,在app端实现排版样式的多样化。显然,135编辑器复制过去的代码的样式是内联样式,但我们的H5是将css文件统一处理,单位px转化为rem,实现自适应布局。由于内联样式无法被转化,所以该需求简化为就是将内联样式的px转化为rem

参考微信的weixin/posthtml-px2rem的方式,稍微改写一下
通过posthtml处理html,再利用posthtml-attrs-parser插件提取style属性,最后利用正则表达式实现转化

// pxToRem.js
'use strict';
var lodash = require('lodash');
var parseAttrs = require('posthtml-attrs-parser');
var posthtml = require('posthtml');

export default function (str, options) {
    var pxRegex = /(\d*\.?\d+)px/ig;

    options = lodash.extend({
        rootValue: 16, // root font-size
        unitPrecision: 5, // numbers after `.`
        minPixelValue: 0 // set it 2 if you want to ignore value like 1px & -1px
    }, options);

    function createPxReplace(rootValue, unitPrecision, minPixelValue) {
        return function (m, $1) {

            // ignoring `PX` `Px`
            if (m.indexOf('px') === -1) {
                return m;
            }
            if (!$1) {
                return m;
            }
            var pixels = parseFloat($1);

            if (pixels < minPixelValue) {
                return m;
            }
            return toFixed((pixels / rootValue), unitPrecision) + 'rem';
        };
    }

    function toFixed(number, precision) {
        var multiplier = Math.pow(10, precision + 1),
            wholeNumber = Math.floor(number * multiplier);
        return Math.round(wholeNumber / 10) * 10 / multiplier;
    }

    var pxReplace = createPxReplace(options.rootValue, options.unitPrecision, options.minPixelValue);

    return Promise.try(() => {
        return posthtml()
        .use(function(tree) {
           tree.match({attrs: {style: true}}, function (node) {
                var attrs = parseAttrs(node.attrs);
                for (var x in attrs['style']) {
                    if (attrs['style'].hasOwnProperty(x)) {
                        var styleValue = attrs['style'][x];
    
                        // e.g. style="width=10px; width=20px;"
                        if (typeof styleValue == 'object')
                            styleValue = styleValue[styleValue.length - 1];
    
                        var newStyleValue;
                        newStyleValue = styleValue.toString().replace(pxRegex, pxReplace);
    
                        attrs['style'][x] = newStyleValue;
                    }
                }
    
                node.attrs = attrs.compose();
                return node;
            });
        })
        .process(str)
        .then(function(result) {
            return result.html;
        })
    });
};

后端接口请求到的文章内容是content: '<div><div>'类似这样的字符串,将其格式化

import pxToRem from 'px-to-rem.js';

pxToRem(str).then(res => { this.content = res; })

相关文章

  • 将内联样式的px转化为rem

    最近有个需求,运营希望将135编辑器里面的排版可以复制到我们自己的后台,在app端实现排版样式的多样化。显然,13...

  • px2rem-loader保留px不转换为rem

    遇到问题:使用插件px2rem-loader时,有部分样式不想要自动转换成rem解决办法:将px改为PX即可px2...

  • vue pc端适配

    以1920px的设计稿为基准,使用postcss-plugin-px2rem自动将px转rem 1.新建一个res...

  • 【css】单位转换

    px转rem 切换元素样式 使用类似Jq的方法toggleClass进行切换类别样式 判断各种数据类型

  • H5 部分安卓机 内置浏览器低版本 不显示1px 的bord

    vue 项目中使用的px2rem插件,自动将css样式中的px转成rem。但是安卓中低版本的浏览器不显示1px以下...

  • VUE中Rem 适配解决方案

    此方案是借助两个插件,将px进行转化为rem。 lib-flexible 用于设置 rem 基准值。由淘宝手机前端...

  • 2019-06前端面试题

    将项目传到远程github上 js跨域 px、em、rem let、const 行内样式设置width、heigh...

  • vue px2rem

    vue ,使用rem单位,可在不同屏幕上完美显示相同的布局。px2rem 插件方便的将px单位转为了rem。 px...

  • 使用postcss-px2rem无法转换vue模板文件中的scs

    移动端的项目使用postcss-px2rem将px转换成rem,使用css时可以转换成rem但使用scss缺无法将...

  • 前端

    1.字体样式 字体大小:font-size:16px/1rem;(px是像素单位,rem/em 相对单位,跟浏览器...

网友评论

      本文标题:将内联样式的px转化为rem

      本文链接:https://www.haomeiwen.com/subject/bgdfhftx.html