zoukankan      html  css  js  c++  java
  • 第一期 花式自适应网页哪家强? 就选你啦

    咳咳. 麦克风测试ok...

    那么第一届会议开始 ...

    这次会议主题是手机web一些老生常谈的自适应问题。因为每个手机的系统不一样 大小也不一样 每个网页的排版也不一样。这个问题至今都还没有个正确的解 但这是入门手机端网页的必须跨过的一道墙。 那么究竟怎么解决这个问题了 今天我有幸请了7位选手解答 大家可以参考参考

    这里我们以640px的设计稿为例 不知道这是什么请问美术gg

    请用chrome手机游览器模式 游览选手连接

    --------------------------------------------------分割线------------------------------------------------------

    1号选手:弹性缩放

    http://demo.tolotolo.cn/fit/index.html

     核心代码:(function(win,doc){

    
     var re=function(){
      var wrap=doc.querySelector('#wrap');
        var s=doc.querySelectorAll('.s');
      var pw = 750; //设计图的宽
      var ph = 1136; //设计图的宽
      var tww = win.innerWidth;
      var twh =win.innerHeight;
    
    
      //配置比列    
      var scaleCenter = '0% 0%';
    
      var tw= 0;    //适应宽间距
      var th = 0;    //适应高间距
      var wsc = 1; //缩放比例额
    
    
      if(pw/tww*twh>=ph){
        if( tww / pw >1){
          console.log('超容器适配')
          scaleCenter="50% 50%";
          wsc = tww / pw;
          th=Math.max(0, (twh-ph) * 0.5);
          tw = Math.max(0, (tww-pw) * 0.5);
        }else{
          console.log('宽适配')
          scaleCenter="0% 50%";
          wsc = tww / pw;
          th= ph>twh?Math.min(0, -(ph - twh) * 0.5):Math.max(0, (twh-ph) * 0.5);
          tw = 0 //Math.min(0, (pw - tww) * 0.5);
        }
      }else if(ph/twh*tww>=pw){
        if( twh / ph >1){
          console.log('超容器适配')
          scaleCenter="50% 50%";
          wsc = twh / ph;
          th=Math.max(0, (twh-ph) * 0.5);
          tw = Math.max(0, (tww-pw) * 0.5);
        }else{
          console.log('高适配')
          scaleCenter="50% 0%";
          wsc = twh / ph; //获取宽比例
          th= 0 //Math.min(0, (ph - twh) * 0.5);
          tw = pw>tww?Math.min(0, -(pw - tww) * 0.5):Math.max(0, (tww-pw) * 0.5);
        }
      }else{
           console.log('无法适配');
      }
     
    
      //应用缩放
      for(var i=0;i<s.length;i++){
    
        s[i].style.transformOrigin = scaleCenter;
        s[i].style.webkitTransformOrigin = scaleCenter;
        s[i].style.transform = 'translate3d(0px, 0px, 0px) scale(' + wsc + ')';
        s[i].style.webkitTransform = 'translate3d(0px,0px, 0px) scale(' + wsc + ')';
        s[i].style.marginTop = th + "px"
        s[i].style.marginLeft =tw + "px"
      }
    
     }
     re();
     win.addEventListener('resize',re,false);
    })(window,document);

    优点:背景按宽缩放 内容按高缩放 不管你怎么拉网页大小 自动缩成最佳比例 自适应能力超强 手机电脑都可以看哦

    缺点:略微破坏了设计稿的排版比列 但可以和设计师讨论解决如何排版 以至感觉不出来

    2号选手: 单位转换

    http://demo.tolotolo.cn/fit/index2.html

    核心代码:

    (function(win,doc){
         var h;
         win.addEventListener('resize',function() {
          clearTimeout(h);
          h = setTimeout(setUnitA, 300);
        }, false);
        win.addEventListener('pageshow',function(e) {
            if (e.persisted) {
                clearTimeout(h);
                h = setTimeout(setUnitA, 300);
            }
        }, false);
        var setUnitA=function(){
            doc.documentElement.style.fontSize = doc.documentElement.clientWidth/16 + 'px';
        };
        setUnitA();
    })(window,document);
    
     优点:和一号选手一样 也拥有弹性能力 但没有通过scale属性变化 实打实的大小
    
     缺点:计算比较麻烦 要理解其中原理rem和px的比例转换。如果想控制dom元素位移比较复杂 (transform属性) 比较难掌握

    3号选手:最大化中心缩放

    http://demo.tolotolo.cn/fit/index3.html

    核心代码:

    var a = document.documentElement.clientHeight,
    s = document.documentElement.clientWidth;
    function e(e, n) {
     var t, i = s / a,
     r = 320 / 504;                             // 750版本  375/667
     t = i > r ? a / 504 : s / 320;    //t = i > r ? a / 667 : s / 375;
     
     $(e).css({
      "-webkit-transform-origin": n,
      "transform-origin": n,
      "-webkit-transform": "scale(" + t + ");",
      transform: "scale(" + t + ");"
     });
    };
    e("#wrap",'center center');

     优点:和一号选手也很像 通过scale缩放 最大化中心大小

     缺点:没有一号选手 弹性能力那么强  最大化后的中心区域没有完全覆盖手机整个屏幕 但可以通过一些手段 感觉不出来 记得overflow取消掉哦

    4号选手:像素化

    http://demo.tolotolo.cn/fit/index4.html

    核心代码:

    <meta name="viewport" content="width=640,target-densitydpi=device-dpi,user-scalable=no"/>

     优点:像pc端一样写 很暴力 很简单 适合新手 兼容性也不错 也拥有一点点弹性能力 而且属于1比1像素 布局dom元素非常容易。适合功能性页面

     缺点:手机端写法不美观 一般必须以<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=no">写表达手机页面比较好。因为只是以宽等比缩放 部分小手机如4英寸手机 无法看到整个屏幕内容。元素必须控制在高960线内 。真实大小还是1比1 所以dom元素发生位移会比缩放版的消耗更多内存,使用scale效果可能会因为图片大小超过切图大小而失真。不建议动画。

    5号选手:像素化 -伪装

    http://demo.tolotolo.cn/fit/index5.html

    核心代码:

    var viewport = document.querySelector("meta[name=viewport]");

    var winWidths=$(window).width();
    var densityDpi=640/winWidths;
        densityDpi= densityDpi>1?300*640*densityDpi/640:densityDpi;
      
    if(winWidths>=640){
        viewport.setAttribute('content', 'width=640, target-densityDpi='+densityDpi +" ,user-scalable=no");
     
    }else{
        viewport.setAttribute('content', 'width=640, user-scalable=no');
     
    }

     优点:选手4的js版本 优点和选手4一样。 只为了meta标签

     缺点:js控制 可能会从新渲染页面 性能下降一点点

    6号选手:像素化-320

    http://demo.tolotolo.cn/fit/index6.html

    核心代码:
            document.addEventListener("DOMContentLoaded", function (e) {
          var w=e.target.activeElement.clientWidth>=1024?1024:e.target.activeElement.clientWidth;
                document.getElementById('wrap').style.zoom = w / 320;
            });

     优点:选手4的优化版本 优点和选手4一样。 但因为是320大小 更适合做绚丽的动画

     缺点:缩放大小的代码有一定的莫名其妙的bug 而且这种写法也不美观。硬是变成手机端模式。  弹性能力很差 resize后没法继续刷新大小 。也和4一样 部分小手机如4英寸手机 无法看到整个屏幕内容。元素必须控制在高960线内

    7号选手: 百分比+media

    http://demo.tolotolo.cn/fit/index7.html

    核心代码:

    @media screen and (min- 321px) and (max- 768px)  {
     ...code

    }

     优点:最传统的写法 最不容易出错的写法 最符合w3c的写法

     缺点:最难的写法 要计算各种百分比 各种手机尺寸 一般还是会采用固定尺寸比较好 属于辅助写法 处理一些其他选手的一些兼容性bug

    --------------------------------------------------分割线------------------------------------------------------

    由于时间关系 市面上还有很多千奇百怪的写法 那么究竟哪家强呢?

    博主基本上喜欢 1 3 4 根据实际情况而变化 。不过 真正做到手机自适应的不是代码而是使用者的本人布局能力  让用户感觉不出来 这才是最好的自适应!

    最后我推荐这个h5 不是我做的,某位前端大神做的 但我很喜欢这种自适应。而且布局也不错 连横屏都考虑到了。 下次我也模仿看看哈

    http://pao.qq.com/cp/a20150831happy/qq.html


    本文为博主原创文章,转载请注明出自 博客园蓝波大人 并保留本文有效链接 ,转载请保留本声明!谢谢

  • 相关阅读:
    模拟赛总结
    2018.04.06学习总结
    2018.04.06学习总结
    Java实现 LeetCode 672 灯泡开关 Ⅱ(数学思路问题)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 671 二叉树中第二小的节点(遍历树)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
    Java实现 LeetCode 670 最大交换(暴力)
  • 原文地址:https://www.cnblogs.com/lanbosm/p/5348484.html
Copyright © 2011-2022 走看看