zoukankan      html  css  js  c++  java
  • flexible 移动端适配

    暂时没找到更好的办法,先这么用着

    一、首先引入 flexible.js

      办法一:加载阿里CDN的文件

    <script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js"></script>

      办法二:引入一个.css 文件和一个.js文件,内容如下(也可自己下载)

    flexible.css
    @charset "utf-8";
    
    html {
        color: #000;
        background: #fff;
        overflow-y: scroll;
        -webkit-text-size-adjust: 100%;
        -ms-text-size-adjust: 100%
    }
    
    html * {
        outline: 0;
        -webkit-text-size-adjust: none;
        -webkit-tap-highlight-color: rgba(0, 0, 0, 0)
    }
    
    html,
    body {
        font-family: sans-serif
    }
    
    body,
    div,
    dl,
    dt,
    dd,
    ul,
    ol,
    li,
    h1,
    h2,
    h3,
    h4,
    h5,
    h6,
    pre,
    code,
    form,
    fieldset,
    legend,
    input,
    textarea,
    p,
    blockquote,
    th,
    td,
    hr,
    button,
    article,
    aside,
    details,
    figcaption,
    figure,
    footer,
    header,
    hgroup,
    menu,
    nav,
    section {
        margin: 0;
        padding: 0
    }
    
    input,
    select,
    textarea {
        font-size: 100%
    }
    
    table {
        border-collapse: collapse;
        border-spacing: 0
    }
    
    fieldset,
    img {
        border: 0
    }
    
    abbr,
    acronym {
        border: 0;
        font-variant: normal
    }
    
    del {
        text-decoration: line-through
    }
    
    address,
    caption,
    cite,
    code,
    dfn,
    em,
    th,
    var {
        font-style: normal;
        font-weight: 500
    }
    
    ol,
    ul {
        list-style: none
    }
    
    caption,
    th {
        text-align: left
    }
    
    h1,
    h2,
    h3,
    h4,
    h5,
    h6 {
        font-size: 100%;
        font-weight: 500
    }
    
    q:before,
    q:after {
        content: ''
    }
    
    sub,
    sup {
        font-size: 75%;
        line-height: 0;
        position: relative;
        vertical-align: baseline
    }
    
    sup {
        top: -.5em
    }
    
    sub {
        bottom: -.25em
    }
    
    a:hover {
        text-decoration: underline
    }
    
    ins,
    a {
        text-decoration: none
    }
    

      

    flexible.js
    (function (win, lib) {
        var doc = win.document;
        var docEl = doc.documentElement;
        var metaEl = doc.querySelector('meta[name="viewport"]');
        var flexibleEl = doc.querySelector('meta[name="flexible"]');
        var dpr = 0;
        var scale = 0;
        var tid;
        var flexible = lib.flexible || (lib.flexible = {});
    
        if (metaEl) {
            console.warn('将根据已有的meta标签来设置缩放比例');
            var match = metaEl.getAttribute('content').match(/initial-scale=([d.]+)/);
            if (match) {
                scale = parseFloat(match[1]);
                dpr = parseInt(1 / scale);
            }
        } else if (flexibleEl) {
            var content = flexibleEl.getAttribute('content');
            if (content) {
                var initialDpr = content.match(/initial-dpr=([d.]+)/);
                var maximumDpr = content.match(/maximum-dpr=([d.]+)/);
                if (initialDpr) {
                    dpr = parseFloat(initialDpr[1]);
                    scale = parseFloat((1 / dpr).toFixed(2));
                }
                if (maximumDpr) {
                    dpr = parseFloat(maximumDpr[1]);
                    scale = parseFloat((1 / dpr).toFixed(2));
                }
            }
        }
        if (!dpr && !scale) {
            var isAndroid = win.navigator.appVersion.match(/android/gi);
            var isIPhone = win.navigator.appVersion.match(/iphone/gi);
            var devicePixelRatio = win.devicePixelRatio;
            if (isIPhone) {
                // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
                if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
                    dpr = 3;
                } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
                    dpr = 2;
                } else {
                    dpr = 1;
                }
            } else {
                // 其他设备下,仍旧使用1倍的方案
                dpr = 1;
            }
            scale = 1 / dpr;
        }
        docEl.setAttribute('data-dpr', dpr);
        if (!metaEl) {
            metaEl = doc.createElement('meta');
            metaEl.setAttribute('name', 'viewport');
            metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
            if (docEl.firstElementChild) {
                docEl.firstElementChild.appendChild(metaEl);
            } else {
                var wrap = doc.createElement('div');
                wrap.appendChild(metaEl);
                doc.write(wrap.innerHTML);
            }
        }
    
        function refreshRem() {
            var width = docEl.getBoundingClientRect().width;
            if (width / dpr > 540) {
                width = 540 * dpr;
            }
            var rem = width / 10;
            docEl.style.fontSize = rem + 'px';
            flexible.rem = win.rem = rem;
        }
        win.addEventListener('resize', function () {
            clearTimeout(tid);
            tid = setTimeout(refreshRem, 300);
        }, false);
        win.addEventListener('pageshow', function (e) {
            if (e.persisted) {
                clearTimeout(tid);
                tid = setTimeout(refreshRem, 300);
            }
        }, false);
        if (doc.readyState === 'complete') {
            doc.body.style.fontSize = 12 * dpr + 'px';
        } else {
            doc.addEventListener('DOMContentLoaded', function (e) {
                doc.body.style.fontSize = 12 * dpr + 'px';
            }, false);
        }
    
        refreshRem();
        flexible.dpr = win.dpr = dpr;
        flexible.refreshRem = refreshRem;
        flexible.rem2px = function (d) {
            var val = parseFloat(d) * this.rem;
            if (typeof d === 'string' && d.match(/rem$/)) {
                val += 'px';
            }
            return val;
        }
        flexible.px2rem = function (d) {
            var val = parseFloat(d) / this.rem;
            if (typeof d === 'string' && d.match(/px$/)) {
                val += 'rem';
            }
            return val;
        }
    })(window, window['lib'] || (window['lib'] = {}));
    

      

    flexible.js 适配方法中,1rem = 75px,也就是说上面该引入的引入之后,写的时候只要用设计图上的 px /  75 ,就是rem。
    本人使用的编辑器是vs code ,其中有个插件儿名为 px to rem ,安装之后,点击右下角设置图标,打开扩展设置,将最下面的 px-pet-rem 设置为  75  即可。然后再实际操作中,将光标置于px处, Alt + z ,即可将px 装换为 rem。
     
    另附:有的时候这个适配对 iPad  和 iPad pro 不太适用,附上解决办法一则:
     
    <script>
        /(iPhone|iPad|iPhone OS|Phone|iPod|iOS|Android)/i.test(navigator.userAgent) &&
            ((head = document.getElementsByTagName('head')),
                (viewport = document.createElement('meta')),
                (viewport.name = 'viewport'),
                (viewport.content =
                    'target-densitydpi=device-dpi, width=375px, user-scalable=no'),
                head.length > 0 && head[head.length - 1].appendChild(viewport))
    </script>
    

      

  • 相关阅读:
    【转载】[030]◀▶ ArcEngine 一些实现代码
    C#获取FTP目录下文件夹、文件的方法,进而判断FTP下指定文件夹是否存在
    C# 命名空间"DevExpress.XtraReports.UserDesigner"中不存在类型或命名空间名称"XRTabbedMdiManager"。是否缺少程序集引用?
    C#欢迎界面的两种形式
    RibbonForm中Text显示不完整
    IDL波段分解与合成源代码
    Java多线程--synchronized(二)
    Java多线程--synchronized(一)
    Java多线程--基础(三)
    Java多线程--基础(二)
  • 原文地址:https://www.cnblogs.com/xiaoyaolang/p/13553717.html
Copyright © 2011-2022 走看看