H5移動端適配之px轉vw(附工具)


最近做官網H5的開發,開發之前首先想到的是移動端的適配問題。目前比較流行的有rem和vw,我選擇了vw,但是設計稿的單位是px,轉化成vw,要有很多的計算,不方便,所以就想着先按設計稿把界面寫出來,然后一次性把單位換算過來。首先想到的是用webpack插件處理,但是自己需要配置環境,所以就想着自己制作這樣一個類似的插件了。先看一下效果吧

 

先設置好設計稿的寬,然后直接把用px寫的css文件內容全選復制,粘貼過來,按回車或者點擊轉換即可全部轉換成vw,再回去粘貼覆蓋原來的代碼就可以了。使用起來真的是方便。

再附上源碼,復制過去直接用吧

<!DOCTYPE html>
<html>  
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,height=device-height,inital-scale=1.0,maximum-scale=1.0,user-scalable=no;">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>代碼計算器</title>
    <style>
        
    </style>
</head>
<body>
    <form>
        <fieldset>
            <legend>設計稿設置</legend>
            <label>寬:<input type="text" value="375" id="width" /></label><br />
            <label>高:<input type="text" value="667" id="height" /></label><br />
            <button id="setUI">確定</button>
        </fieldset>
        <fieldset>
            <legend>源代碼</legend>
            <textarea autofocus name="origin_code" id="origin_code" cols="100" rows="10"></textarea><br />
            <button id="trans">轉換</button>
            <label><input type="checkbox" checked id="autoCopy" />自動復制</label>
        </fieldset>
        <fieldset>
            <legend>轉換后代碼</legend>
            <textarea name="code" id="code" cols="100" rows="10"></textarea><br />
            <button id="copy">復制</button>
            <button id="reset">清空</button>
        </fieldset>
    </form>

    <script>
        function getId(id){
            return document.getElementById(id);
        }
        function getName(name){
            return document.getElementsByName(name)[0];
        }
        var  widthIpt = getId("width");
        var  heightIpt = getId("height");
        var setUIBtn = getId("setUI");

        var origin_code_input = getName("origin_code");
        var transBtn = getId("trans");
        var autoCopyInput = getId("autoCopy");

        var code_input = getName("code");
        var copyBtn = getId("copy");
        var reset = getId("reset");


        var width,height;
        function setUI(){
            width = +widthIpt.value;
            height = +heightIpt.value;
        }
        setUI();

        setUIBtn.onclick = function(e){
            e.preventDefault();
            setUI();
        }

        function copy(text) {
            var textareaEl = document.createElement('textarea');
            textareaEl.setAttribute('readonly', 'readonly'); // 防止手機上彈出軟鍵盤
            // input.setAttribute('value', text);
            textareaEl.value = text;
            document.body.appendChild(textareaEl);
            // input.setSelectionRange(0, 9999);
            textareaEl.select();
            var res = document.execCommand('copy');
            document.body.removeChild(textareaEl);
            console.log("復制成功");
            return res;
        }

        function trans(originCode){
            console.log(originCode);
            var code;
            var reg = /(\d+(\.\d+)?)px/gi;
            code = originCode.replace(reg, function(px,num){
                // 100vw = width px   ->   1px = 100vw/width
                // console.log(px, num);
                return (num * 100 / width).toFixed(3) + "vw";
            });

            return code;
        }

        transBtn.onclick = function(e){
            e.preventDefault();
            var res = trans(origin_code_input.value);
            code_input.value = res;
            if(autoCopy){
                copyAndReset(res);
            }
        }
        origin_code_input.onkeypress = function (e){ 
            if(e.keyCode == 13){
                var res = trans(origin_code_input.value);
                code_input.value = res;
                console.log(autoCopy);
                if(autoCopy){
                    copyAndReset(res);
                }
            }
        }
        
        var autoCopy = autoCopyInput.checked;
        autoCopyInput.onchange = function (e){
            autoCopy = autoCopyInput.checked;
        }

        function copyAndReset(code){
            copy(code);
            origin_code_input.value = "";
        }
        
        copyBtn.onclick = function(e){
            e.preventDefault();
            copyAndReset(code_input.value);
        }

        reset.onclick = function (e){
            e.preventDefault();
            code_input.value = "";
            origin_code_input.value = "";
        }
    </script>
</body>
</html>

下面分析一下轉化思路

首先要知道 屏幕的寬度是100vw,設計稿的寬度假設是width, 即:100vw = width px; 根據數學中的比例推導出 1px = 100vw / width; 那么n px = n * 100 vw / width;

然后全部替換的思路是用字符串的替換,全局找出px,然后將n px替換成 m vw;

為了提高操作效率,我這里加入了自動復制,即點擊復制(或者按Enter鍵)之后,自動將轉換后的代碼放到粘貼板中。為了方便下次粘貼,有將源代碼清空了,下次還是直接粘貼,回車,再粘回去。

js實現復制內容不懂的可以參考一下這篇博客 https://www.cnblogs.com/zhaodesheng/p/11464934.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM