欢迎关注得胜的git仓库

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

posted on 2020-07-23 14:19  web得胜  阅读(4912)  评论(0编辑  收藏  举报

导航

感谢观看web得胜的博客,如果您觉得对你有帮助,请点赞支持一下哦~。发现问题请留言指正,谢谢!