常用布局
h5 首页布局
头部,内容,尾部
<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>.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(子元素排列顺序)
flex-direction:属性规定灵活项目的排列方向(主轴方向):
row:默认值,灵活的项目将水平显示。
row-reverse:与row相同,但是以相反的顺序。
column:灵活的项目将垂直显示。
column-reverse:与column相同,但是以相反的顺序。flex-direction:属性规定灵活项目的排列方向(主轴方向):
row:默认值,灵活的项目将水平显示。
row-reverse:与row相同,但是以相反的顺序。
column:灵活的项目将垂直显示。
column-reverse:与column相同,但是以相反的顺序。flex-wrap(换行)
用于设置伸缩项目在主轴上的换行方式:
nowrap:默认值。规定灵活的项目不拆行或不拆列。
wrap:规定灵活的项目在必要的时候拆行或拆列。
wrap-reverse:规定灵活的项目在必要的时候拆行或拆列,但是以相反的顺序。用于设置伸缩项目在主轴上的换行方式:
nowrap:默认值。规定灵活的项目不拆行或不拆列。
wrap:规定灵活的项目在必要的时候拆行或拆列。
wrap-reverse:规定灵活的项目在必要的时候拆行或拆列,但是以相反的顺序。flex-flow
flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap;-简化代码flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap;-简化代码justify-content(主轴对齐方式)
justify-content:用于设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式:
flex-start:默认值。项目位于容器的开头。
flex-end:项目位于容器的结尾。
center:项目位于容器的中心。
space-between:项目位于各行之间留有空白的容器内。
space-around:项目位于各行之前、之间、之后都留有空白的容器内。justify-content:用于设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式:
flex-start:默认值。项目位于容器的开头。
flex-end:项目位于容器的结尾。
center:项目位于容器的中心。
space-between:项目位于各行之间留有空白的容器内。
space-around:项目位于各行之前、之间、之后都留有空白的容器内。align-items(侧轴对齐方式)
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 轴对齐方式)
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 属性(单个元素侧轴对齐方式)
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 扩展比率
flex-grow:用于设置或检索弹性盒子项目的扩展比率;
number:规定项目将相对于其他灵活的项目进行扩展的量。默认值是0。
即当容器空间大于内部元素空间之和时,剩余部分将根据各元素指定的flex-grow按比例分配,使各子元素增大;默认值为0,表示剩余空间不分配。flex-grow:用于设置或检索弹性盒子项目的扩展比率;
number:规定项目将相对于其他灵活的项目进行扩展的量。默认值是0。
即当容器空间大于内部元素空间之和时,剩余部分将根据各元素指定的flex-grow按比例分配,使各子元素增大;默认值为0,表示剩余空间不分配。flex-shrink 收缩比率
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 伸缩基准值
flex-basis:设置弹性盒伸缩基准值(指定flex-item在主轴上的初始大小):
number:规定灵活项目的初始长度。
auto:默认值。长度等于灵活项目的长度。如果该项目未指定长度,则长度将根据内容决定。flex-basis:设置弹性盒伸缩基准值(指定flex-item在主轴上的初始大小):
number:规定灵活项目的初始长度。
auto:默认值。长度等于灵活项目的长度。如果该项目未指定长度,则长度将根据内容决定。order 出现顺序
order:属性设置或检索弹性盒模型对象的子元素出现的順序。
number:值越小排列越靠前,值越大顺序越靠后 + -order:属性设置或检索弹性盒模型对象的子元素出现的順序。
number:值越小排列越靠前,值越大顺序越靠后 + -flex 属性简写
(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 autoGrid 布局
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;给包裹元素设置;

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

<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>.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;
}两栏等高布局
<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>.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
解决办法二;给有效区也加背景颜色
圣杯布局(中间自适应)
- 三栏布局,左边宽度固定,右边宽度固定,中间自适应。
- 大的父元素里面包含左中右三栏,先写中间的栏目,在写左右
- 给中间的栏目设置宽度是 100%;左右两侧的栏目宽度是固定。
- 给三个栏目设置浮动,三个都是 float left;
- 给左边的栏目加 margin-left:-100%;
- 给右边的栏目加 margin-left:-右边栏目宽度;
- 给大的父元素设置 padding 值:0 右边栏目宽度 0 左边栏目的宽度,把元素都挤到中间。
- 给左边的栏目写定位:position:relative; left:-左边栏目的宽度;
- 给右边栏目写定位:position:relative; right:-右边栏目的宽度;
- 当浏览器的宽度小的时候,出现左右栏目掉下来的问题,给大的父元素设置最小宽度,需要是大于左右两栏的宽度总和。
双飞翼布局。(中间自适应)
三栏布局,左右宽度固定,
1-5 点如同圣杯布局。
给中间的 center 加一个子元素,给子元素设置 padding 值:0 右侧栏目的宽度 0 左侧栏目的宽度。
也可以设置 margin 值。
等高布局一、
三栏的等高布局:第一栏宽度 30%,第二栏宽度 40%,第三栏宽度 30%,写几栏的等高布局,就要写几个 100%的大盒子,还要写几个小盒子,并给几个盒子写浮动。
- 给爷爷爸爸儿子都设置成宽度是 100%;
- 给爸爸设置相对于原来位置向左侧移动 30%,这个时候就漏出爷爷的 30%。
- 给儿子相对于原来位置向左侧移动 40%,就漏出爸爸的 40%,儿子也漏出 30%。
- 给儿子里面的 right 设置相对于原来的位置向右侧移动 70%。
- 给儿子里面的 center 设置如第 4 点。
- 给儿子里面的 left 设置如第 4 点。
等高布局二
padding 和 margin 互怼,
三栏布局,第一栏设置 300px,第二栏设置 400px,第三栏是 300px,三栏等高,改变其中一栏的高度,其他两栏的高度跟着改变。
给三栏都加 padding-bottom:9999px;margin-bottom:-9999px,保证整个盒子的高度不改变,给三栏的父元素设置溢出隐藏。
等高布局二会出现给第三栏加边框的时候,下边框看不见,
解决办法一、单独写一个和边框的宽高一样的盒子,让这个盒子相对于父元素(大的盒子)进行定位。
解决办法二、给三栏的父元素再加一个父元素,给这个新加的父元素设置背景图片。
等高布局三
边框模拟等高布局(只能写两栏或者三栏)
三栏等高布局,第一栏 300px,第二栏 400px,第三栏 300px。
- 设置一个大盒子居中浏览器,设置一个小盒子中间的 400px,
- 给中间的盒子设置左边框 300px 的宽度,右边框 300px 的宽度,实线的,颜色是左右两边的。
- 然后在中间的盒子里设置三栏,给这个三栏设置浮动,移动三栏的位置,
- 给左边的设置 margin-left:-700px;,给右边的设置 margin-left:-300px,之后给右边的相对定位到右边去;
- 记得给父元素清楚浮动,否则高度撑不起来,无法等高布局。
两栏等高
<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>.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 浏览器不兼容性问题
- 在 ie6 及以下版本,会出现双边距的问题。
问题:给元素设置浮动,再给元素设置 margin-left;第一个元素的左边会出现双倍边距的问题。
解决办法:给浮动的元素设置_display:inline;
- ie6 以下小高度问题:
问题:给元素设置小高度不行,例如:设置了 1px 的边框,会出现至少 5px 高的边框。
解决问题:给元素设置 font-size:0; line-height:0; overflow:hidden。
- ie7 及以下版本,块元素转成内联块,不在同一行显示的问题;
解决办法:给元素加*dispaly:inline; *zoom:1;
- ie7 及以下版本,给子元素设置了相对定位,再给父元素设置溢出隐藏,溢出隐藏会失效。
解决办法:给父元素也设置相对定位。
- ie7 及以下版本,li 中出现两个或两个以上浮动,li 与 li 中间会出现空白间隙问题,基线对齐;
解决办法:给 li 设置 vertical-align:top/middle/bottom;
- ie8 里 a 标签包含的图片有边框问题,
解决办法:给图片设置 border:none;
移动端布局
响应式布局
响应式的图片
需要给图片设置
max-width:100%;height:auto;响应式的字体
html{font-size:100%;}之后可以设置响应式的字体:
@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;
}
}响应式网站的优点
减少工作量
网站、设计、代码、内容都 只需要一份
多出来的工作量只是 JS 脚本、CSS 样式做一些改变
节省时间
每个设备都能得到正确的设计
移动端布局
vh、vw 相关
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
许多智能手机都使用了一个比实际屏幕尺寸大很多的虚拟可视区域(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,最大缩放比例为原始像素大小,不允许用户放大或者缩小;响应式网站的缺点
- 会加载更多的样式和脚本资源
- 设计比较难精确定位和控制
- 老版本浏览器兼容不好
媒体查询
通过媒体查询我们可以对不同的设备指定特定的样式
- 在 link 标签后面输入(css2)
<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)
@media screen and (min-width: 600px) and (max-width: 1000px) {
} //需要修改的样式写在括号里面,可以针对单独的修改样式。@media screen and (min-width: 600px) and (max-width: 1000px) {
} //需要修改的样式写在括号里面,可以针对单独的修改样式。移动端适配
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 基本转换
以750px的屏幕宽度,预计100px=1rem来计算,计算公式为:
1rem = 根字体大小 = 当前屏幕宽度 (document.body.clientWidth)/ 750 * 100 px以750px的屏幕宽度,预计100px=1rem来计算,计算公式为:
1rem = 根字体大小 = 当前屏幕宽度 (document.body.clientWidth)/ 750 * 100 px移动端布局
- 页面 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标题- 设置 viewport(至少记住三个)
<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;自适应;
<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>自适应布局
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'
}禁止手机端缩放
<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 兼容处理方案
首页必须给
meta标签添加name字段为viewport的,content值增加viewport-fit=cover;html<meta name="viewport" content="viewport-fit=cover" /><meta name="viewport" content="viewport-fit=cover" />单独给 body 增加 iphonex 的安全距离不起作用, 是由于
position: fixed属性,bottom: 0造成吸底了, 需要给所有的bottom: 0增加对应的安全距离, 不再写bottom: 0, 而是写bottom: env(safe-area-inset-bottom);两个函数介绍
constant:针对 iOS < 11.2 以下系统env:针对于 iOS >= 11.2 的系统
因此两个函数都得增加上
支持的变量:
safe-area-inset-left:左边的安全距离safe-area-inset-right:右边的安全距离safe-area-inset-top:上边的安全距离safe-area-inset-bottom:下边的安全距离
两种情况处理方式
bottom 不是 0
使用 calc 函数进行计算, 原有的 bottom 距离加上, 比如:
bottom: calc(50px + env(safe-area-inset-bottom))bottom 是 0
增加一个空的块, 写入如下样式
cssbody::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颜色一致 */ }使用
@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 { ....; } }
移动端布局解决方案
布局方式:
固定布局
- 页面设置单位都是 px,一般设置整个页面宽度 320px,
- 缺点:大于 320px 的页面,两边都会留白,不好看。
流式布局:
- 宽度使用百分比,高度设置 px,页面会出现拉伸,不兼容。
响应式布局:
- 利用媒体查询,判断不同的设备,使用不同的 css 文件,比较麻烦。
- 优点是:根据不同的手机页面适配不同,用户体验极好。
- 在引入 css 文件后面添加 media="screen and (min-width)";限制使用 css 文件。
- min-width 最小宽度,max-width 最大宽度,min-height 最小高度,max-height 最大高度。
rem 布局:
- 设置页面 html 的 font-size 大小做比较,使用 js 代码获取设备的宽度给页面 font-size 赋值,实现元素自适应。
- 需要注意浏览器会有最小字体大小,会出现小尺寸手机文字下掉,设置单行/多行文本超出显示点状
- 图片是根据基线对齐,设置了默认页面 font-size 大小之后,字体变大,图片会下掉,转块可以解决。
- 图片需要设置宽高才能等比例缩放,放置背景图需要设置背景尺寸 100%,否则图片大小无法根据 rem 等比例缩放,无法显示完整的图片。
rem 单位:
- 当 html{font-size:100px;}时,页面使用则 1rem=100px;
em 单位:
- 针对局部使用:当 em 的 div{font-size:100px; },div 里面 width:1em=100px;
使用插件自动转换 px
postcss-px2rem将 px 转换成 rempostcss-px-to-viewport将 px 转换成 vw
移动端调试
vconsole
<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 调试工具
<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 网页均可调试
安装:
npm i spy-debugger -g启动:
spy-debugger手机和 PC 保持在同一网络下(比如同时连到一个 Wi-Fi 下)
设置手机的 http 代理,ip 地址为 pc 的 ip 地址,端口为 spy-debugger 启动之后的端口,默认为 9888;
手机安装证书:进入 spy-debugger 启动之后的官网 --> 点击请求抓包 --> 点击 RootCA --> 手机扫描该二维码进行安装证书
之后进入在手机里面就可以直接访问地址了,可以通过 spy-debugger 启动的网站,进行查看 console 或 html 元素等信息;
chrome 直接调试
- 手机使用数据线连接至电脑
- 浏览器输入地址:chrome://inspect/#devices
- 手机安装 chrome 移动版浏览器,并输入地址,即可以调试;
- 出现的地址中,点击
devices直接就可以调试了;
移动端不能通过 ip 地址访问
查看 webpack-dev 配置,改为:host: '0.0.0.0'
与原生端联调
在原生端的最顶端对象同样是 window,我们可以将值放在 window 对象上;
安卓端
举例:安卓端绑定方法到 window 对象上
window.*.getStatusBarHeight();window.*.getStatusBarHeight();ios 端
h5 通过在 window 上面绑定方法,直接调用 ios 的方法,ios 内部调用该方法,将值传入;
ios 定义一个方法,让 h5 调用,在这个方法内部调用 h5 绑定在 window 上的方法,并将值传送这个方法;
h5 通过在 postMessage 里面可以直接向 ios 端发送消息;
window.getInfo = function (info) {}
window.webkit.messageHandlers.toH5Version.postMessage('')window.getInfo = function (info) {}
window.webkit.messageHandlers.toH5Version.postMessage('')移动端的特殊处理
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)}
Cao Note