移动web开发布局

218 阅读3分钟

一、屏幕适配问题

解决方案

  1. 流式布局

    :就是百分比布局,非固定像素,内容像两侧填充,理解成流动的布局,称为流式布局。

  2. viewport视口(主流的适配方案)

       :移动端特有,是一个虚拟的区域,承载网页的。

<meta name="viewport" content="width=device-width,initial-scale=1,maximun-scale=1,minimum-scale=1,user-scalable=0" />

承载的关系: 浏览器->viewport->网页

  3. 非主流适配(淘宝:目前看已经改为主流,已淘汰)

:根据物理像素放大当前的页面(2或者3倍)

二、移动端常设置盒子的类型为边框盒

box-sizing: border-box;

三、去除/增加高亮

-webkit-tap-highlight-color: transparent;

遇到的问题

  1. **2倍背景图失真问题(通过设置背景图片缩小一倍来实现background-size: x/2px y/2px; 对应的获取单个图标元素的时候**background-position: x/2 y/2 也要是原来的一半)****
  2. **图片和文字基线问题**

    解决办法3种 1. 设置字体大小 body { font-size: 0; //明显不合适 } 2. 设置图片的样式 img { display: block; } 3. 设置图片的基准 img { vertical-align: middle; // 另外的值也可以 }

附:京东移动端百分比布局

四、移动端触摸事件

touch是移动端的触摸事件,而且是一组事件
touchstart:当手指触摸屏幕的时候触发
touchmove:当手指在屏幕来回的滑动时候触发
touchend:当手指离开屏幕的时候触发
touchcancel:当被迫终止滑动的时候触发(来电,弹消息)
注:利用touch相关事件实现移动端常见滑动效果和移动端常见的手势事件

1. touchstart

touchList

触摸点(一个手指触摸就是一个触发点,和屏幕的接触点的个数)的集合,changedTouches 改变后的触摸点集合,targetTouches 当前元素的触发点集合,touches 页面上所有触发点集合

2. touchmove

3. touchend

通过上面的打印可以看到 changedTouches 每个事件都会记录, targetTouches、touches 在离开屏幕touchend的时候无法记录触摸点

上面打印的分别是:

clientX clientY 基于浏览器窗口(视口)

pageX pageY 基于页面(视口)

screenX screenY 基于屏幕

4. 模拟手势事件

<script type="text/javascript">
      function isSlider(dom, leftFunc, rightFunc)
      {
        let isMove   = false;
        let start    = 0;
        let distance = 0;

        dom.addEventListener('touchstart', function (e) {
          start = e.touches[0].clientX;
        }, false);
        dom.addEventListener('touchmove', function (e) {
          distance = e.touches[0].clientX - start;
          isMove   = true;
        }, false);
        dom.addEventListener('touchend', function (e) {
          if (isMove && Math.abs(distance) >= 50) {
            if (distance > 0) {
              rightFunc && rightFunc.call(this, e);
            } else {
              leftFunc && leftFunc.call(this, e);
            }
          }

          isMove   = false;
          start    = 0;
          distance = 0;
        }, false);
      }

      let divDom = document.querySelector('.box');
      function left(e)
      {
        console.log('move left');
        console.log(e);
      }
      function right(e)
      {
        console.log('move right');
        console.log(e);
      }
      isSlider(divDom, left, right);
    </script>

5. 模拟tap事件

移动端也是有点击事件的,不过延迟了300ms(为了区分是触摸还是点击),所以可以利用上面的3个事件,计算开始到结束的时间差,如果小于300ms,默认为点击,否则就是滑动事件

<script type="text/javascript">
      // 不加viewport标签,可以看到双底放大的效果,很明星!!!双击可以测试!!!
      let tapFunc = function(dom, callback) {
        let isMove   = false;
        let diffTime = 0;
        let start    = 0;
        dom.addEventListener('touchstart', function (e) {
          start = Date.now();
        });
        dom.addEventListener('touchmove', function (e) {
          isMove = true
          diffTime = Date.now() - start;
        });
        dom.addEventListener('touchend', function (e) {
          if (!isMove && diffTime < 150) {
            callback && callback.call(this, e);
          }
        });
      }
      tapFunc(document.querySelector('.box'), function (e) {
        console.log(e)
        console.log('tap')
      });
    </script>

五、Bootstrap布局

这里就不做过多的介绍了,详细的可以参考官网。

六、rem布局

1. less认识

1\. css预处理语言
2\. less无法在浏览器端直接使用,浏览器不识别,必须解析成css代码
3\. 通过less解析插件(javascript)
4\. 引入less文件需要加上 type="text/less"
5\. less.watch(); 无刷新预览样式
6\. 以http形式打开网页预览
demo:
...
<!--书写less样式的代码-->
<link rel="stylesheet" type="text/less" href="../less/test.less">
<script src="../lib/less/less.min.js"></script>
<script>less.watch();</script>
....

2.rem认识

1\. rem是相对单位,大小是基于html元素的字体大小
2\. em也是相对单位,但大小是基于父元素的字体大小

⚠️注意:浏览器默认的字体大小是16px

百分比布局不能解决高度自适应的问题,rem布局可以设置高度和宽度都是rem单位,做到宽度和高度都是自适应。

...
<style>
        /*假设的设备  320px 414px 640px */
        @media (min-width: 320px) {
            html{
                font-size: 50px;
            }
        }
        @media (min-width: 414px) {
            html{
                font-size: 64.6875px;
            }
        }
        @media (min-width: 640px) {
            html{
                font-size: 100px;
            }
        }
        body{
            margin: 0;
            padding: 0;
            font-size: 14px;
        }
        /*流式容器*/
        header{
            width: 100%;
            height: 1rem;
            line-height: 1rem;
            font-size: 0.32rem;
            text-align: center;
            background: green;
            color: #fff;
        }
    </style>
...
<!--1.伸缩布局   flex -->
<!--2.流式布局  百分比 -->
<!--3.响应布局  媒体查询 (超小屏设备的时候:流式布局)-->
<!--共同点:元素只能做宽度的适配(排除图片)-->
<!--适配方案rem:宽度和高度都能做到适配(等比缩放)-->
<!--4.rem布局-->
<!--通过控制html上的字体大小去控制页面上所有已rem为单位的基准值控制尺寸-->
<!--4.1 把页面上px单位转换成rem单位-->
<!--4.2 页面制作的时候 psd 上的量取的px转成rem使用-->
<!--4.3 怎么换算???预设一个基准值 方便计算 100px -->
<!--4.4 适配的时候设置基准值  320px  50px 怎么算:(640px 100px ===320px 50px)-->
<!--4.5 换算公式:当前rem基准值 = 预设的基准值 / 设计稿宽度 * 当前设备的宽度 -->
<!--4.6 怎么去改变 (js换算,媒体查询推荐)-->

附:苏宁rem布局

移动端适配-Rem 布局篇

七、现在移动端布局

1. Flex

2. Grid

3. vw、vh、vmin、vmax4个视口单位

  • vw : 1vw 等于视口宽度的1%
  • vh : 1vh 等于视口高度的1%
  • vmin : 选取 vw 和 vh 中最小的那个
  • vmax : 选取 vw 和 vh 中最大的那个

有兴趣的可以自己去了解,本文旨在记录自己学习移动端开发的记录。