杂知识--预先看
- 图片和文字垂直居中:vertical-align: middle
- DPR:设备像素比,设备像素比(dpr) = 设备像素(分辨率)/设备独立像素(屏幕尺寸)
设备像素(物理像素): 显示器(手机屏幕)上最小的物理显示物理单元,在操作系统的调度下,每一个设备都有自己的颜色值和亮度值。
设备独立像素(密度无关像素): 可以认为是计算机坐标系统中得一个点,这个点代表一个可以由程序使用的虚拟像素(比如: css像素),有时我们也说成是逻辑像素。
元素设置的CSS像素是始终不变的,而一个CSS像素对应多少个设备像素是根据当前的缩放比例来决定的 - px | em | rem | fr:
- px:在移动端自适应的要求下,使用的频率不是很高
- rem:(root em)相对 HTML 根元素的字体大小的值:字体大小(基本都是用 rem 作为单位)
但是如果是移动设备,屏幕会有一个上下限制,可以控制分辨率在某个范围内,超过了该范围,就不再增加根元素的字体大小了(css的媒体查询或者js实现) - em:也是一个相对单位,却是相对于当前对象内文本的字体大小(继承时,相当于相对于父元素的字体):
- line-height。在 line-height 使用 em,在需要调整字体大小的时候,只需修改 font-size 的值,而 line-height 已经设置成了相对行高了。
- 首行缩进两个字符
- 导航菜单项
- fr: 自适应单位,被用于在一系列长度值中分配剩余空间,如果多个已指定了多个部分,则剩下的空间根据各自的数字按比例分配(可以和其他单位混合使用)。
- css的媒体查询:一般用在兼容PC和手机设备,由于屏幕跨度很大时,需要重新设计整界面的布局和排版
- 缺点:灵活性不高,取每个设备的精确值需要自己去计算,所以只能取范围值。设备屏幕众多,分辨率也参差不齐,把每一种机型的css代码写出来是不太可能的。
- 优点:无需监听浏览器的窗口变化,会跟随屏幕动态变化。媒体查询的用法当然不仅仅像在此处这么简单,相对于第二种自适应来说有很多地方是前者所远远不及的。
- viewport元标签:可以控制页面视口(viewport)的宽度、页面的缩放比例(原因:CSS中的1px并不一定不等于屏幕的物理分辨率1px),在桌面端指可视区域,在手机端指为Layout Viewport(布局视口)但是还另外涉及到Visual Viewport(视觉视口)和 Ideal Viewport。
- layout viewport——布局视窗: 网站的宽度,可以通document.documentElement.clientWidth获取
- visual viewport——视觉视窗: 代表浏览器可视区域的大小,可以通过 document.documentElement.innerWidth来获取
- 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
- 百分比: 外部整体包装盒div固定宽高(定死),并设置居中,里面的内容采用百分比
- rem: 在html(根)选择器里设置font-size,并且用媒体查询设置不同分辨率下html的font-size,接下来就是子元素全部运用rem来设置
- em:
2. flex布局:
-
有两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。
flex示意图 -
父元素的属性:
-
flex-direction:主轴的方向(主轴的方向不一定是水平的,这个属性就是设置主轴的方向,主轴默认是水平方向,从左至右,如果主轴方向设置完毕,那么交叉轴就不需要设置,交叉轴永远是主轴顺时针旋转 90°):
- row: 默认值,主轴为水平方向,起点在左端。
- row-reverse: 主轴为水平方向,起点在右端。
- column: 主轴为垂直方向,起点在上。
- column-reverse: 主轴为垂直方向,起点在下。
-
flex-wrap:超出父容器子容器的排列样式(换不换行,怎么换行)。
- nowrap: 默认,不换行
- wrap: 换行,第一行在上方。
- wrap-reverse: 换行,第一行在下方。
-
flex-flow:flex-direction 属性和 flex-wrap 属性的简写形式,默认值为 row nowrap:
flex-flow: <flex-direction> || <flex-wrap>;
-
justify-content:子容器在主轴的排列方向。
- flex-start: 默认,左对齐
- flex-end: 右对齐
- center: 居中
- space-between: 两端对齐,项目之间的间隔都相等。
- space-around: 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
-
align-items:子容器在交叉轴的排列方向。
- flex-start: 交叉轴的起点对齐。
- flex-end: 交叉轴的终点对齐。
- center: 交叉轴的中点对齐。
- baseline: 项目的第一行文字的基线对齐。
- stretch: 默认,如果项目未设置高度或设为auto,将占满整个容器的高度。
-
align-content:多根轴线的对齐方式
- flex-start: 与交叉轴的起点对齐
- flex-end: 与交叉轴的终点对齐。
- center: 与交叉轴的中点对齐。
- space-between: 与交叉轴两端对齐,轴线之间的间隔平均分布。
- space-around: 每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
- stretch: 默认 轴线占满整个交叉轴。
-
-
子元素的属性:
- order:子容器的排列顺序,数值越小,排列越靠前,默认为 0
- flex-grow:子容器剩余空间的拉伸比例,按照该比例给子容器分配空间
- flex-shrink:子容器超出空间的压缩比例(此属性要生效,父容器的 flex-wrap 属性要设置为 nowrap)
- flex-basis:子容器在不伸缩情况下的原始尺寸,主轴为横向时代表宽度,主轴为纵向时代表高度。
- flex:flex-grow flex-shrink flex-basis (集结起来)
- align-self:属性允许单个项目有与其他项目不一样的对齐方式,可覆盖父容器 align-items 属性:
- auto: 默认,继承父元素的 align-items 属性
- flex-start: 交叉轴的起点对齐。
- flex-end: 交叉轴的终点对齐。
- center: 交叉轴的中点对齐。
- baseline: 项目的第一行文字的基线对齐。
- stretch: 如果项目未设置高度或设为auto,将占满整个容器的高度。
3. grid 网格布局(网格布局以后,容器子元素(项目)的float、display: inline-block、display: table-cell、vertical-align、column和clear等设置都将失效。)
核心组成: wrapper(父元素)和 items(子元素)。 wrapper 是实际的 grid(网格),items 是 grid(网格) 内的内容。
-
基本属性:
- grid-template-columns:多少列,没有设置,默认只有一列,宽度为父元素的 100%
- grid-template-rows:多少行
- 间距grid-gap:
- grid-row-gap:行与行之间的距离。
- grid-column-gap:创建列与列之间的距离。
-
配合的函数:
- minmax()函数: 创建行或列的最小或最大尺寸,第一个参数定义网格轨道的最小值,第二个参数定义网格轨道的最大值(可以接受任何长度值)。auto 值允许网格轨道基于内容的尺寸拉伸或挤压。:
- 父元素高度>两行最大值之和,那么第一列和第二列的高度都为设置的最大值
- 父元素高度<两行最大值之和,a=height(父元素)-两行最小值之和
第一行高度h1=最小值+a/2
第二行高度h2=最小值+a/2
- repeat()函数: 创建重复的网格轨道。这个适用于创建相等尺寸的网格项目和多个网格项目。接受两个参数:第一个参数定义网格轨道应该重复的次数,第二个参数定义每个轨道的尺寸。
- minmax()函数: 创建行或列的最小或最大尺寸,第一个参数定义网格轨道的最小值,第二个参数定义网格轨道的最大值(可以接受任何长度值)。auto 值允许网格轨道基于内容的尺寸拉伸或挤压。:
-
通过网格线定位 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来对齐)
- 值:
- table 相当于“table”标签
- table-row 相当于“tr”标签
- table-cell 相当于“td”标签
- table-row-group 此元素会作为一个或多个行的分组显示 tbody
- table-heightder-group 此元素会作为一个或多个行的分组显示 thead
- table-footer-grounp 此元素会作为一个或多个行的分组显示 tfoot
- table-column-grounp 此元素会作为一个或多个列的分组显示 colgroup
- table-column 此元素会作为一个单元格列显示=>col
- table-caption 此元素会作为一个表格标题显示=》caption
- 注意点:
- display: table时 对应元素的padding会失效;
- display: table-row时 对应元素的padding、margin会失效;
- display: table-cell时 对应元素的margin会失效;
- displaty: table-cell不要与float,position: absolute等改变布局的属性同时使用,作用会被破坏
- 表格样式:
- border
- border-collapse: 设置是否将表格边框折叠为单一边框
- text-align: 设置水平对齐方式,比如左对齐、右对齐或者居中
- vertical-align: 设置垂直对齐方式,比如顶部对齐、底部对齐或居中对齐
- padding
- border-spacing: 设置分隔单元格边框的距离
- caption-side: 设置表格标题的位置
- empty-cells: 设置是否显示表格中的空单元格
- table-layout: 设置显示单元、行和列的算法
- 值:
移动端自适应 开发原则:文字流式,控件弹性,图片等比缩放
-
参考链接:
移动端设配
利用视口单位适配页面
- 采用rem
- 在html(根)选择器里设置font-size,并且用媒体查询设置不同分辨率下html的font-size(或者使用js来设置),接下来就是子元素全部运用rem来设置
rem的值经常等于(设备的宽度)x100/(设计稿宽度)
- 在html(根)选择器里设置font-size,并且用媒体查询设置不同分辨率下html的font-size(或者使用js来设置),接下来就是子元素全部运用rem来设置
- 使用vw作为CSS单位(无论是文本还是布局高宽、间距等)
- 搭配vw和rem,优化布局
网友评论