Skip to content

常用布局 ​

h5 首页布局 ​

头部,内容,尾部

html
<div class="parent">
  <div class="header"></div>
  <div class="content"></div>
  <div class="footer"></div>
</div>
<div class="parent">
  <div class="header"></div>
  <div class="content"></div>
  <div class="footer"></div>
</div>
css
.parent {
  padding-top: 50px;
  padding-bottom: 50px;
  overflow: hidden;
  height: 100vh;
  display: flex;
}
.header {
  position: fixed;
  top: 0;
}
.footer {
  position: fixed;
  bottom: 0;
}
.content {
  width: 100%;
  overflow-y: scroll;
}
.parent {
  padding-top: 50px;
  padding-bottom: 50px;
  overflow: hidden;
  height: 100vh;
  display: flex;
}
.header {
  position: fixed;
  top: 0;
}
.footer {
  position: fixed;
  bottom: 0;
}
.content {
  width: 100%;
  overflow-y: scroll;
}

flex 布局 ​

flex 容器属性: ​

flex-direction(子元素排列顺序) ​

css
flex-direction:属性规定灵活项目的排列方向(主轴方向):

row:默认值,灵活的项目将水平显示。
row-reverse:与row相同,但是以相反的顺序。
column:灵活的项目将垂直显示。
column-reverse:与column相同,但是以相反的顺序。
flex-direction:属性规定灵活项目的排列方向(主轴方向):

row:默认值,灵活的项目将水平显示。
row-reverse:与row相同,但是以相反的顺序。
column:灵活的项目将垂直显示。
column-reverse:与column相同,但是以相反的顺序。

flex-wrap(换行) ​

css
用于设置伸缩项目在主轴上的换行方式:

nowrap:默认值。规定灵活的项目不拆行或不拆列。
wrap:规定灵活的项目在必要的时候拆行或拆列。
wrap-reverse:规定灵活的项目在必要的时候拆行或拆列,但是以相反的顺序。
用于设置伸缩项目在主轴上的换行方式:

nowrap:默认值。规定灵活的项目不拆行或不拆列。
wrap:规定灵活的项目在必要的时候拆行或拆列。
wrap-reverse:规定灵活的项目在必要的时候拆行或拆列,但是以相反的顺序。

flex-flow ​

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

justify-content(主轴对齐方式) ​

css
justify-content:用于设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式:

flex-start:默认值。项目位于容器的开头。
flex-end:项目位于容器的结尾。
center:项目位于容器的中心。
space-between:项目位于各行之间留有空白的容器内。
space-around:项目位于各行之前、之间、之后都留有空白的容器内。
justify-content:用于设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式:

flex-start:默认值。项目位于容器的开头。
flex-end:项目位于容器的结尾。
center:项目位于容器的中心。
space-between:项目位于各行之间留有空白的容器内。
space-around:项目位于各行之前、之间、之后都留有空白的容器内。

align-items(侧轴对齐方式) ​

css
align-items:定义flex子项目在flex容器的侧轴(纵轴)方向上的对齐方式:

stretch:默认值。元素被拉伸以适应容器。
如果指定侧轴大小的属性值为'auto',则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照'min/max-width/height'属性的限制。
center:元素位于容器的中心。
flex-start:元素位于容器的开头。
flex-end:元素位于容器的结尾。
baseline:元素位于容器的基线上。
align-items:定义flex子项目在flex容器的侧轴(纵轴)方向上的对齐方式:

stretch:默认值。元素被拉伸以适应容器。
如果指定侧轴大小的属性值为'auto',则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照'min/max-width/height'属性的限制。
center:元素位于容器的中心。
flex-start:元素位于容器的开头。
flex-end:元素位于容器的结尾。
baseline:元素位于容器的基线上。

align-content(横向排列换行后多行文本 y 轴对齐方式) ​

css
align-content:用于设置多行子元素在容器侧轴上的对齐方式(多行时才有效);

stretch:默认值。元素被拉伸以适应容器。各行将会伸展以占用剩余的空间。
如果剩余的空间是负数,该值等效于'flex-start'。在其它情况下,剩余空间被所有行平分,以扩大它们的侧轴尺寸。
center:元素位于容器的中心。
flex-start:元素位于容器的开头。
flex-end:元素位于容器的结尾。
space-between:元素位于各行之间留有空白的容器内。
space-around:元素位于各行之前、之间、之后都留有空白的容器内。
说明:
   align-content在侧轴上执行样式的时候,会把默认的间距给合并。对于单行子元素,该属性不起作用
align-content:用于设置多行子元素在容器侧轴上的对齐方式(多行时才有效);

stretch:默认值。元素被拉伸以适应容器。各行将会伸展以占用剩余的空间。
如果剩余的空间是负数,该值等效于'flex-start'。在其它情况下,剩余空间被所有行平分,以扩大它们的侧轴尺寸。
center:元素位于容器的中心。
flex-start:元素位于容器的开头。
flex-end:元素位于容器的结尾。
space-between:元素位于各行之间留有空白的容器内。
space-around:元素位于各行之前、之间、之后都留有空白的容器内。
说明:
   align-content在侧轴上执行样式的时候,会把默认的间距给合并。对于单行子元素,该属性不起作用

flex 子元素属性: ​

align-self 属性(单个元素侧轴对齐方式) ​

css
align-self:属性定义flex子项单独在侧轴(纵轴)方向上的对齐方式:

注意:align-self 属性可重写灵活容器的 align-items 属性。
auto:默认值。元素继承了它的父容器的align-items属性。如果没有父容器则为 "stretch"。
stretch:元素被拉伸以适应容器。
center:元素位于容器的中心。
flex-start:元素位于容器的开头。
flex-end:元素位于容器的结尾。
baseline:元素位于容器的基线上。
align-self:属性定义flex子项单独在侧轴(纵轴)方向上的对齐方式:

注意:align-self 属性可重写灵活容器的 align-items 属性。
auto:默认值。元素继承了它的父容器的align-items属性。如果没有父容器则为 "stretch"。
stretch:元素被拉伸以适应容器。
center:元素位于容器的中心。
flex-start:元素位于容器的开头。
flex-end:元素位于容器的结尾。
baseline:元素位于容器的基线上。

flex-grow 扩展比率 ​

css
flex-grow:用于设置或检索弹性盒子项目的扩展比率;

number:规定项目将相对于其他灵活的项目进行扩展的量。默认值是0。
即当容器空间大于内部元素空间之和时,剩余部分将根据各元素指定的flex-grow按比例分配,使各子元素增大;默认值为0,表示剩余空间不分配。
flex-grow:用于设置或检索弹性盒子项目的扩展比率;

number:规定项目将相对于其他灵活的项目进行扩展的量。默认值是0。
即当容器空间大于内部元素空间之和时,剩余部分将根据各元素指定的flex-grow按比例分配,使各子元素增大;默认值为0,表示剩余空间不分配。

flex-shrink 收缩比率 ​

css
flex-shrink:设置弹性盒的伸缩项目的收缩比率:

number:规定项目将相对于其他灵活的项目进行收缩的量。默认值是1收缩,0为不收缩。
Flex子元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值;默认值为1,表示溢出时等比例缩小;

算法-公式:
超出空间的像素数:1000-(900+200)=-100px;
加权总和:=(第一个子元素的宽度)*(shrink)+(第二个子元素的宽度)*   (shrink)+....;
    A收缩的像素数:(Awidth*shrink)/加权综合)*超出空间 =收缩的像素数
flex-shrink:设置弹性盒的伸缩项目的收缩比率:

number:规定项目将相对于其他灵活的项目进行收缩的量。默认值是1收缩,0为不收缩。
Flex子元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值;默认值为1,表示溢出时等比例缩小;

算法-公式:
超出空间的像素数:1000-(900+200)=-100px;
加权总和:=(第一个子元素的宽度)*(shrink)+(第二个子元素的宽度)*   (shrink)+....;
    A收缩的像素数:(Awidth*shrink)/加权综合)*超出空间 =收缩的像素数

flex-basis 伸缩基准值 ​

css
flex-basis:设置弹性盒伸缩基准值(指定flex-item在主轴上的初始大小):

number:规定灵活项目的初始长度。
auto:默认值。长度等于灵活项目的长度。如果该项目未指定长度,则长度将根据内容决定。
flex-basis:设置弹性盒伸缩基准值(指定flex-item在主轴上的初始大小):

number:规定灵活项目的初始长度。
auto:默认值。长度等于灵活项目的长度。如果该项目未指定长度,则长度将根据内容决定。

order 出现顺序 ​

css
order:属性设置或检索弹性盒模型对象的子元素出现的順序。
number:值越小排列越靠前,值越大顺序越靠后 + -
order:属性设置或检索弹性盒模型对象的子元素出现的順序。
number:值越小排列越靠前,值越大顺序越靠后 + -

flex 属性简写 ​

css
(1)flex 属性用于设置弹性盒模型对象的子元素如何分配父元素的空间。
(2)flex 属性是 flex-grow、flex-shrink 和 flex-basis 属性的简写属性。

auto = 0 1 auto
none = 0 0 auto
  1  = 1 1 auto
(1)flex 属性用于设置弹性盒模型对象的子元素如何分配父元素的空间。
(2)flex 属性是 flex-grow、flex-shrink 和 flex-basis 属性的简写属性。

auto = 0 1 auto
none = 0 0 auto
  1  = 1 1 auto

Grid 布局 ​

css
display: grid;
display: inline-grid;
grid-template-columns: 100px 1fr 1fr;                // fr 是fraction 的缩写,意为"片段",可以与绝对长度的单位结合使用
grid-template-columns: 1fr 1fr 1fr;
grid-template-columns: repeat(3, 1fr);               // repeat()接受两个参数,第一个参数是重复的次数,第二个参数是要重复的值。
grid-template-columns: 1fr 1fr minmax(100px, 1fr);   // minmax()函数产生一个长度范围,表示长度就在这个范围之中。它接受两个参数,分别为最小值和最大值。
grid-template-columns: repeat(auto-fill, 100px);     // 空白匿名网格
grid-template-columns: repeat(auto-fit, 100px);      // 空白匿名网格折叠合并
grid-template-columns: fit-content(100px) fit-content(100px) 40px auto;  // 让尺寸适应于内容,但不超过设定的尺寸,只支持数值和百分比值
grid-template-rows  //  使用方法与列相同
row-gap: 20px;       // 行间距
column-gap: 30px;    // 列间距
gap: 20px;           // 行列间距
justify-items 指定单元格内容的水平对齐方式,属性值有:
stretch:【默认值】拉伸,占满单元格的整个宽度。
start:对齐单元格的起始边缘。
end:对齐单元格的结束边缘。
center:单元格内部居中。

align-items 指定单元格内容的垂直对齐方式,属性值有:
normal:【默认值】会根据使用场景的不同表现为stretch或者start。
stretch:拉伸,占满单元格的整个宽度。
start:对齐单元格的起始边缘。
end:对齐单元格的结束边缘。
center:单元格内部居中。
baseline:基线对齐(align-items属性特有属性值)

place-items 是align-items属性和justify-items属性的合并简写形式:
place-items: start end;
justify-self 跟justify-items属性的用法完全一致,但只作用于单个项目。

align-self 跟align-items属性的用法完全一致,也是只作用于单个项目。

place-self 是align-self属性和justify-self属性的合并简写形式。
display: grid;
display: inline-grid;
grid-template-columns: 100px 1fr 1fr;                // fr 是fraction 的缩写,意为"片段",可以与绝对长度的单位结合使用
grid-template-columns: 1fr 1fr 1fr;
grid-template-columns: repeat(3, 1fr);               // repeat()接受两个参数,第一个参数是重复的次数,第二个参数是要重复的值。
grid-template-columns: 1fr 1fr minmax(100px, 1fr);   // minmax()函数产生一个长度范围,表示长度就在这个范围之中。它接受两个参数,分别为最小值和最大值。
grid-template-columns: repeat(auto-fill, 100px);     // 空白匿名网格
grid-template-columns: repeat(auto-fit, 100px);      // 空白匿名网格折叠合并
grid-template-columns: fit-content(100px) fit-content(100px) 40px auto;  // 让尺寸适应于内容,但不超过设定的尺寸,只支持数值和百分比值
grid-template-rows  //  使用方法与列相同
row-gap: 20px;       // 行间距
column-gap: 30px;    // 列间距
gap: 20px;           // 行列间距
justify-items 指定单元格内容的水平对齐方式,属性值有:
stretch:【默认值】拉伸,占满单元格的整个宽度。
start:对齐单元格的起始边缘。
end:对齐单元格的结束边缘。
center:单元格内部居中。

align-items 指定单元格内容的垂直对齐方式,属性值有:
normal:【默认值】会根据使用场景的不同表现为stretch或者start。
stretch:拉伸,占满单元格的整个宽度。
start:对齐单元格的起始边缘。
end:对齐单元格的结束边缘。
center:单元格内部居中。
baseline:基线对齐(align-items属性特有属性值)

place-items 是align-items属性和justify-items属性的合并简写形式:
place-items: start end;
justify-self 跟justify-items属性的用法完全一致,但只作用于单个项目。

align-self 跟align-items属性的用法完全一致,也是只作用于单个项目。

place-self 是align-self属性和justify-self属性的合并简写形式。

表格布局 IE8+ ​

使用display: table;将内部元素使用 table 表格的特性;

display: table-cell;给包裹元素设置;

image

一般用于这种布局;设置了 table-cell 之后,需要设置 vertical:属性;

image

html
<div class="container">
  <div class="left">
    <div class="logo"></div>
  </div>
  <div class="right">哈哈哈哈哈哈哈哈</div>
</div>
<div class="container">
  <div class="left">
    <div class="logo"></div>
  </div>
  <div class="right">哈哈哈哈哈哈哈哈</div>
</div>
css
.container {
  display: table;
  width: 500px;
  padding: 15px 10px;
  border: 1px solid black;
}
.left {
  width: 60px;
  display: table-cell;
  vertical-align: top;
}
.logo {
  width: 60px;
  height: 60px;
  border: 1px solid black;
}
.right {
  margin-left: 20px;
  padding: 20px;
  border: 1px solid red;
}
.container {
  display: table;
  width: 500px;
  padding: 15px 10px;
  border: 1px solid black;
}
.left {
  width: 60px;
  display: table-cell;
  vertical-align: top;
}
.logo {
  width: 60px;
  height: 60px;
  border: 1px solid black;
}
.right {
  margin-left: 20px;
  padding: 20px;
  border: 1px solid red;
}

两栏等高布局 ​

html
<div class="demo">
  <div class="son son1">111</div>
  <div class="son son2">222</div>
</div>
<div class="demo">
  <div class="son son1">111</div>
  <div class="son son2">222</div>
</div>
css
.son {
  float: left;
}
.demo {
  overflow: hidden;
}
.son1 {
  margin-bottom: -9999px;
  padding-bottom: 9999px;
  background: red;
  width: 200px;
  word-break: break-all;
}
.son2 {
  margin-bottom: -9999px;
  padding-bottom: 9999px;
  background: blue;
  width: 200px;
  word-break: break-all;
}
.son {
  float: left;
}
.demo {
  overflow: hidden;
}
.son1 {
  margin-bottom: -9999px;
  padding-bottom: 9999px;
  background: red;
  width: 200px;
  word-break: break-all;
}
.son2 {
  margin-bottom: -9999px;
  padding-bottom: 9999px;
  background: blue;
  width: 200px;
  word-break: break-all;
}

有效区以外出现白条问题 ​

当浏览器的宽度小于有效区的宽度的时候,出现滚动条,滚动条右侧的背景图片或背景颜色会没有,所以出现了白条

解决办法:给 100%的盒子设置最小宽度是有效区的宽度,min-width

解决办法二;给有效区也加背景颜色

圣杯布局(中间自适应) ​

  1. 三栏布局,左边宽度固定,右边宽度固定,中间自适应。
  2. 大的父元素里面包含左中右三栏,先写中间的栏目,在写左右
  3. 给中间的栏目设置宽度是 100%;左右两侧的栏目宽度是固定。
  4. 给三个栏目设置浮动,三个都是 float left;
  5. 给左边的栏目加 margin-left:-100%;
  6. 给右边的栏目加 margin-left:-右边栏目宽度;
  7. 给大的父元素设置 padding 值:0 右边栏目宽度 0 左边栏目的宽度,把元素都挤到中间。
  8. 给左边的栏目写定位:position:relative; left:-左边栏目的宽度;
  9. 给右边栏目写定位:position:relative; right:-右边栏目的宽度;
  10. 当浏览器的宽度小的时候,出现左右栏目掉下来的问题,给大的父元素设置最小宽度,需要是大于左右两栏的宽度总和。

双飞翼布局。(中间自适应) ​

三栏布局,左右宽度固定,

1-5 点如同圣杯布局。

给中间的 center 加一个子元素,给子元素设置 padding 值:0 右侧栏目的宽度 0 左侧栏目的宽度。

也可以设置 margin 值。

等高布局一、 ​

三栏的等高布局:第一栏宽度 30%,第二栏宽度 40%,第三栏宽度 30%,写几栏的等高布局,就要写几个 100%的大盒子,还要写几个小盒子,并给几个盒子写浮动。

  1. 给爷爷爸爸儿子都设置成宽度是 100%;
  2. 给爸爸设置相对于原来位置向左侧移动 30%,这个时候就漏出爷爷的 30%。
  3. 给儿子相对于原来位置向左侧移动 40%,就漏出爸爸的 40%,儿子也漏出 30%。
  4. 给儿子里面的 right 设置相对于原来的位置向右侧移动 70%。
  5. 给儿子里面的 center 设置如第 4 点。
  6. 给儿子里面的 left 设置如第 4 点。

等高布局二 ​

padding 和 margin 互怼,

三栏布局,第一栏设置 300px,第二栏设置 400px,第三栏是 300px,三栏等高,改变其中一栏的高度,其他两栏的高度跟着改变。

给三栏都加 padding-bottom:9999px;margin-bottom:-9999px,保证整个盒子的高度不改变,给三栏的父元素设置溢出隐藏。

等高布局二会出现给第三栏加边框的时候,下边框看不见,

解决办法一、单独写一个和边框的宽高一样的盒子,让这个盒子相对于父元素(大的盒子)进行定位。

解决办法二、给三栏的父元素再加一个父元素,给这个新加的父元素设置背景图片。

等高布局三 ​

边框模拟等高布局(只能写两栏或者三栏)

三栏等高布局,第一栏 300px,第二栏 400px,第三栏 300px。

  1. 设置一个大盒子居中浏览器,设置一个小盒子中间的 400px,
  2. 给中间的盒子设置左边框 300px 的宽度,右边框 300px 的宽度,实线的,颜色是左右两边的。
  3. 然后在中间的盒子里设置三栏,给这个三栏设置浮动,移动三栏的位置,
  4. 给左边的设置 margin-left:-700px;,给右边的设置 margin-left:-300px,之后给右边的相对定位到右边去;
  5. 记得给父元素清楚浮动,否则高度撑不起来,无法等高布局。

两栏等高 ​

html
<div class="demo">
  <div class="son son1"></div>
  <div class="son son2"></div>
</div>
<div class="demo">
  <div class="son son1"></div>
  <div class="son son2"></div>
</div>
css
.son {
  float: left;
}
.demo {
  overflow: hidden;
}
.son1 {
  margin-bottom: -9999px;
  padding-bottom: 9999px;
  background: red;
  width: 200px;
  word-break: break-all;
}
.son2 {
  margin-bottom: -9999px;
  padding-bottom: 9999px;
  background: blue;
  width: 200px;
  word-break: break-all;
}
.son {
  float: left;
}
.demo {
  overflow: hidden;
}
.son1 {
  margin-bottom: -9999px;
  padding-bottom: 9999px;
  background: red;
  width: 200px;
  word-break: break-all;
}
.son2 {
  margin-bottom: -9999px;
  padding-bottom: 9999px;
  background: blue;
  width: 200px;
  word-break: break-all;
}

ie 浏览器不兼容性问题 ​

  1. 在 ie6 及以下版本,会出现双边距的问题。

问题:给元素设置浮动,再给元素设置 margin-left;第一个元素的左边会出现双倍边距的问题。

解决办法:给浮动的元素设置_display:inline;

  1. ie6 以下小高度问题:

问题:给元素设置小高度不行,例如:设置了 1px 的边框,会出现至少 5px 高的边框。

解决问题:给元素设置 font-size:0; line-height:0; overflow:hidden。

  1. ie7 及以下版本,块元素转成内联块,不在同一行显示的问题;

解决办法:给元素加*dispaly:inline; *zoom:1;

  1. ie7 及以下版本,给子元素设置了相对定位,再给父元素设置溢出隐藏,溢出隐藏会失效。

解决办法:给父元素也设置相对定位。

  1. ie7 及以下版本,li 中出现两个或两个以上浮动,li 与 li 中间会出现空白间隙问题,基线对齐;

解决办法:给 li 设置 vertical-align:top/middle/bottom;

  1. ie8 里 a 标签包含的图片有边框问题,

解决办法:给图片设置 border:none;

移动端布局 ​

响应式布局 ​

  1. 响应式的图片

    需要给图片设置max-width:100%;height:auto;

  2. 响应式的字体

    html{font-size:100%;}

    之后可以设置响应式的字体:

css
@media (min-width: 640px) {
  body {
    font-size: 1rem;
  }
}
@media (min-width: 960px) {
  body {
    font-size: 1.2rem;
  }
}
@media (min-width: 1200px) {
  body {
    font-size: 1.5rem;
  }
}
@media (min-width: 640px) {
  body {
    font-size: 1rem;
  }
}
@media (min-width: 960px) {
  body {
    font-size: 1.2rem;
  }
}
@media (min-width: 1200px) {
  body {
    font-size: 1.5rem;
  }
}

响应式网站的优点 ​

  1. 减少工作量

    网站、设计、代码、内容都 只需要一份

    多出来的工作量只是 JS 脚本、CSS 样式做一些改变

  2. 节省时间

  3. 每个设备都能得到正确的设计

移动端布局 ​

vh、vw 相关 ​

css
1vw 等于1/100的视口宽度 (Viewport Width)
1vh 等于1/100的视口高度 (Viewport Height)
vmin — vmin 的值是当前 vw 和 vh 中较小的值
vmax — vw 和 vh 中较大的值
svh 表示地址栏 UI 尚未缩小尺寸时的视口高度
lvh 表示地址栏 UI 缩小尺寸后的视口高度
dvh 表示根据地址栏 UI 是否缩小而使用小的、中间的和大的单位
1vw 等于1/100的视口宽度 (Viewport Width)
1vh 等于1/100的视口高度 (Viewport Height)
vmin — vmin 的值是当前 vw 和 vh 中较小的值
vmax — vw 和 vh 中较大的值
svh 表示地址栏 UI 尚未缩小尺寸时的视口高度
lvh 表示地址栏 UI 缩小尺寸后的视口高度
dvh 表示根据地址栏 UI 是否缩小而使用小的、中间的和大的单位

视口-viewport ​

css
许多智能手机都使用了一个比实际屏幕尺寸大很多的虚拟可视区域(980px),主要目的就是让pc页面在智能手机端阅读时不会因为实际可视区域变形。
所以你看到的页面还是普通样式,即一个全局缩小后的页面。为了让智能手机能根据媒体查询匹配对应样式,让页面在智能手机中正常显示,特意添加了一个meta标签。
这个标签的主要作用就是让智能手机浏览页面时能进行优化,并且可以自定义界面可视区域的尺寸和缩放级别。

语法:
<meta name="viewport"  content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
属性值:
    width:可视区域的宽度,值可为数字或关键词device-width;
    height:可视区域的高度,值可为数字或关键词device-height;
    initial-scale:页面首次被显示时的缩放级别(0-10.0),取值为1时页面按实际尺寸显示,无任何缩放
    minimum-scale:设定最小缩小比例(0-10.0),取值为1时将禁止用户缩小页面至实际尺寸之下
    maximum-scale:设定最大放大比例(0-10.0),取值为1时将禁止用户放大页面至实际尺寸之上
    user-scalable:设定用户是否可以缩放(yes/no)

含义为:宽为手机移动设备默认宽度,初始缩放比例为1.0,最大缩放比例为原始像素大小,不允许用户放大或者缩小;
许多智能手机都使用了一个比实际屏幕尺寸大很多的虚拟可视区域(980px),主要目的就是让pc页面在智能手机端阅读时不会因为实际可视区域变形。
所以你看到的页面还是普通样式,即一个全局缩小后的页面。为了让智能手机能根据媒体查询匹配对应样式,让页面在智能手机中正常显示,特意添加了一个meta标签。
这个标签的主要作用就是让智能手机浏览页面时能进行优化,并且可以自定义界面可视区域的尺寸和缩放级别。

语法:
<meta name="viewport"  content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
属性值:
    width:可视区域的宽度,值可为数字或关键词device-width;
    height:可视区域的高度,值可为数字或关键词device-height;
    initial-scale:页面首次被显示时的缩放级别(0-10.0),取值为1时页面按实际尺寸显示,无任何缩放
    minimum-scale:设定最小缩小比例(0-10.0),取值为1时将禁止用户缩小页面至实际尺寸之下
    maximum-scale:设定最大放大比例(0-10.0),取值为1时将禁止用户放大页面至实际尺寸之上
    user-scalable:设定用户是否可以缩放(yes/no)

含义为:宽为手机移动设备默认宽度,初始缩放比例为1.0,最大缩放比例为原始像素大小,不允许用户放大或者缩小;

响应式网站的缺点 ​

  1. 会加载更多的样式和脚本资源
  2. 设计比较难精确定位和控制
  3. 老版本浏览器兼容不好

媒体查询 ​

通过媒体查询我们可以对不同的设备指定特定的样式

  1. 在 link 标签后面输入(css2)
html
<link rel="stylesheet" href="2.css" type="text/css" media="screen and (min-width:1000px)" />
//在link后面还引入
<link rel="stylesheet" href="2.css" type="text/css" media="screen and (orientation:landscape)" />
//横屏显示
<link rel="stylesheet" href="2.css" type="text/css" media="screen and (min-width:1000px)" />
//在link后面还引入
<link rel="stylesheet" href="2.css" type="text/css" media="screen and (orientation:landscape)" />
//横屏显示

orientation:portrait //竖屏

在 css 文件后面直接写(css3)

css
@media screen and (min-width: 600px) and (max-width: 1000px) {
} //需要修改的样式写在括号里面,可以针对单独的修改样式。
@media screen and (min-width: 600px) and (max-width: 1000px) {
} //需要修改的样式写在括号里面,可以针对单独的修改样式。

移动端适配 ​

css
1、媒体查询 + rem
计算rem方法:
      结合媒体查询,随着设备的改变 更改html的font-size的值。
html{font-size:100px}
@media screen and (min-width:321px) and (max-width:375px){
       html{font-size:45px}
}
@media screen and (min-width:376px) and (max-width:414px){
       html{font-size:50px}
}
@media screen and (min-width:415px) and (max-width:639px){
       html{font-size:55px}
}
@media screen and (min-width:640px) and (max-width:719px){
       html{font-size:60px}
}

2、vw + rem
  为了方便计算,会把html的font-size值设置成100px;
   1rem =100px;
100px是一个固定值,没办法随着设备的改变而改变。
vw根据视口大小进行改变。
100px == ?vw

第一种情况:
        UI设计图为:640px;dpr=2
        适配的设备宽度:320px;

        设备宽度320px=100vw
                1vw == 3.2px
                100px==31.25vw

        html设置{font-size:31.25vw}
第二种情况:
        UI设计图为:750px;dpr=2
        适配的设备:375px
        375px==100vw
        1vw == 3.75px
        100px=26.67vw

       html设置{font-size:26.67vw}

3、flxible.js  插件
流程:
(1):引入flxible.js插件
        <script src=""></script>
(2):去掉html里面默认的meta标签
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
1、媒体查询 + rem
计算rem方法:
      结合媒体查询,随着设备的改变 更改html的font-size的值。
html{font-size:100px}
@media screen and (min-width:321px) and (max-width:375px){
       html{font-size:45px}
}
@media screen and (min-width:376px) and (max-width:414px){
       html{font-size:50px}
}
@media screen and (min-width:415px) and (max-width:639px){
       html{font-size:55px}
}
@media screen and (min-width:640px) and (max-width:719px){
       html{font-size:60px}
}

2、vw + rem
  为了方便计算,会把html的font-size值设置成100px;
   1rem =100px;
100px是一个固定值,没办法随着设备的改变而改变。
vw根据视口大小进行改变。
100px == ?vw

第一种情况:
        UI设计图为:640px;dpr=2
        适配的设备宽度:320px;

        设备宽度320px=100vw
                1vw == 3.2px
                100px==31.25vw

        html设置{font-size:31.25vw}
第二种情况:
        UI设计图为:750px;dpr=2
        适配的设备:375px
        375px==100vw
        1vw == 3.75px
        100px=26.67vw

       html设置{font-size:26.67vw}

3、flxible.js  插件
流程:
(1):引入flxible.js插件
        <script src=""></script>
(2):去掉html里面默认的meta标签
        <meta name="viewport" content="width=device-width, initial-scale=1.0">

rem 基本转换 ​

js
以750px的屏幕宽度,预计100px=1rem来计算,计算公式为:
1rem = 根字体大小 = 当前屏幕宽度 (document.body.clientWidth)/ 750 * 100  px
以750px的屏幕宽度,预计100px=1rem来计算,计算公式为:
1rem = 根字体大小 = 当前屏幕宽度 (document.body.clientWidth)/ 750 * 100  px

移动端布局 ​

  1. 页面 html 头部代码说明:
html
<meta name="keywords" content=" " />
关键字
<meta name="description" content="" />
描述
<link rel="icon" href="images/icon.ico" />
插入logo标题
<meta name="keywords" content=" " />
关键字
<meta name="description" content="" />
描述
<link rel="icon" href="images/icon.ico" />
插入logo标题
  1. 设置 viewport(至少记住三个)
html
<meta name="viewport" content="" />
<meta name="viewport" content="" />
  • width=device-width

  • height:设置的 viewport 高度(一般不设置)

  • initial-scale=1.0:页面初始缩放比例,可以为小数

  • minimum-scale:最小缩放比例,可以为小数

  • maximum-scale:最大缩放比例,可以为小数

  • user-scalable:是否允许用户缩放页面,“no”不允许,“yes”允许

使用 rem 布局 ​

100px=1rem;自适应;

html
<script>
  var deviceWidth = document.documentElement.clientWidth // 获取浏览器的宽度
  if (deviceWidth > 720) {
    // 判断浏览器的宽度是否大于720
    deviceWidth = 720
  }
  var fs = (deviceWidth * 100) / 720 // 当浏览器大于等于720的时候,font-size 为100,720是页面设计图的宽度。
  document.documentElement.style.fontSize = fs + 'px' // 给html设置font-size
</script>
<script>
  var deviceWidth = document.documentElement.clientWidth // 获取浏览器的宽度
  if (deviceWidth > 720) {
    // 判断浏览器的宽度是否大于720
    deviceWidth = 720
  }
  var fs = (deviceWidth * 100) / 720 // 当浏览器大于等于720的时候,font-size 为100,720是页面设计图的宽度。
  document.documentElement.style.fontSize = fs + 'px' // 给html设置font-size
</script>

自适应布局 ​

js
function Resize() {
  // 后面的40是font-size大小, 即1rem=40px
  let w = (document.documentElement.clientWidth / 375) * 40
  document.documentElement.style.fontSize = w + 'px'
}
function Resize() {
  // 后面的40是font-size大小, 即1rem=40px
  let w = (document.documentElement.clientWidth / 375) * 40
  document.documentElement.style.fontSize = w + 'px'
}

禁止手机端缩放 ​

html
<meta
  name="viewport"
  content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0"
/>
<meta
  name="viewport"
  content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0"
/>

iphoneX 兼容处理方案 ​

  1. 首页必须给meta标签添加name字段为viewport的, content值增加viewport-fit=cover;

    html
    <meta name="viewport" content="viewport-fit=cover" />
    <meta name="viewport" content="viewport-fit=cover" />
  2. 单独给 body 增加 iphonex 的安全距离不起作用, 是由于position: fixed属性, bottom: 0造成吸底了, 需要给所有的bottom: 0增加对应的安全距离, 不再写bottom: 0, 而是写bottom: env(safe-area-inset-bottom);

  3. 两个函数介绍

    • constant :针对 iOS < 11.2 以下系统

    • env :针对于 iOS >= 11.2 的系统

    因此两个函数都得增加上

  4. 支持的变量:

    • safe-area-inset-left:左边的安全距离

    • safe-area-inset-right:右边的安全距离

    • safe-area-inset-top:上边的安全距离

    • safe-area-inset-bottom:下边的安全距离

  5. 两种情况处理方式

    • bottom 不是 0

    • 使用 calc 函数进行计算, 原有的 bottom 距离加上, 比如:bottom: calc(50px + env(safe-area-inset-bottom))

    • bottom 是 0

    • 增加一个空的块, 写入如下样式

    css
    body::after {
      position: fixed;
      bottom: 0;
      height: 0;
      width: 100%;
      height: constant(safe-area-inset-bottom);
      height: env(safe-area-inset-bottom);
      background-color: #fff; /* 需要与bottom颜色一致 */
    }
    body::after {
      position: fixed;
      bottom: 0;
      height: 0;
      width: 100%;
      height: constant(safe-area-inset-bottom);
      height: env(safe-area-inset-bottom);
      background-color: #fff; /* 需要与bottom颜色一致 */
    }
  6. 使用@supports隔离兼容模式,判断浏览器是否支持该属性

    css
    @supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
      body::after {
        ....;
      }
    }
    @supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
      body::after {
        ....;
      }
    }

移动端布局解决方案 ​

  1. 布局方式:

    1. 固定布局

      1. 页面设置单位都是 px,一般设置整个页面宽度 320px,
      2. 缺点:大于 320px 的页面,两边都会留白,不好看。
    2. 流式布局:

      1. 宽度使用百分比,高度设置 px,页面会出现拉伸,不兼容。
    3. 响应式布局:

      1. 利用媒体查询,判断不同的设备,使用不同的 css 文件,比较麻烦。
      2. 优点是:根据不同的手机页面适配不同,用户体验极好。
      3. 在引入 css 文件后面添加 media="screen and (min-width)";限制使用 css 文件。
      4. min-width 最小宽度,max-width 最大宽度,min-height 最小高度,max-height 最大高度。
    4. rem 布局:

      1. 设置页面 html 的 font-size 大小做比较,使用 js 代码获取设备的宽度给页面 font-size 赋值,实现元素自适应。
      2. 需要注意浏览器会有最小字体大小,会出现小尺寸手机文字下掉,设置单行/多行文本超出显示点状
      3. 图片是根据基线对齐,设置了默认页面 font-size 大小之后,字体变大,图片会下掉,转块可以解决。
      4. 图片需要设置宽高才能等比例缩放,放置背景图需要设置背景尺寸 100%,否则图片大小无法根据 rem 等比例缩放,无法显示完整的图片。
  2. rem 单位:

    1. 当 html{font-size:100px;}时,页面使用则 1rem=100px;
  3. em 单位:

    1. 针对局部使用:当 em 的 div{font-size:100px; },div 里面 width:1em=100px;

使用插件自动转换 px ​

  1. postcss-px2rem 将 px 转换成 rem
  2. postcss-px-to-viewport 将 px 转换成 vw

移动端调试 ​

vconsole ​

html
<script src="https://cdn.jsdelivr.net/npm/vconsole"></script>
<script>
  new VConsole()
</script>
<script src="https://cdn.jsdelivr.net/npm/vconsole"></script>
<script>
  new VConsole()
</script>

eruda 调试工具 ​

html
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/eruda"></script>
<script>
  eruda.init()
</script>

<!-- 使用js -->
<script id="load_eruda">
  window.onload = function () {
    if (window.pre_host === 'uat') {
      var script = document.createElement('script')
      script.setAttribute('src', '//cdn.jsdelivr.net/npm/eruda')
      script.setAttribute('type', 'text/javascript')
      document.body.appendChild(script)
      script.onload = function () {
        eruda.init()
        document.getElementById('load_eruda').remove()
      }
    } else {
      document.getElementById('load_eruda').remove()
    }
  }
</script>
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/eruda"></script>
<script>
  eruda.init()
</script>

<!-- 使用js -->
<script id="load_eruda">
  window.onload = function () {
    if (window.pre_host === 'uat') {
      var script = document.createElement('script')
      script.setAttribute('src', '//cdn.jsdelivr.net/npm/eruda')
      script.setAttribute('type', 'text/javascript')
      document.body.appendChild(script)
      script.onload = function () {
        eruda.init()
        document.getElementById('load_eruda').remove()
      }
    } else {
      document.getElementById('load_eruda').remove()
    }
  }
</script>

spy-debugger ​

前面两个都是在项目里面 html 标签直接引入,手机上面显示调试工具,这个需要代码操作,比较麻烦,好处是不需要针对项目调试,所有的 h5 网页均可调试

  1. 安装:npm i spy-debugger -g

  2. 启动:spy-debugger

  3. 手机和 PC 保持在同一网络下(比如同时连到一个 Wi-Fi 下)

  4. 设置手机的 http 代理,ip 地址为 pc 的 ip 地址,端口为 spy-debugger 启动之后的端口,默认为 9888;

  5. 手机安装证书:进入 spy-debugger 启动之后的官网 --> 点击请求抓包 --> 点击 RootCA --> 手机扫描该二维码进行安装证书

  6. 之后进入在手机里面就可以直接访问地址了,可以通过 spy-debugger 启动的网站,进行查看 console 或 html 元素等信息;

chrome 直接调试 ​

  1. 手机使用数据线连接至电脑
  2. 浏览器输入地址:chrome://inspect/#devices
  3. 手机安装 chrome 移动版浏览器,并输入地址,即可以调试;
  4. 出现的地址中,点击devices直接就可以调试了;

移动端不能通过 ip 地址访问 ​

查看 webpack-dev 配置,改为:host: '0.0.0.0'

与原生端联调 ​

在原生端的最顶端对象同样是 window,我们可以将值放在 window 对象上;

安卓端 ​

举例:安卓端绑定方法到 window 对象上

js
window.*.getStatusBarHeight();
window.*.getStatusBarHeight();

ios 端 ​

h5 通过在 window 上面绑定方法,直接调用 ios 的方法,ios 内部调用该方法,将值传入;

ios 定义一个方法,让 h5 调用,在这个方法内部调用 h5 绑定在 window 上的方法,并将值传送这个方法;

h5 通过在 postMessage 里面可以直接向 ios 端发送消息;

js
window.getInfo = function (info) {}
window.webkit.messageHandlers.toH5Version.postMessage('')
window.getInfo = function (info) {}
window.webkit.messageHandlers.toH5Version.postMessage('')

移动端的特殊处理 ​

js
1.禁止用户选中内容
div{ user-select: none}

2. 手触a标签或者button标签,底下有半透明的阴影 button,a{
   -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
   }
3. 禁止出现长按有系统菜单
   img{ -webkit-touch-callout : none}
4. ios如何清除表单元素输入框默认样式(如内阴影) input{appearance: none;}
5. 移动端小于12px文本
   p{tansform : scale(.5)}
1.禁止用户选中内容
div{ user-select: none}

2. 手触a标签或者button标签,底下有半透明的阴影 button,a{
   -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
   }
3. 禁止出现长按有系统菜单
   img{ -webkit-touch-callout : none}
4. ios如何清除表单元素输入框默认样式(如内阴影) input{appearance: none;}
5. 移动端小于12px文本
   p{tansform : scale(.5)}

参考文章 ​

  1. Html5 页面适配 iPhoneX(就是那么简单)