前端入门24-响应式布局(BootStrap)
声明
本篇内容摘抄自以下两个来源:
感谢大佬们的分享。
正文-响应式布局(bootstrap)
这次想来讲讲一个前端开发框架:bootstrap
bootstrap 目前已经出了 4 个版本,每个版本都有对应的官网教程,先来看看不同版本里的宣传语:
简洁、直观、强悍的前端开发框架,让web开发更迅速、简单。--- bootstrap 2.x.x 版本
bootstrap 是最受欢迎的 html、css 和 js 框架,用于开发响应式布局、移动设备优先的 web 项目。 --- bootstrap 3.x.x 版本
bootstrap 是全球最受欢迎的前端组件库,用于开发响应式布局、移动设备优先的 web 项目。
bootstrap 是一套用于 html、css 和 js 开发的开源工具集。利用我们提供的 sass 变量和大量 mixin、响应式栅格系统、可扩展的预制组件、基于 jquery 的强大的插件系统,能够快速为你的想法开发出原型或者构建整个 app 。 --- bootstrap 4.x.x 版本
那么,什么是响应式布局呢?
通俗的理解,就是在不同的屏幕规格上能够有不同的布局效果,比如在大尺寸屏幕上呈现多列的布局,在小尺寸屏幕上呈现不了这么多,可能就只剩下一列布局了。
那么,当屏幕尺寸发生变化时,在不同屏幕规格上,应该呈现怎样的布局,一般是通过媒体查询 @media 来实现,但自己在 css 中书写的话,需要处理较多工作。
所以,也可以选择一些热门的框架,由它来帮忙处理这些响应式布局的工作,就像 bootstrap,但 bootstrap 功能不仅只有响应式功能,它还内置了很多预制组件等等,总之,很强大,虽然我还没用过。
使用
那就来学学如何使用,首先第一步肯定是安装,我直接选择最新版 4.x.x 系列的来作为入手了,旧版本没去了解,有机会再说。
将 bootstrap 引入项目中使用有两种方式:
- 直接使用网上资源
- 将相关资源下载至本地使用
使用网上资源
第一种方式最简单,直接在 html 文档中声明 css 和 js 文件来源即可,如:
<!doctype html> <html lang="en"> <head> <!-- required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- bootstrap css --> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-gn5384xqq1aowxa+058rxpxpg6fy4iwvtnh0e263xmfcjlsawiggfaw/dais6jxm" crossorigin="anonymous"> <title>hello, world!</title> </head> <body> <h1>hello, world!</h1> <!-- optional javascript --> <!-- jquery first, then popper.js, then bootstrap js --> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.slim.min.js" integrity="sha384-kj3o2dktikvyik3uenzmm7kckrr/re9/qpg6aazgjwfdmvna/gpgff93hxpg5kkn" crossorigin="anonymous"></script> <script src="https://cdn.bootcss.com/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-apnbgh9b+y1qktv3rn7w3mgpxhu9k/scqsap7huibx39j7fakfpskvxusvfa0b4q" crossorigin="anonymous"></script> <script src="https://cdn.bootcss.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-jzr6spejh4u02d8jot6vlehfe/jqgirrsqqxsffwpi1mquvdayjuar5+76pvcmyl" crossorigin="anonymous"></script> </body> </html>
使用 bootstrap,上面的 html 文档模板是必须的,带有注释的都是在所有使用了 bootstrap 的页面中需要引入的,需要注意的是,由于 bootstrap 一些组件依赖于 jquery 和 popper,所以需要引入这两份 js,而且顺序是 jquery 先,popper 后,最后再引入 bootstrap 提供的 bootstrap.min.js。
这是第一种方式,也是最省力的。
将资源下载至本地使用
这种方式就比较折腾了,好处就在于资源文件都可以放在自己服务器上,无需依赖他人。下载资源到本地也有两种方式,一是手动到官网下载,下面三个地址:
二是利用一些工具来下载,如 node.js 的 npm 命令来下载,打开终端,进入项目的根目录:
npm init -y
npm install bootstrap
npm install jquery
npm install popper.js --save
如果执行命令过程中报错了,自行去搜索解决吧,我是一次性成功,没出啥问题,都下载结束后,项目里的结构如下,node_modules 文件夹里会有下载好的资源:
package.json 配置项如下:
这是我下载使用的版本。
好,不管是手动去下载,还是接着 npm 下载,最后都需要将下载的资源放进项目中,那么,下载下来的这么多东西,该怎么用,哪些是有用的?
可借鉴上面第一种方式里的 html 文档,总共需要的其实就四份文件:
- bootstrap.min.css
- jquery.slim.min.js
- popper.min.js
- bootstrap.min.js
分别找下四份文件在哪,我的是在这几个路径下:
<!doctype html> <html lang="en"> <head> <!-- required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- bootstrap css --> <link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css"> <title>hello, world!</title> </head> <body> <h1>hello, world!</h1> <!-- optional javascript --> <!-- jquery first, then popper.js, then bootstrap js --> <script src="node_modules/jquery/dist/jquery.slim.min.js"></script> <script src="node_modules/popper.js/dist/popper.min.js"></script> <script src="node_modules/bootstrap/dist/js/bootstrap.min.js"></script> </body> </html>
官方教程说了,上面这是使用 bootstrap 的 html 模板,当然也有进行了解释,下面稍微说说:
<!doctype html>
这是 h5 的 html 文档的声明,不加这句的话,可能会出现一些奇怪的样式;
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
这行代码表示的意思是,让网页可以自动适应当前移动设备的屏幕。
所以,使用 bootstrap 除了需要在 html 文档中引入所需的资源文件外,别忘了加上上面两个处理。
官方示例
bootstrap 4.x.x 版本,官方还没有中文教程,3.x.x 的中文教程倒是很齐全了。但 4.x.x 版本和 3.x.x 版本差别还是蛮大的,首先,4.x.x 选用 sass 来作为预处理器,选择 flex 来实现它的栅格布局系统等等。
反正,bootstrap 本质就就是一个框架,封装了一系列的属性样式、组件给开发者使用,开发者只要了解有哪些属性样式可以用、有哪些组件可以用、效果怎么样、怎么用就可以了,至于这些,就只能是一步步在实际开发中,一边写一边查文档来慢慢积累了。
所以,本篇也就不会去列举各个组件效果、属性样式效果、还一个个去说明怎么用。
接下去的内容,就是想着,能够读懂官方某个示例项目的代码就足够了。
选择了官方的这个示例:album
一步步来读懂它的 html 代码吧:
- 第一步就是 html 的模板了,就上一小节中介绍的,需要进行 h5 声明、meta 声明、引入四个资源文件的那份模板;
- 第二步,来看看 <body> 内的 <header> 代码:
<!doctype html> <html lang="en"> <head> <!-- required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- bootstrap css --> <link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css"> <title>hello, world!</title> </head> <body> <!--header 部分--> <header> <div class="collapse bg-dark" id="navbarheader"> <div class="container"> <div class="row"> <div class="col-sm-8 col-md-7 py-4"> <h4 class="text-white">about</h4> <p class="text-muted">add some information about the album below, the author, or any other background context. make it a few sentences long so folks can pick up some informative tidbits. then, link them off to some social networking sites or contact information.</p> </div> <div class="col-sm-4 offset-md-1 py-4"> <h4 class="text-white">contact</h4> <ul class="list-unstyled"> <li><a href="#" class="text-white">follow on twitter</a></li> <li><a href="#" class="text-white">like on facebook</a></li> <li><a href="#" class="text-white">email me</a></li> </ul> </div> </div> </div> </div> <div class="navbar navbar-dark bg-dark box-shadow"> <div class="container d-flex justify-content-between"> <a href="#" class="navbar-brand d-flex align-items-center"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewbox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="mr-2"><path d="m23 19a2 2 0 0 1-2 2h3a2 2 0 0 1-2-2v8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"></path><circle cx="12" cy="13" r="4"></circle></svg> <strong>album</strong> </a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarheader" aria-controls="navbarheader" aria-expanded="false" aria-label="toggle navigation"> <span class="navbar-toggler-icon"></span> </button> </div> </div> </header> <!-- optional javascript --> <!-- jquery first, then popper.js, then bootstrap js --> <script src="node_modules/jquery/dist/jquery.slim.min.js"></script> <script src="node_modules/popper.js/dist/popper.min.js"></script> <script src="node_modules/bootstrap/dist/js/bootstrap.min.js"></script> </body> </html>
看看效果:
目前的代码里,我们完全没有写过 css,只在 html 文档中,添加了 <header> 标签内容,就能够达到这样的页面效果了,所以,其实,bootstrap 已经封装好了一大堆属性样式,我们只要在标签上通过 class 将这些属性样式应用起来就可以了。
示例中使用的 class 很多,基本都是 bootstrap 封装好的,我也没想把所有用到的都搞清楚具体作用,只是想了解个大概,后续在使用中慢慢积累学习吧。
对于这个 <header> 的效果,我主要想理清楚两点:
- 展开和折叠是怎么实现的?
- 展开时那些列表是如何实现的?
回过头看上面的动图,<header> 部分是作为导航栏,并且存在两种状态,折叠和展开,所以两种状态对应着两个 <div>,<header> 儿子标签里刚好两个 <div>;
看第一个 <div> 的 class:collapse bg-dark
,collapse 是折叠的意思,所以第一个 <div> 就是一开始被折叠的容器,而控制这个 <div> 折叠起来,也就是 bootstrap 提供的 collapse 起的作用了;
同层次的第二个 <div> 的 class:navbar navbar-dark bg-dark box-shadow
,两个 <div> 都有同一个 bg-dark,那么这个其实就是用来设置背景的,因为展开后,其实 <header> 区域是由两个 <div> 拼接起来的,只是背景色刚好一样,看不出来而已。
所以,页面渲染后,其实有个 <div> 被 collapse 折叠起来了,此时页面上只呈现第二个 <div> 内容而已,这个 <div> 的高度等样式由 navbar、navbar-dark、bg-dark 这些决定。
那么,点击完按钮后,第一个 <div> 为什么会被展开了呢?
看一下那个按钮:
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarheader" aria-controls="navbarheader" aria-expanded="false" aria-label="toggle navigation"> <span class="navbar-toggler-icon"></span> </button>
<button> 的子标签 <span> 里的那个 navbar-toggler-icon 就是按钮的 icon,而之所以点击了后可以展开第一个 <div> 就是由其他属性来控制。
首先,需要对当前这个按钮添加 navbar-toggler 的 class,然后需要通过 data-target 指明控制展开的区域,这也是为什么第一个 <div> 中会有一个 id 属性,就是用来给这个按钮控制它的。
所以,梳理一下,通过给 <div> 添加 collapse 的 class 可以让这个区域折叠隐藏起来,然后给它设置一个 id;然后给控制这个折叠区域的按钮添加 data-toggle 和 data-target 属性,通过 id 来控制指定区域的折叠和展开。
至于其他 class 则是各种样式效果。
那么,展开之后的区域里的列表控件上,出现了一些例如:row,col-sm-8 之类的 class,这些又是什么意思呢?
首先,container 来设定区域的大小,row 用来设置这个容器作为 flex 布局,而弹性布局中,一行会被划分成 12 列,看张图:
所以 col-sm-8 表示当显示区域 >= 576px 时,该控件占据 8 列,所以,同一个控件里会出现诸如:col-sm-8 col-md-7
其实就是响应式布局处理,在不同显示区域大小时,呈现不同的大小。
而 py-4 是 pading-top 的意思,-4 表示不同的大小。
offset 表示在一个 12 列的一行里,前面需要空出几列。
总之,官方教程里有对栅格系统 grid 做了详细的介绍,虽然是英文的,慢慢啃吧。
只有理清楚了这篇文章中介绍的 grid,才能够理解,怎么写可以达到响应式的效果。
我们再来看导航栏的一个效果,我再来分析下:
当显示区域逐渐变小时,布局从一行变成了两行,这就是响应式布局,来解释下为什么会有这个行为:
看看这两个区域的代码:
<div class="col-sm-8 col-md-7 py-4"> ... </div> <div class="col-sm-4 offset-md-1 py-4"> ... </div>
上面说过,bootstrap 里的 grid 将每一行划分成 12 列,所以当显示区域大小在 md 范围,即 >= 768px 情况下,第一个 <div> 的 col-md-7 生效,它占据 7 列的宽度,第二个 <div> 的 offset-md-1 和 col-sm-4 都生效,所以它前面空着 1 列的宽度,然后它占据着 4 列的宽度,这加起来是不是刚好 12 列,所以在 >= 768 时,一行可以放下这两个 <div>。
但当显示区域逐渐缩小,当进入 sm 范围,即 >= 576px 时,此时,第一个 <div> 的 col-sm-8 生效,所以它占据 8 列,而第二个 <div> 仍旧是 offset-md-1 和 col-sm-4 生效,那么此时加起来一共 13 列,超过了 12 列,一行里已经不足够放这两个 <div> 了,根据 flex 的弹性布局,此时超过的会自动换行。
以上,就是我对 grid 的理解,也许有误,如果是错的,等后续用熟悉了再回来改,大伙看的时候,就当个借鉴看一看就好了。
分析到这里,大概清楚了 grid 还有导航栏的一些用法了,也大体清楚 bootstrap 的响应式原理好像是基于它的栅格系统,通过为不同控件设置诸如 col-(sm/md/ls/xl)-(1/2/3/4/5/6/7/8/9/10/11/12) 来达到在不同显示区域下,不一样的布局效果,实现响应式布局。
所以,剩余的代码不想看了,头有点懵了,我对 bootstrap 唯一的感觉就是,学习成本好高,它提供太多东西了,封装了太多的样式、控件,反而不知道从哪看。
也许,本来就不需要特意去看,学习 bootstrap 应该是当需要时,再来查阅文档,然后逐步,慢慢积累对 bootstrap 的熟悉程度,而不是一开始就来看细看文档,文档当然要看,但快速过一遍,大概清楚提供了哪些东西就好了。
大家好,我是 dasu,欢迎关注我的公众号(dasuandroidtv),公众号中有我的联系方式,欢迎有事没事来唠嗑一下,如果你觉得本篇内容有帮助到你,可以转载但记得要关注,要标明原文哦,谢谢支持~
上一篇: 谷歌计划提前关闭Google+
下一篇: Java基础入门001 - 简介
推荐阅读
-
前端入门24-响应式布局(BootStrap)
-
.NET Core的响应式框架,基于Ace Admin框架菜单导航,Bootstrap布局,fontAwesome图标,内嵌Iframe用EasyUI做数据绑定,动态配置列表,动态配置表单
-
前端布局分类之静态布局、流式布局、自适应布局、响应式布局、弹性布局教程
-
Bootstrap4响应式布局之栅格系统
-
前端笔记知识点整合之移动端&响应式(中)视口&百分比布局&弹性盒模型&rem&fillpage
-
实习一周,做了公司官网,谈谈关于大学生找实习工作以及记录前端响应式布局开发心得
-
荐 JavaWeb基础之Bootstrap快速入门、响应式布局、常用CSS样式、插件
-
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
-
响应式布局及bootstrap(实例)_html/css_WEB-ITnose
-
前端之响应式布局