將內(nèi)聯(lián)樣式的px轉(zhuǎn)化為rem

最近有個需求冯凹,運營希望將135編輯器里面的排版可以復(fù)制到我們自己的后臺谎亩,在app端實現(xiàn)排版樣式的多樣化。顯然宇姚,135編輯器復(fù)制過去的代碼的樣式是內(nèi)聯(lián)樣式匈庭,但我們的H5是將css文件統(tǒng)一處理,單位px轉(zhuǎn)化為rem,實現(xiàn)自適應(yīng)布局浑劳。由于內(nèi)聯(lián)樣式無法被轉(zhuǎn)化阱持,所以該需求簡化為就是將內(nèi)聯(lián)樣式的px轉(zhuǎn)化為rem

參考微信的weixin/posthtml-px2rem的方式魔熏,稍微改寫一下
通過posthtml處理html,再利用posthtml-attrs-parser插件提取style屬性衷咽,最后利用正則表達(dá)式實現(xiàn)轉(zhuǎn)化

// 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;
        })
    });
};

后端接口請求到的文章內(nèi)容是content: '<div><div>'類似這樣的字符串,將其格式化

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

pxToRem(str).then(res => { this.content = res; })
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒜绽,一起剝皮案震驚了整個濱河市镶骗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躲雅,老刑警劉巖鼎姊,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡相寇,警方通過查閱死者的電腦和手機慰于,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唤衫,“玉大人东囚,你說我怎么就攤上這事≌绞冢” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵桨嫁,是天一觀的道長植兰。 經(jīng)常有香客問我,道長璃吧,這世上最難降的妖魔是什么楣导? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮畜挨,結(jié)果婚禮上筒繁,老公的妹妹穿的比我還像新娘。我一直安慰自己巴元,他們只是感情好毡咏,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逮刨,像睡著了一般呕缭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上修己,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天恢总,我揣著相機與錄音,去河邊找鬼睬愤。 笑死片仿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尤辱。 我是一名探鬼主播砂豌,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啥刻!你這毒婦竟也來了奸鸯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤可帽,失蹤者是張志新(化名)和其女友劉穎娄涩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蓄拣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年扬虚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片球恤。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辜昵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咽斧,到底是詐尸還是另有隱情堪置,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布张惹,位于F島的核電站舀锨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宛逗。R本人自食惡果不足惜坎匿,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雷激。 院中可真熱鬧替蔬,春花似錦、人聲如沸屎暇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽根悼。三九已至快毛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間番挺,已是汗流浹背唠帝。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留玄柏,地道東北人襟衰。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像粪摘,于是被迫代替她去往敵國和親瀑晒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案徘意? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 13,751評論 1 92
  • 一年前筆者寫了一篇 《手機端頁面自適應(yīng)解決方案—rem布局》苔悦,意外受到很多朋友的關(guān)注和喜歡。但隨著時間的推移椎咧,該方...
    梁相輝閱讀 120,947評論 432 709
  • 6個月18天玖详,這201天把介。收獲的也是滿缽您觉,我與boss更加深了彼此的了解悲酷,沒有這201天的合,可能我們的問題與痛苦...
    妮妮power閱讀 158評論 0 0
  • 單位放假溜嗜,我也一早趕了回來向臀。 連下幾天大雪巢墅,路比較滑,車也走得慢券膀【遥回到家已經(jīng)快四點了。老娘今年回老家了芹彬,家里只有老...
    青梅不酸閱讀 242評論 0 1
  • 2017.09.22 昨夜剛剛經(jīng)歷雷電暴雨庵芭, 今日卻和前些天一樣, 熱得不像話雀监, 路上匆匆的行人, 也包括我眨唬, 熱...
    8e094831613b閱讀 235評論 2 0