10-响应式
响应式
什么是响应式布局
响应式布局(respond layout)是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端(手机、平板、pc电脑) ——而不是为每个终端做一个特定的版本。这个概念是为解决移动互联网浏览而诞生的。
优点:
一套代码可以适配多个终端
**缺点: **
1. 需要兼容多个终端 开发效率低
2. 有很多处理兼容的代码 代码冗余较大 加载速度慢
响应式开发现状:
1. 不是所有的网站都适合响应式 基本上是一些简约式的网站适合
2. 如果公司里面已经有了PC网页 那么直接开发手机端就可以
3. 如果是一个新建站点, 并且这个网站比较简约 可以采用响应式来写
4. 国内的响应式网站很少, 国外较多
响应式开发与移动web开发的比较
开发方式 | 移动web开发+pc开发 | 响应式开发 |
---|---|---|
引用场景 | 一般已经有了PC端网站,只需要端独开发移动端网站即可 | 针对一些新建网站,并且要求适配移动端 |
开发 | 针对性强,开发效率高 | 兼容各种终端,效率低 |
适配 | 只能适配移动端或者PC端,pad上体验比较差 | 可以适配各种终端 |
效率 | 代码简洁,加载快 | 代码相对复杂,加载慢 |
响应式开发原理
就是使用媒体查询针对不同宽度的设备进行布局和样式的设置,从而适配不同设备的目的。
设备的划分情况:
- 小于768的为超小屏幕(手机)
- 768~992之间的为小屏设备(平板)
- 992~1200的中等屏幕(桌面显示器)
- 大于1200的宽屏设备(大桌面显示器)
设备分类
分类 | 宽度范围 |
---|---|
大屏设备 | >1200px |
中屏设备 | 992px~1200px |
小屏设备 | 768px~992px |
超小屏设备 | < 768px |
.w {
width: 100%;
height: 200px;
margin: 0 auto;
background-color: lime;
}
/* 覆盖式的写法: 先写最大范围的 然后用小范围的覆盖大范围的 */
@media screen and (min-width: 768px) {
.w {
width: 750px;
height: 200px;
margin: 0 auto;
background-color: yellow;
}
}
@media screen and (min-width: 992px) {
.w {
width: 970px;
height: 200px;
margin: 0 auto;
background-color: blue;
}
}
@media screen and (min-width: 1200px) {
.w {
width: 1170px;
height: 200px;
margin: 0 auto;
background-color: red;
}
}
注意: 媒体查询仅仅是一个css使用的限制条件,并不会增加css的权重
bootstrap框架
Bootstrap,来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。
基本模板
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<!-- 当使用IE浏览器时,自动调用IE浏览器的最高内核 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap模板</title>
<!-- Bootstrap -->
<link href="./lib/css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
<!-- 条件注释 -->
<!--[if lt IE 9]>
<script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="./lib/js/jquery.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="./lib/js/bootstrap.min.js"></script>
</body>
</html>
全局样式
container容器
Bootstrap 需要为页面内容和栅格系统包裹一个 .container 容器。默认带了15px的padding值。
.container
类用于固定宽度并支持响应式布局的容器。
<div class="container">
...
</div>
.container-fluid
类用于 100% 宽度,占据全部视口(viewport)的容器。
<div class="container-fluid">
...
</div>
这两种 容器类不能互相嵌套。
栅格系统 (重要)
栅格系统,也叫网格系统
栅格系统: 是BS实现响应式的核心所在 其底层也是媒体查询
栅格系统: 不管在什么大小的容器里面,都将这个容器分为12份,在不同大小屏幕里面,占的份数不同
最终目的: 在任何大小的屏幕上 都有较好的浏览体验
// 假设我现在有12个盒子
如果是大屏幕设备, 每行放 6 个 div, 可以放两排
如果是中屏设备, 每行放 4 个 div, 可以放三排
如果是小屏设备, 每行放 3 个 div, 可以放四排
如果是超小屏设备, 每行放 2 个 div, 可以放六排
大屏 6个div 两 12份 一个div占2份 放6个 大屏上: 16.666% 浮动
中屏 4个div 三 12份 一个div占3份 放4个 中屏上: 25% 浮动
小屏 3个div 四 12份 一个div占4份 放3个 小屏上: 33.33% 浮动
超小屏 2个div 六 12份 一个div占6份 放2个 超小屏: 50% 浮动
不同大小屏幕里面,每一个盒子占多少份 (一行放多少个 然后直接拿12除以一行的个数就行了)
大屏 一个盒子占2份 .col-lg-xx
中屏 一个盒子占3份 .col-md-xx
小屏 一个盒子占4份 .col-sm-xx
超小屏 一个盒子占6份 .col-xs-xx
.row
用于抵消.container
容器的15px的padding值- 可以在
.row
中嵌套column
栅格系统常用类(总共12列)
类名 | 例子 | 解释 |
---|---|---|
.col-xs-xx | .col-xs-6 | 在超小屏幕(及以上)生效 |
.col-sm-xx | .col-sm-6 | 在小屏幕(及以上)生效 |
.col-md-xx | .col-md-6 | 在中屏幕(及以上)生效 |
.col-lg-xx | .col-lg-3 | 在大屏幕及生效,占1/4 |
.col-lg-xx | .col-lg-4 | 在大屏幕及生效,占1/3 |
.col-lg-xx | .col-lg-5 | 在大屏幕及生效,占1/2 |
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<!-- 当使用IE浏览器时,自动调用IE浏览器的最高内核 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>栅格</title>
<!-- Bootstrap -->
<link href="./lib/css/bootstrap.min.css" rel="stylesheet">
<style>
div[class^="col"] {
box-sizing: border-box;
border: 1px solid red;
margin-left: -1px;
margin-bottom: -1px;
}
</style>
</head>
<!-- 栅格系统:默认把屏幕分成12份 -->
<!-- 极小屏幕:width < 768px -->
<!-- 小屏幕:768px <= width < 992px -->
<!-- 中屏幕:992px <= width < 1000px -->
<!-- 大屏幕:width > 1000px -->
<!-- 样式只在比它大的屏幕下是有效的,在比他小的屏幕上无效 -->
<!-- 移动端优先,在没有写什么容器的情况下,默认是手机端xs屏幕 -->
<!-- 如果lg屏幕未定义,就用md屏幕的,始终去用他小一级屏幕的样式 -->
<body>
<!-- 1.先写大容器(版心或者全屏) -->
<!-- 版心 -->
<div class="container">
<!-- 2.再写行 -->
<div class="row">
<!-- 3.根据不同的需求写列 -->
<!-- 在极小屏幕下每个盒子占4份,刚好占满 -->
<h3>极小</h3>
<div class="col-xs-4">1</div>
<div class="col-xs-4">2</div>
<div class="col-xs-4">3</div>
<div class="col-xs-4">4</div>
<div class="col-xs-4">5</div>
<div class="col-xs-4">6</div>
</div>
<div class="row">
<h3>小</h3>
<!-- 3.根据不同的需求写列 -->
<!-- 在小屏幕下每个盒子占2份,刚好占满 -->
<div class="col-sm-2">1</div>
<div class="col-sm-2">2</div>
<div class="col-sm-2">3</div>
<div class="col-sm-2">4</div>
<div class="col-sm-2">5</div>
<div class="col-sm-2">6</div>
</div>
<div class="row">
<h3>中等</h3>
<!-- 3.根据不同的需求写列 -->
<!-- 在中屏幕下每个盒子占2份,刚好占满 -->
<div class="col-md-2">1</div>
<div class="col-md-2">2</div>
<div class="col-md-2">3</div>
<div class="col-md-2">4</div>
<div class="col-md-2">5</div>
<div class="col-md-2">6</div>
</div>
<div class="row">
<h3>大</h3>
<!-- 3.根据不同的需求写列 -->
<!-- 在大屏幕下每个盒子占2份,刚好占满 -->
<div class="col-lg-2">1</div>
<div class="col-lg-2">2</div>
<div class="col-lg-2">3</div>
<div class="col-lg-2">4</div>
<div class="col-lg-2">5</div>
<div class="col-lg-2">6</div>
</div>
</div>
<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="./lib/js/jquery.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="./lib/js/bootstrap.min.js"></script>
</body>
</html>
Bootstrap组件——分页
<!-- 定义一个分页 -->
<ul class="pagination">
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<li class="disabled"><a href="#">1</a></li>
<li class="active"><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
<!-- </nav> -->
<nav aria-label="...">
<ul class="pagination">
<li class="disabled">
<!-- 禁用 -->
<span>
<span aria-hidden="true">«</span>
</span>
</li>
<!-- 激活 -->
<li class="active">
<span>1 <span class="sr-only">(current)</span></span>
</li>
...
</ul>
</nav>
<ul class="pager">
<li><a href="#">Previous</a></li>
<li><a href="#">Next</a></li>
</ul>
<ul class="pager">
<li class="previous"><a href="#">Older</a></li>
<li class="next"><a href="#">Newer</span></a></li>
</ul>
Bootstrap组件——进度条
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"
style="width: 60%;">
<span class="sr-only">60% Complete</span>
60%
</div>
</div>
Bootstrap组件——列表
<ul class="list-group">
<li class="list-group-item">
<span class="badge">14</span>
Cras justo odio</li>
<li class="list-group-item">Dapibus ac facilisis in</li>
<li class="list-group-item">Morbi leo risus</li>
<li class="list-group-item">Porta ac consectetur ac</li>
<li class="list-group-item">Vestibulum at eros</li>
</ul>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
Panel content
</div>
<div class="panel-footer">
Panel content
</div>
</div>
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">Panel heading</div>
<div class="panel-body">
<p>...</p>
</div>
<!-- Table -->
<table class="table">
<tr>
<td>阿斯蒂芬</td>
<td>阿斯蒂芬</td>
</tr>
<tr>
<td>阿斯蒂芬</td>
<td>阿斯蒂芬</td>
</tr>
<tr>
<td>阿斯蒂芬</td>
<td>阿斯蒂芬</td>
</tr>
</table>
</div>
<!-- 16:9 aspect ratio -->
<div class="embed-responsive embed-responsive-16by9">
<iframe class="embed-responsive-item" src="..."></iframe>
</div>
<!-- 4:3 aspect ratio -->
<div class="embed-responsive embed-responsive-4by3">
<iframe class="embed-responsive-item" src="..."></iframe>
</div>
Bootstrap组件——导航条
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">某管理系统</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav" id="mytab">
<li class="active"><a href="#">首页 <span class="sr-only">(current)</span></a></li>
<li class="dropdown active">
<a href="#" class="dropdown-toggle " data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false">功能 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#"><small class="text-muted">业务功能</small></a></li>
<li><a href="#">信息建立</a></li>
<li><a href="#">信息查询</a></li>
<li><a href="#">信息管理</a></li>
<li role="separator" class="divider"></li>
<li><a href="#"><small class="text-muted">系统功能</small></a></li>
<li><a href="#">设置</a></li>
</ul>
</li>
<li><a href="#">帮助 <span class="sr-only">(current)</span></a></li>
</ul>
<form class="navbar-form navbar-left">
<div class="form-group">
<input type="text" class="form-control" placeholder="用户名...">
<input type="text" class="form-control" placeholder="密码...">
</div>
<button type="submit" class="btn btn-default">登录</button>
</form>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
Bootstrap组件——轮播图
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<!-- 当使用IE浏览器时,自动调用IE浏览器的最高内核 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap模板</title>
<!-- Bootstrap -->
<link href="./lib/css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
<!-- 条件注释 -->
<!--[if lt IE 9]>
<script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->
<style>
.carousel-inner img {
margin: 0 auto;
}
#carousel-example-generic {
width: 500px;
}
</style>
</head>
<body>
<!-- 轮播组件的id要和下面所有id都相同 -->
<div id="carousel-example-generic" class="carousel slide" data-ride="carousel">
<!-- 小点点 -->
<ol class="carousel-indicators">
<!-- data-slide-to="0":索引,从0开始 -->
<!-- 小点点0对应图片的l1 -->
<li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
<li data-target="#carousel-example-generic" data-slide-to="1"></li>
<li data-target="#carousel-example-generic" data-slide-to="2"></li>
</ol>
<!-- 图片内容 -->
<div class="carousel-inner" role="listbox">
<div class="item active">
<img src=".https://user-gold-cdn.xitu.io/2020/4/15/1717dc0b3184f732?w=720&h=350&f=jpeg&s=102995"
alt="...">
<!-- 图片中的文字 -->
<div class="carousel-caption">第一张</div>
</div>
<div class="item">
<img src="https://user-gold-cdn.xitu.io/2020/4/15/1717dc10c20da4f6?w=720&h=350&f=jpeg&s=92997"
alt="...">
<div class="carousel-caption">第二张</div>
</div>
<div class="item">
<img src="https://user-gold-cdn.xitu.io/2020/4/15/1717dc15c7ddd104?w=720&h=350&f=jpeg&s=116124"
alt="...">
<div class="carousel-caption">第三张</div>
</div>
</div>
<!-- 控制箭头 -->
<a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="./lib/js/jquery.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="./lib/js/bootstrap.min.js"></script>
</body>
<script>
$('.carousel').carousel({
interval: 2000
})
</script>
</html>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<!-- 当使用IE浏览器时,自动调用IE浏览器的最高内核 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap模板</title>
<!-- Bootstrap -->
<link href="./lib/css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
<!-- 条件注释 -->
<!--[if lt IE 9]>
<script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->
<style>
.carousel {
height: 500px;
}
.carousel .item {
height: 500px;
}
.carousel .item img {
width: 100%;
}
</style>
</head>
<body>
<!-- 轮播组件的id要和下面所有id都相同 -->
<div id="carousel-example-generic" class="carousel slide" data-ride="carousel">
<!-- 小点点 -->
<ol class="carousel-indicators">
<!-- data-slide-to="0":索引,从0开始 -->
<!-- 小点点0对应图片的l1 -->
<li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
<li data-target="#carousel-example-generic" data-slide-to="1"></li>
<li data-target="#carousel-example-generic" data-slide-to="2"></li>
</ol>
<!-- 图片内容 -->
<div class="carousel-inner" role="listbox">
<div class="item active">
<img src="http://img.mukewang.com/5412ad400001e52014280484.jpg" alt="...">
<!-- 图片中的文字 -->
<div class="carousel-caption">第一张</div>
</div>
<div class="item">
<img src="http://img.mukewang.com/5412ad7c0001d2eb10880541.jpg" alt="...">
<div class="carousel-caption">第二张</div>
</div>
<div class="item">
<img src=" http://img.mukewang.com/5412ae5c0001653b12800644.jpg" alt="...">
<div class="carousel-caption">第三张</div>
</div>
</div>
<!-- 控制箭头 -->
<a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a>
<a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
<!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="./lib/js/jquery.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="./lib/js/bootstrap.min.js"></script>
</body>
<script>
$('.carousel').carousel({
interval: 2000
})
</script>
</html>
思维导图及离线版的bootstrap
https://ww.lanzous.com/ibg069c