zoukankan      html  css  js  c++  java
  • 移动端布局以及相关单位

    之前做了很多移动端布局,今天为大家总结一些经验。

    一. viewport

    如今可以绝大部分浏览器里(即主流的安卓浏览器和ios),都支持对viewport的一个控制了。一般的,我们会这么写。

    viewport默认有6个属性

    • 设置viewport的宽度(即之前所提及到的,浏览器的宽度详),这里可以为一个整数,又或者是字符串"width-device"
    • initial-scale: 页面初始的缩放值,为数字,可以是小数
    • minimum-scale: 允许用户的最小缩放值,为数字,可以是小数
    • maximum-scale: 允许用户的最大缩放值,为数字,可以是小数
    • height: 设置viewport的高度(我们一般而言并不能用到)
    • user-scalable: 是否允许用户进行缩放,'no'为不允许,'yes'为允许

        如:<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=0.5,minimum-scale=0.5,maximum-scale=0.5">

    二. 关于我们的设备

    1. 需要了解的以下三个概念:

      • PPI:Pixels Per Inch缩写,表示的是每英寸所拥有的像素数目
      • DPR: 默认缩放为100%的情况下,设备物理像素和CSS像素(逻辑像素)的比值,即物理像素/逻辑像素
      • Resolution: 就是我们常说的分辨率
    2. 物理像素与逻辑像素

      看了我们上面内容,或许有些人会有些疑问,我的安卓手机,或者iphone6plus(目前应该仅限于这一款机型吧),买回来的是1920x1080的或者其他更高的,比我之前所谓的那个viewport默认的980px要大。

      这样的问题,也就是我之前所说的物理像素与逻辑像素的关系了(即DPR)。以1920x1080为例,1080为物理像素,而我们在viewport中,获取到的,比如"width-device",是逻辑像素。所以之前viewport的默认值,所比对的大小,其实是逻辑像素的大小,而非物理像素的大小。

      以iphone6为例,在不做任何缩放的条件下,iphone6的获取到的'width-device'为375px,为屏幕的逻辑像素。而购买时我们所知的750px,则为屏幕的物理像素。

    3. CSS的问题

      有了上面第二点的一些基础,还是以iphone6为例,我们可以知道,其实我们所写的1px,在iphone6上为2px的物理像素。所以,最后的,给出一个结论。就是我们写的1px,在移动端,是逻辑像素的1px,而非物理像素的1px。

    三. 使用rem布局

    这里先了解一下常用的一些单位:

       px:   绝对单位,固定值

       %:相对单位    在宽度计算上还是不错的,但是高度上就比较麻烦

       em:相对单位    根据自身或者父级字体大小进行计算

       rem:相对单位    r = root -> html   依赖简单,只受html的字体大小的影响。

    到这里就是我们的重点,rem是相对根元素,所以我们可以根据屏幕宽度 来设置根元素html 的字体大小,从而使用rem 单位进行布局:

    动态获取屏幕宽度设置字体大小的代码:

    <script>
    var initScale = 1 / window.devicePixelRatio;
    document.write('<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale='+ initScale +',minimum-scale='+ initScale +',maximum-scale='+ initScale +'">')

    console.log(window.document.documentElement.clientWidth);

    var initWidth = window.document.documentElement.clientWidth;
    document.getElementsByTagName('html')[0].style.fontSize = initWidth / 10 + 'px';
    </script>

    然后,我们就可以在页面布局中使用rem 为单位,实现动态布局,以适应屏幕尺寸。

    最后,再给大家一个案例。

    <!DOCTYPE html>
    <html lang="zh-CN">
    
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
    var initScale = 1 / window.devicePixelRatio;
    document.write('<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=' + initScale +
    ',minimum-scale=' + initScale + ',maximum-scale=' + initScale + '">')
    
    var initWidth = window.document.documentElement.clientWidth;
    document.getElementsByTagName('html')[0].style.fontSize = initWidth / 10 + 'px';
    </script>
    <style>
    html {
    height: 100%;
    overflow: hidden;
    }
    
    body {
    height: 100%;
    margin: 0;
    overflow: auto;
    }
    
    header,
    footer {
    position: absolute;
     100%;
    height: 1.5625rem;
    background: orange;
    }
    
    header {
    top: 0;
    left: 0;
    }
    
    footer {
    bottom: 0;
    left: 0;
    }
    
    .content {
    overflow: hidden;
    margin: 1.5625rem 0;
    }
    
    div {
     4.6875rem;
    height: 4.6875rem;
    margin: 0.15625rem;
    background: plum;
    float: left;
    }
    
    a {
    -webkit-tap-highlight-color: transparent;
    }
    
    input {
    -webkit-appearance: none;
    }
    </style>
    <!--
    目标(测量)元素 / rem大小 = 实际rem的值
    在符合设计图和设备尺寸时:
    1rem = 64px
    
    position: fixed; 在部分老系统或低版本浏览器中不支持
    position: absolute; 兼容非常ok,但是滑动非常卡,需通过js配合
    -->
    </head>
    
    <body>
    <header></header>
    <section class="content">
    <a href="http://www.cnblogs.com/leeyen/">leeyen</a>
    <input type="button" value="btn">
    <hr>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    </section>
    <footer></footer>
    </body>
    
    </html>
    

     

    都是个人经验总结,如有问题,及时反馈,谢谢大家支持

    要每天多努力一些,比别人多努力一个小时。
  • 相关阅读:
    XSS的原理分析与解剖:第四章(编码与绕过)*******************未看**********************
    XSS的原理分析与解剖:第三章(技巧篇)**************未看*****************
    XSS的原理分析与解剖(第二篇)
    XSS的原理分析与解剖
    sqlmap用户手册详解【实用版】
    mysql注入篇
    MySQL中函数CONCAT及GROUP_CONCAT
    access注入篇+sqlmap
    搭建本地 8.8 W 乌云漏洞库
    fiddler对浏览器、app抓包及证书安装
  • 原文地址:https://www.cnblogs.com/leeyen/p/6829763.html
Copyright © 2011-2022 走看看