zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    歌曲汇总
    赤道附近
    看樱花(也有很多其他花)
    线程池异常处理之重启线程处理任务
    ElasticSearch Index操作源码分析
    探究ElasticSearch中的线程池实现
    由字典树想到的
    ElasticSearch 启动时加载 Analyzer 源码分析
    Elasticsearch6.3.2启动过程源码阅读记录
    Elasticsearch High Level Rest Client 发起请求的过程分析
  • 原文地址:https://www.cnblogs.com/zhaodesheng/p/13366072.html
Copyright © 2011-2022 走看看