目录
- 1. 响应式布局
- 1.1 Bootstrap
- 1.1.1 简介
- 1.1.2 简单使用
- 1.1.3 布局容器
- 1.1.4 栅格系统
- 1.1.5 其它
- 2. 重绘和回流
1. 响应式布局
使用媒体查询针对不同宽度的设备,改变父级布局容器宽度(版心),再改变里面子元素的布局和样式。从而实现不同尺寸屏幕的不同页面布局和样式
参考设备划分 | 参考尺寸区间 | 参考父级布局容器宽度(版心宽度) |
---|---|---|
超小屏幕(xs) | <576px | 100% |
小屏设备(sm) | >=576px ~ 768px | 540px |
中等屏幕(md) | >=768px ~ <992px | 720px |
大屏设备(lg) | >=992px ~ <1200px | 960px |
超大设备(xl) | >=1200p ~ <1400px | 1140px |
特大设备(xxl) | >=1400px | 1320px |
1.1 Bootstrap
1.1.1 简介
Bootstrap基于HTML、CSS和JAVASCRIPT,有预制样式库、组件和
插件,使得Web开发更加快捷
- 中文官网:http://www.bootcss.com/
- 官网:http://getbootstrap.com/
- 推荐使用:https://v5.bootcss.com/
1.1.2 简单使用
在官网下载页下载Compiled CSS and JS,然后进行解压,我们的代码中引用css/bootstrap.min.css(内部引用了normalize.css)
在官网的图标页跳转到github下载链接进行bootstrap-icons-1.11.2.zip的下载,复制压缩包的font目录到项目的根目录下,然后在html文件中引入font/bootstrap-icons.min.css
示例如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<!-- 要求当前网页使用IE浏览器最高版本的内核来渲染 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<!-- 第一个解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题 -->
<!-- 第二个解决ie9以下浏览器对css3 Media Query的不识别 -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<title>test title</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="font/bootstrap-icons.min.css" rel="stylesheet">
</head>
<body>
<!-- 参考: https://v5.bootcss.com/docs/components/buttons/#示例 -->
<button type="button" class="btn btn-danger">Danger</button>
<!-- 参考: https://icons.bootcss.com/#usage -->
<i class="bi-alarm"></i>
<!-- 参考: https://v5.bootcss.com/docs/components/navbar/#supported-content -->
<!-- 导航栏式响应式的 -->
<nav class="navbar navbar-expand-lg bg-body-tertiary">
<div class="container-fluid">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Dropdown
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link disabled">Disabled</a>
</li>
</ul>
<form class="d-flex" role="search">
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success" type="submit">Search</button>
</form>
</div>
</div>
</nav>
</body>
</html>
效果如下:
1.1.3 布局容器
Bootstrap的页面内容和栅格系统,都需要一个父级布局容器(版心),只需给这个父级布局容器添加class="container"
(响应式布局,会自动使用媒体查询改变宽度)或class="container-fluid"
(流式布局,宽度为100%)
注: 一个页面可以有多个父级布局容器(版心)添加class="container"
,也可以有父级布局容器(版心)不添加class="container"
1.1.4 栅格系统
栅格系统(grid systems)也称“网格系统”,是一套响应式、移动设备优先的流式系统,通过将父级布局容器的宽度最多划分成12等份,实现在不同设备的页面内容缩放和重新布局的效果
- 行(row)与列(column)页面布局
- 栅格系统对于一行的内容,可以定义每个子元素占据的列份数
- 如果总列份数小于12等份,则一行会有空白(位于右侧);如果总列份数等于12等份,则刚好沾满一行;如果总列份数大于12等份,则会另起一行显示(位于左侧)
- 对于不同尺寸的屏幕,可以给每个子元素多个不同的class前缀,来定义子元素占据的列份数。类前缀: 超小屏幕(.col-)、小屏设备(col-sm-)、中等屏幕(.col-md-)、宽屏设备(.col-lg-)
- 如果没有设置较大尺寸屏幕的样式,较小尺寸屏幕的样式对较大屏幕同样有效。如知道了
.col-
则适用于所有尺寸的屏幕 - 行(row)会去除父容器的padding值;列(column)会有15px的padding值
示例如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<title>test title</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="font/bootstrap-icons.min.css" rel="stylesheet">
<style>
[class^="col-"] {
border: 1px solid pink;
}
</style>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-12 col-sm-6 col-md-4 col-lg-3">1</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3">2</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3">3</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3">4</div>
</div>
</div>
</body>
</html>
效果如下:
-
当位于超小屏幕一行显示一个子元素,分四行显示
-
当位于小屏设备一行显示两个子元素,分两行显示
-
当位于中等屏幕,如下图所示
-
当位于宽屏设备一行显示四个子元素
-
列嵌套: 栅格系统一行的一列又被划分成12等份,可以继续进行行(row)与列(column)页面布局
-
列偏移: 使用
.offset-*-*
的类可以将列向右侧偏移。实际是为当前元素增加了左侧的margin值 -
列显示/隐藏:
d-none
对所有尺寸的屏幕进行隐藏,d-*-block
或d-*-none
对大于等于该尺寸的屏幕进行显示或隐藏,同时定义多个列显示/隐藏的类,重叠部分会进行覆盖,如同时定义d-lg-none
、d-md-block
,在宽屏设置会隐藏,在中等屏幕会显示
示例如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<title>test title</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="font/bootstrap-icons.min.css" rel="stylesheet">
<style>
[class^="col-"] {
border: 1px solid pink;
}
</style>
</head>
<body>
<div class="container">
<!-- 列嵌套 -->
<div class="row">
<div class="col-lg-6">
<div class="row"> <!-- 高度自动和父盒子一样高 -->
<div class="col-lg-6">inner1</div>
<div class="col-lg-6">inner2</div>
</div>
</div>
<div class="col-lg-6">outer2</div>
</div>
<!-- 列偏移 -->
<div class="row">
<div class="col-lg-4">列偏移左</div>
<div class="col-lg-4 offset-lg-4">列偏移右</div>
</div>
<!-- 列显示/偏移 -->
<div class="row">
<div class="col-lg-6 d-none d-sm-block d-lg-none">1</div>
<div class="col-lg-6">2</div>
</div>
</div>
</body>
</html>
效果如下:在超小屏幕下,盒子1是隐藏的;在小屏设备和中等屏幕下,盒子1是显示的;在宽屏设置下,盒子1是隐藏的
1.1.5 其它
- 可以使用
class="clearfix"
清除浮动 - 可以使用
class="text-body-secondary
让文字的颜色变成灰色,参考: https://v5.bootcss.com/docs/utilities/colors/#colors
2. 重绘和回流
浏览器渲染页面步骤如下:
- 解析(Parser)HTML,生成DOM树(DOM Tree)
- 同时解析(Parser)CSS,生成样式规则(Style Rules)
- 根据DOM树和样式规则,生成渲染树(Render Tree)
- 进行布局Layout(回流/重排): 根据生成的渲染树,得到节点的几何信息(位置,大小)
- 回流/重排: 当 Render Tree中部分或者全部元素的尺寸、结构、布局等发生改变时,浏览器就会重新渲染部分或全部文档。回流一定会引起重绘。会导致回流/重排的操作:
- 页面的首次刷新
- 浏览器的窗口大小发生改变
- 元素的大小或位置发生改变
- 改变字体的大小
- 内容的变化。比如:input框的输入、图片的大小
- 激活css伪类。比如:
:hover
- 脚本操作DOM(添加或者删除可见的DOM元素)
- 回流/重排: 当 Render Tree中部分或者全部元素的尺寸、结构、布局等发生改变时,浏览器就会重新渲染部分或全部文档。回流一定会引起重绘。会导致回流/重排的操作:
- 进行绘制Painting(重绘): 根据计算和获取的信息进行整个页面的绘制
- 重绘: 节点(元素)的样式的改变并不影响它在文档流中的位置和文档布局,比如:color、background-color、outline等。重绘不一定引起回流
- Display: 展示在页面上