美文网首页前端开发
自适应粗小结

自适应粗小结

作者: 西洋菜与胡萝卜 | 来源:发表于2019-05-23 23:39 被阅读30次

    杂知识--预先看

    • 图片和文字垂直居中:vertical-align: middle
    • DPR:设备像素比,设备像素比(dpr) = 设备像素(分辨率)/设备独立像素(屏幕尺寸)
      设备像素(物理像素): 显示器(手机屏幕)上最小的物理显示物理单元,在操作系统的调度下,每一个设备都有自己的颜色值和亮度值。
      设备独立像素(密度无关像素): 可以认为是计算机坐标系统中得一个点,这个点代表一个可以由程序使用的虚拟像素(比如: css像素),有时我们也说成是逻辑像素。
      元素设置的CSS像素是始终不变的,而一个CSS像素对应多少个设备像素是根据当前的缩放比例来决定的
    • px | em | rem | fr:
      1. px:在移动端自适应的要求下,使用的频率不是很高
      2. rem:(root em)相对 HTML 根元素的字体大小的值:字体大小(基本都是用 rem 作为单位)
        但是如果是移动设备,屏幕会有一个上下限制,可以控制分辨率在某个范围内,超过了该范围,就不再增加根元素的字体大小了(css的媒体查询或者js实现)
      3. em:也是一个相对单位,却是相对于当前对象内文本的字体大小(继承时,相当于相对于父元素的字体):
        1. line-height。在 line-height 使用 em,在需要调整字体大小的时候,只需修改 font-size 的值,而 line-height 已经设置成了相对行高了。
        2. 首行缩进两个字符
        3. 导航菜单项
      4. fr: 自适应单位,被用于在一系列长度值中分配剩余空间,如果多个已指定了多个部分,则剩下的空间根据各自的数字按比例分配(可以和其他单位混合使用)。
    • css的媒体查询:一般用在兼容PC和手机设备,由于屏幕跨度很大时,需要重新设计整界面的布局和排版
      • 缺点:灵活性不高,取每个设备的精确值需要自己去计算,所以只能取范围值。设备屏幕众多,分辨率也参差不齐,把每一种机型的css代码写出来是不太可能的。
      • 优点:无需监听浏览器的窗口变化,会跟随屏幕动态变化。媒体查询的用法当然不仅仅像在此处这么简单,相对于第二种自适应来说有很多地方是前者所远远不及的。
    • viewport元标签:可以控制页面视口(viewport)的宽度、页面的缩放比例(原因:CSS中的1px并不一定不等于屏幕的物理分辨率1px),在桌面端指可视区域,在手机端指为Layout Viewport(布局视口)但是还另外涉及到Visual Viewport(视觉视口)和 Ideal Viewport。
      1. layout viewport——布局视窗: 网站的宽度,可以通document.documentElement.clientWidth获取
      2. visual viewport——视觉视窗: 代表浏览器可视区域的大小,可以通过 document.documentElement.innerWidth来获取
      3. ideal viewport——理想视窗: 跟移动设备相关的viewport,移动设备的宽度。iPhone的值是320
    • 基本参数:
      属性 可取值 解释
      width device-width或正整数 device-width为匹配视口的宽度,否则为自定义宽度(以像素为单位)
      height device-height或正整数 device-height为匹配视口的高度,否则为自定义高度(以像素为单位)
      initial-scale 一个0.0 到 10.0之间的正数 定义页面与视口的比例,一般取1.0
      maximum-scale 一个0.0 到 10.0之间的正数 定义变焦的最大值,这里指可变最大值,即用户如果操作缩放的最大比例
      minimum-scale 一个0.0 到 10.0之间的正数 定义变焦的最小值,这里指可变最小值,即用户如果操作缩放的最小比例
      user-scalable yes或者no 控制用户是否能放大页面,no为不可,默认值为yes
      • 视口单位:(手机竖屏情况和横屏情况,vw和vh对应不同)
      • vw : 1vw 等于视口宽度的1%
      • vh : 1vh 等于视口高度的1%
      • vmin(即vm) : 选取 vw 和 vh 中最小的那个
      • vmax : 选取 vw 和 vh 中最大的那个

    宽度自适应

    1. 利用流式布局:

    两列布局:

    • 左侧固定,右侧自适应:左侧div必须在右侧div前,左侧div用float:left,右侧margin-left为左侧的width
        *{
            margin:0;
            padding:0;
        }
      .left{
            background:red;
            float:left;
            width:200px;
        }
      .right{/*没有设置宽度,块级元素宽度在标准文档流中默认占满父级元素宽*/
            background:green;
            margin-left:200px;
        }
    
      <div class = "left">left</div>
      <div class = "right">right</div>
    
    • 右侧固定,左侧自适应:同理
    • 左右固定,中间自适应:中间的div必须排在最后,左右width固定,浮动到两边

    2. 使用100%,负边距(负边距也会影响浮动了的元素的位置,并且会覆盖之前的浮动元素,但是自身不会被下一个浮动元素覆盖):

    两列布局:

    • 左侧固定,右侧自适应:左侧div必须在右侧div前,左右侧的div都使用float:left,右侧width为100%,margin-left为左侧的width;左侧的margin-right必须为负的,且大小必须至少大于本身的宽度

      *{
          margin:0;
          padding:0;
      }
      .left {
          background: red;
          height: 200px;
          width: 200px;
          float: left;
          margin-right: -100%; /* 一定要有,因为包含块所剩空间不足以容纳下一个浮动元素,这个浮动元素会自动另起一行,即右侧会另起一行*/
      }
      .right {
          background: green;
          display: inline;
          width: 100%;
          float: left;
          margin-left: 200px;
      }
      <div class = "left">left</div>
      <div class = "right">right</div>
      
    • 右侧固定,左侧自适应:同理,但是此时是右侧的宽度固定,所以左侧的margin-right为右侧的宽度,且右侧右浮动便可,不用设置margin-left

    • 左右固定,中间自适应:中间的div排在最前,宽度百分百,左浮动,内嵌一个放内容的div(inner),其margin-left和margin-right为左右侧的宽度,左右两侧固定宽度左右浮动或者都左浮动,左侧margin-left为-100%,右侧margin-left为自身宽度

        *{
            margin:0;
            padding:0;
        }
        .center {
            background: yellow;
            float: left;
            width: 100%;
        }
        .inner {
            margin: 0 200px;
        }
        .left {
            background: red;
            height: 200px;
            width: 200px;
            float: left;
            margin-left: -100%;/*因为左侧的div在右侧之前,所以左侧的位置会影响右侧哟*/
        }
        .right {
            background: green;
            width: 200px;
            float: left;
            margin-left: -200px;
        }
        <div class="center">
            <div class="inner">center</div>
        </div>
        <div class="left">left</div>
        <div class="right">right</div>
    

    3. 利用绝对定位:

    两列分布,左右固定,中间自适应:div顺序:左-中间-右
    左右侧绝对定位,且left和right分别为0,中间margin-left和margin-right分别为左右侧宽度

    凝胶布局

    宽度固定,margin-left和margin-right为auto

    完全自适应

    1. 百分比或者rem和em

    1. 百分比: 外部整体包装盒div固定宽高(定死),并设置居中,里面的内容采用百分比
    2. rem: 在html(根)选择器里设置font-size,并且用媒体查询设置不同分辨率下html的font-size,接下来就是子元素全部运用rem来设置
    3. em:

    2. flex布局:

    • 有两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。


      flex示意图
    • 父元素的属性:
      • flex-direction:主轴的方向(主轴的方向不一定是水平的,这个属性就是设置主轴的方向,主轴默认是水平方向,从左至右,如果主轴方向设置完毕,那么交叉轴就不需要设置,交叉轴永远是主轴顺时针旋转 90°):

        1. row: 默认值,主轴为水平方向,起点在左端。
        2. row-reverse: 主轴为水平方向,起点在右端。
        3. column: 主轴为垂直方向,起点在上。
        4. column-reverse: 主轴为垂直方向,起点在下。
      • flex-wrap:超出父容器子容器的排列样式(换不换行,怎么换行)。

        1. nowrap: 默认,不换行
        2. wrap: 换行,第一行在上方。
        3. wrap-reverse: 换行,第一行在下方。
      • flex-flow:flex-direction 属性和 flex-wrap 属性的简写形式,默认值为 row nowrap:
        flex-flow: <flex-direction> || <flex-wrap>;

      • justify-content:子容器在主轴的排列方向。

        1. flex-start: 默认,左对齐
        2. flex-end: 右对齐
        3. center: 居中
        4. space-between: 两端对齐,项目之间的间隔都相等。
        5. space-around: 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
      • align-items:子容器在交叉轴的排列方向。

        1. flex-start: 交叉轴的起点对齐。
        2. flex-end: 交叉轴的终点对齐。
        3. center: 交叉轴的中点对齐。
        4. baseline: 项目的第一行文字的基线对齐。
        5. stretch: 默认,如果项目未设置高度或设为auto,将占满整个容器的高度。
      • align-content:多根轴线的对齐方式

        1. flex-start: 与交叉轴的起点对齐
        2. flex-end: 与交叉轴的终点对齐。
        3. center: 与交叉轴的中点对齐。
        4. space-between: 与交叉轴两端对齐,轴线之间的间隔平均分布。
        5. space-around: 每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
        6. stretch: 默认 轴线占满整个交叉轴。
    • 子元素的属性:
      • order:子容器的排列顺序,数值越小,排列越靠前,默认为 0
      • flex-grow:子容器剩余空间的拉伸比例,按照该比例给子容器分配空间
      • flex-shrink:子容器超出空间的压缩比例(此属性要生效,父容器的 flex-wrap 属性要设置为 nowrap)
      • flex-basis:子容器在不伸缩情况下的原始尺寸,主轴为横向时代表宽度,主轴为纵向时代表高度。
      • flex:flex-grow flex-shrink flex-basis (集结起来)
      • align-self:属性允许单个项目有与其他项目不一样的对齐方式,可覆盖父容器 align-items 属性:
        1. auto: 默认,继承父元素的 align-items 属性
        2. flex-start: 交叉轴的起点对齐。
        3. flex-end: 交叉轴的终点对齐。
        4. center: 交叉轴的中点对齐。
        5. baseline: 项目的第一行文字的基线对齐。
        6. stretch: 如果项目未设置高度或设为auto,将占满整个容器的高度。

    3. grid 网格布局(网格布局以后,容器子元素(项目)的float、display: inline-block、display: table-cell、vertical-align、column和clear等设置都将失效。)

    核心组成: wrapper(父元素)和 items(子元素)。 wrapper 是实际的 grid(网格),items 是 grid(网格) 内的内容。

    • 基本属性:
      1. grid-template-columns:多少列,没有设置,默认只有一列,宽度为父元素的 100%
      2. grid-template-rows:多少行
      3. 间距grid-gap:
        • grid-row-gap:行与行之间的距离。
        • grid-column-gap:创建列与列之间的距离。
    • 配合的函数:
      1. minmax()函数: 创建行或列的最小或最大尺寸,第一个参数定义网格轨道的最小值,第二个参数定义网格轨道的最大值(可以接受任何长度值)。auto 值允许网格轨道基于内容的尺寸拉伸或挤压。:
        1. 父元素高度>两行最大值之和,那么第一列和第二列的高度都为设置的最大值
        2. 父元素高度<两行最大值之和,a=height(父元素)-两行最小值之和
          第一行高度h1=最小值+a/2
          第二行高度h2=最小值+a/2
      2. repeat()函数: 创建重复的网格轨道。这个适用于创建相等尺寸的网格项目和多个网格项目。接受两个参数:第一个参数定义网格轨道应该重复的次数,第二个参数定义每个轨道的尺寸。
    • 通过网格线定位 grid item
      • grid-row: grid-row-start grid-row-end
      • grid-column: grid-column-start grid-column-end
      • grid-area: grid-row-start grid-column-start grid-row-end grid-column-end
    • 合并单元行与合并单元列(需要设置在 grid item 中):即让单个子元素变大
      属性同上
    • 自定义网格线名称: 网格线名称一定要使用 [] 括住
      位置:放在每个值前面
    • grid-template-areas 定义网格区域
      通过 grid-template-areas 属性来定义网格区域的名称,然后需要放在对应网格区域的元素,可以通过 grid-area 属性来指定。而且重复区域可以使用同一个名称来实现跨区域。另外对于空的轨道区域,可以使用点号 . 来代表
    .container {
                text-align: center;
                padding: 20px;
                display: grid;
                grid-column-gap: 5px;
                grid-row-gap: 5px;
                background: pink;
                grid-template-areas: "header header header header header"
                                     "sidebar content content content content"
                                     "footer footer footer footer footer";
                grid-template-rows: 50px 150px 50px;
                grid-template-columns: 200px 200px 200px;
            }
    
    • table布局:(可配合vertical-align来对齐)
      • 值:
        1. table 相当于“table”标签
        2. table-row 相当于“tr”标签
        3. table-cell 相当于“td”标签
        4. table-row-group 此元素会作为一个或多个行的分组显示 tbody
        5. table-heightder-group 此元素会作为一个或多个行的分组显示 thead
        6. table-footer-grounp 此元素会作为一个或多个行的分组显示 tfoot
        7. table-column-grounp 此元素会作为一个或多个列的分组显示 colgroup
        8. table-column 此元素会作为一个单元格列显示=>col
        9. table-caption 此元素会作为一个表格标题显示=》caption
      • 注意点:
        1. display: table时 对应元素的padding会失效;
        2. display: table-row时 对应元素的padding、margin会失效;
        3. display: table-cell时 对应元素的margin会失效;
        4. displaty: table-cell不要与float,position: absolute等改变布局的属性同时使用,作用会被破坏
      • 表格样式:
        • border
        • border-collapse: 设置是否将表格边框折叠为单一边框
        • text-align: 设置水平对齐方式,比如左对齐、右对齐或者居中
        • vertical-align: 设置垂直对齐方式,比如顶部对齐、底部对齐或居中对齐
        • padding
        • border-spacing: 设置分隔单元格边框的距离
        • caption-side: 设置表格标题的位置
        • empty-cells: 设置是否显示表格中的空单元格
        • table-layout: 设置显示单元、行和列的算法

    移动端自适应 开发原则:文字流式,控件弹性,图片等比缩放

    利用视口单位适配页面

    1. 采用rem
      • 在html(根)选择器里设置font-size,并且用媒体查询设置不同分辨率下html的font-size(或者使用js来设置),接下来就是子元素全部运用rem来设置
        rem的值经常等于(设备的宽度)x100/(设计稿宽度)
    2. 使用vw作为CSS单位(无论是文本还是布局高宽、间距等)
    3. 搭配vw和rem,优化布局

    相关文章

      网友评论

        本文标题:自适应粗小结

        本文链接:https://www.haomeiwen.com/subject/vwaizqtx.html