CSS 移动端百分比布局以及伸缩布局

目录

一、百分比布局

1.1 视口

1.1.1 ideal viewport 理想视口

1.2 background-size

二、移动端开发

2.1 移动端开发的几种解决方案:

2.1.1 单独制作移动端页面

2.1.2 响应式页面

2.2 百分比布局

三、伸缩布局

3.1 flex 布局详解

3.2 父项常见的属性

3.2.1 flex-direction 属性

3.2.2 justify-content 属性

3.2.3 flex-wrap 属性

3.2.4 align-items 属性

3.2.5 align-content 属性

3.2.6 align-content 和 align-items 的区别

3.2.7 flex-flow 属性

四、项目属性

4.1 order 属性

4.2 flex-grow 属性

4.3 flex-shrink 属性

4.4 flex-basis 属性

4.5 flex 属性

4.6 align-self 属性


一、百分比布局

1.1 视口

1.1.1 ideal viewport 理想视口

理想视口就是最理想的视口尺寸。需要添加 meta 视口标签通知浏览器操作,最主要是保证和理想视口的宽度保持一致。

属性 说明
width 宽度设置的是 viewport 宽度,可以设置 device-width 特殊值
initial-scale 初始缩放比,大于0的数字
maximum-scale 最大缩放比,大于0的数字
minimum-scale 最小缩放比,大于0的数字
user-scalable 用户是否可以缩放,yes 或 no(1 或 0)
<meta
      name="viewport"
      content="width=device-width, 
      user-scalable=no,
      initial-scale=1.0,
      maximum-scale=1.0,
      minimum-scale=1.0"
    />

1.2 background-size

background-size 是 css3 新出来的属性,值可以是具体像素、百分比或者 cover、contain

两个参数:

100px 200px 代表背景图的大小是宽度 100px 高度 200px

一个参数:

100px 代表宽高都是 100px

cover:图片的宽度和高度会拉伸,自动铺满容器,会溢出,部分背景图显示不全

contain:图片的宽度和高度会拉伸,宽度达到临界点以后,高度还会再拉伸,所以容易出现部分空白

<style>
      #box {
        width: 200px;
        height: 200px;
        border: 1px solid #000;
        background: url(images/01.png) no-repeat;
        background-size: contain/cover/100px 200px;
      }
    </style>
  </head>
  <body>
    <div id="box"></div>
  </body>

二、移动端开发

2.1 移动端开发的几种解决方案:

2.1.1 单独制作移动端页面

  1. 流式布局

  2. flex 伸缩布局

  3. less + rem + 媒体查询

  4. 混合布局

2.1.2 响应式页面

响应式页面最有代表性的就是用我们前面学过的bootstrap框架实现,就是相对来说修改比较麻烦,现在主流的还是单独制作移动端页面比较多。

  1. 媒体查询

  2. bootstrap

2.2 百分比布局

流式布局也就是百分比布局最主要的是把容器的宽度设置成百分比,然后里面的内容就可以*伸缩了。

<style>
      * {
        margin: 0;
        padding: 0;
      }
      header {
        width: 100%;
        height: 400px;
        margin: 0 auto;
        /* 设置最大宽 */
        max-width: 750px;
        /* 设置最小宽度 */
        min-width: 320px;
      }
      section:nth-child(1) {
        width: 50%;
        height: 400px;
        background-color: red;
        float: left;
      }
      section:nth-child(2) {
        width: 50%;
        height: 400px;
        background-color: yellow;
        float: left;
      }
    </style>
  </head>
  <body>
    <header>
      <section>11</section>
      <section>22</section>
    </header>

三、伸缩布局

3.1 flex 布局详解

  • flex 是 flexible box 的缩写,意为“弹性布局”,用来为盒装模型提供最大的灵活性

  • 任何一个容器都可以指定为 flex 布局

  • 当为父盒子设为 flex 布局以后,子元素的 float、clear 和 vertical-align 属性将失效

  • 采用Flex布局的元素,称为Flex容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称”项目”。

  • 容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。

  • 项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

3.2 父项常见的属性

属性 说明
flex-direction 设置主轴的方向
justify-content 设置主轴上子元素的排列方式
flex-wrap 设置子元素是否换行
align-content 设置侧轴上子元素的排列方式(多行)
align-items 设置侧轴上子元素的排列方式(单行)
flex-flow 复合属性,相当于同时设置了 flex-direction 和 flex-wrap

3.2.1 flex-direction 属性

flex-direction属性决定主轴的方向(即项目的排列方向)

.box {
    flex-direction: row | row-reverse | column | column-reverse;
}
属性 说明
row(默认值) 主轴为水平方向,从左到右
row-reverse 主轴为水平方向,从右到左
column 主轴为垂直方向,从上到下
column-reverse 主轴为垂直方向,从下到上

3.2.2 justify-content 属性

justify-content 属性定义了项目在主轴上的对齐方式

.box {
    justify-content: flex-start | flex-end | center | space-between | space-around;
}

具体对齐方式与轴的方向有关。下面假设主轴是从左到右

属性 说明
flex-start 左对齐
flex-end 右对齐
center 居中对齐
space-around 两端对齐,项目之间的间隔都相等。项目平分剩余空间
space-between 先两边贴边,再平分剩余空间,每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍

3.2.3 flex-wrap 属性

flex-wrap 属性设置是否换行

默认情况下,项目都排在一条线(又称”轴线”)上,flex布局中默认是不换行的

属性 说明
nowrap 不换行
wrap 换行

3.2.4 align-items 属性

设置侧轴上的子元素排列方式(单行)

.box {
  align-items: flex-start | flex-end | center | baseline | stretch;
}
属性 说明
flex-start 交叉轴的起点对齐(从头部开始)
flex-end 交叉轴的终点对齐(从尾部开始)
center 交叉轴的中点对齐(居中对齐)
baseline 项目的第一行文字的基线对齐
stretch(默认值) 如果项目未设置高度或设 auto ,将占满整个容器的高度

3.2.5 align-content 属性

设置侧轴上的子元素排列方式(多行),如果项目只有一根轴线,该属性不起作用。

.box {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
属性 说明
flex-start 与交叉轴的起点对齐(从侧轴头部开始)
flex-end 与交叉轴的终点对齐(从侧轴尾部开始)
center 与交叉轴的中点对齐(在侧轴中间显示)
space-between 与交叉轴两端对齐,轴线之间的间隔平均分布(子项在侧轴先分布在两头,在平分剩余空间)
space-around 每根轴线两侧的间隔都相等,轴线之间的间隔比轴线与边框的间隔大一倍(子项在侧轴平分剩余空间)
stretch(默认值) 轴线占满整个交叉轴(设置子项元素高度平分父元素高度)

3.2.6 align-content 和 align-items 的区别

  • align-items 适用于单行情况下, 只有上对齐、下对齐、居中和 拉伸

  • align-content适应于换行(多行)的情况下(单行情况下无效), 可以设置 上对齐、下对齐、居中、拉伸以及平均分配剩余空间等属性值。

  • 总结就是单行找align-items 多行找 align-content

3.2.7 flex-flow 属性

flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap

.box {
  flex-flow: <flex-direction> || <flex-wrap>;
}

四、项目属性

以下6个属性设置在项目上

属性 说明
order 定义项目的排列顺序
flex-grow 定义项目的放大比例
flex-shrink 定义项目的缩小比例
flex-basis 定义再分配多余空间之前,项目占据的主轴空间
flex 是 flex-grow,flex-shrink,flex-basis 的简写
align-self 允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性

4.1 order 属性

order 属性定义项目的排列顺序,数值越小,排列越靠前,默认值为 0

.item {
  order: <integer>;  /* 整数 */
}

4.2 flex-grow 属性

flex-grow 属性定义项目的放大比例,默认值为0,即如果存在剩余空间,也不放大

.item {
  flex-grow: <number>; /* 默认 0 */
}

如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。

4.3 flex-shrink 属性

flex-shrink 属性定义了项目的缩小比例,默认值为1,即如果空间不足,该项目将缩小

.item {
  flex-shrink: <number>; /* 默认 1 */
}
  • 如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。

  • 负值对该属性无效。

4.4 flex-basis 属性

flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。

.item {
  flex-basis: <length> | auto; /* 默认 auto */
}

它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。

4.5 flex 属性

flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
  • 该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。

  • 建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。

4.6 align-self 属性

align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

该属性可能取6个值,除了auto,其他都与align-items属性完全一致。

上一篇:5-4.水平排列方式


下一篇:CSS flex布局 小小细节