zoukankan      html  css  js  c++  java
  • 手机淘宝flexible布局探索及最终方案

    相关文章

    http://blog.csdn.net/junreycen/article/details/51261653

    http://www.html-js.com/article/2402

    https://segmentfault.com/a/1190000004403496

    https://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html?utm_source=tuicool&utm_medium=referral


    关于width=device和initial-scale

    layout-viewport的宽度就是文档元素HTML的宽度,用docEl.getBoundingClientRect().width计算
    浏览器的宽度是基于layout-viewport的宽度比例来的(看网页缩放的情况),由window.innerwidth计算(或者用idea viewport根据缩放比例来算)

    width=device作用是让layout-viewport和浏览器宽度保持一致

    当不设置width=device时:

    1.不设置initial-scale,不设置maximum-scale=x minimum-scale=x,则layout-viewport默认为980px,但是安卓会自动缩放网页使得浏览器宽度和layout宽度一致,此时浏览器宽度也为980px,ios也会自动缩放网页,但是缩放结果依然是大于浏览器宽度

    2.不设置initial-scale, 但用maximum-scale=1 minimum-scale=1禁止自动缩放,此时网页无缩放,layout为980px ,浏览器窗口宽度计算结果为idea viewport的宽度。

    3.不设置initial-scale,但用maximum-scale=x minimum-scale=x x不等于1 来缩放网页,安卓端,当x<=1/dpr,浏览器宽度和layout-viewport永远为980px ios端当浏览器宽度计算结果>=980px时,layout-viewport会自动变为和浏览器宽度一致。其余情况安卓和ios,layout-viewport为980px

    4.设置initial-scale后(maximum-scale=x minimum-scale=x 设置与否,无所谓)
    ,ios端layout-viewport就会默认和浏览器宽度一致(以idea viewport为基础计算),安卓端 当initial-scale=1时layout-viewport就会和浏览器宽度一致,当initial-scale不等1时,还是和情况3一样
    (其实安卓端设置maximum-scale=x minimum-scale=x和设置initial-scale是一回事,都是按照idea viewport为基础缩放网页,iso端设置initial-scale后,layout-viewport就会默认和浏览器宽度一致,并且以idea viewport为基础计算)

    当设置width=device时,

    1.不设置initial-scale,不设置maximum-scale=x minimum-scale=x,安卓端,layout viewport=idea viewport,浏览器宽度=idea viewport。ios端 ,网页会放大,layout viewport=idea viewport,浏览器宽度小于idea viewport。

    2.不设置initial-scale,设置maximum-scale=1 minimum-scale=1,安卓端和ios端一致,layout viewport=idea viewport,浏览器宽度=idea viewport

    3,不设置initial-scale,设置maximum-scale=x minimum-scale=x,当x<1时,安卓端和ios端一致,layout viewport=浏览器宽度(用idea viewport根据缩放比例来算),当x>1时,安卓端和ios端一致,layout viewport=idea viewport,浏览器宽度小于layout宽度。

    4.设置initial-scale,不设置maximum-scale=x minimum-scale=x,当initial-scale>=1时,安卓端和ios端一致,layout viewport=idea viewport,浏览器宽度=idea viewport
    ,当1>initial-scale>1/dpr时,安卓端,layout viewport=浏览器宽度(用idea viewport根据缩放比例来算),ios端,layout viewport用idea viewport根据缩放比例来算,浏览器宽度大于或者小于layout宽度。当initial-scale<=1/dpr,安卓端,layout viewport用idea viewport根据缩放比例来算,浏览器宽度小于layout宽度。ios端layout viewport=浏览器宽度(用idea viewport根据缩放比例来算

    5.设置initial-scale,设置maximum-scale=x minimum-scale=x,当initial-scale=1,x=1时,安卓端和ios端一致,layout viewport=idea viewport,浏览器宽度=idea viewport
    当initial-scale=x<1 时,安卓端和ios端一致layout viewport=浏览器宽度(用idea viewport根据缩放比例来算),当initial-scale=x>1 时layout viewport=idea viewport,浏览器宽度小于idea viewport。

    总结:淘宝flexible 采用的方案是,不设置width=device,设置initial-scale=x,maximum-scale=x minimum-scale=x,并且安卓端x=1,ios端x<=3;

    rem缩放布局js (在需要添加缩放标签的地方添加一下代码),注意用rem值得行高撑起盒子可能会出现一些高度不正常的现象,解决办法就是height和line-height都写出来
    <script>
    /*采用flexible方案布局*/
    var rem;
    var setDpr,scale;
    var docEle=document.documentElement;
    var browserInfo=window.navigator.userAgent;
    var dpr=window.devicePixelRatio;
    var isIphone=/iphone/i.test(browserInfo);
    var isIOS9_3=isIphone && /OS 9_3/.test(browserInfo);
    setDpr = isIphone && !isIOS9_3 ? dpr>= 3 ? 3 : dpr >= 2 ? 2 : 1 : 1;
    scale=1/setDpr;
    metaEle=document.createElement("meta");
    metaEle.name="viewport";
    metaEle.content="initial-scale="+scale+" maximum-scale="+ scale + " minimum-scale="+ scale + " user-scalable=no";
    if(docEle.firstElementChild){
    docEle.firstElementChild.appendChild(metaEle);
    }else {
    var wrap = document.createElement('div');
    wrap.appendChild(metaEle);
    document.write(wrap.innerHTML);
    }
    function refreshRem() {
    var width=docEle.getBoundingClientRect().width;
    width=(width/setDpr>540) ? 540*setDpr : width;
    rem=width/10;
    docEle.style.fontSize=rem+"px";
    docEle.setAttribute('data-dpr', setDpr);
    }
    refreshRem();
    </script>

  • 相关阅读:
    SharePoint缓存配置
    修改默认的个人站点
    生成代码工具
    Ext 布局(layout)
    编程网站
    EXT 4.0 上传文件
    修改Ext grid 单元格
    Ext.tip.Tooltip 提示
    EXT iframe 应用
    EXT 4.0 TreeGrid 使用
  • 原文地址:https://www.cnblogs.com/mei123/p/8467192.html
Copyright © 2011-2022 走看看