本篇内容摘抄自如下两个来源:css
感谢大佬们的分享。html
此次想来说讲一个前端开发框架:BootStrap前端
BootStrap 目前已经出了 4 个版本,每一个版本都有对应的官网教程,先来看看不一样版本里的宣传语:node
简洁、直观、强悍的前端开发框架,让web开发更迅速、简单。--- BootStrap 2.x.x 版本jquery
Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。 --- BootStrap 3.x.x 版本git
Bootstrap 是全球最受欢迎的前端组件库,用于开发响应式布局、移动设备优先的 WEB 项目。github
Bootstrap 是一套用于 HTML、CSS 和 JS 开发的开源工具集。利用咱们提供的 Sass 变量和大量 mixin、响应式栅格系统、可扩展的预制组件、基于 jQuery 的强大的插件系统,可以快速为你的想法开发出原型或者构建整个 app 。 --- BootStrap 4.x.x 版本web
那么,什么是响应式布局呢?npm
通俗的理解,就是在不一样的屏幕规格上可以有不一样的布局效果,好比在大尺寸屏幕上呈现多列的布局,在小尺寸屏幕上呈现不了这么多,可能就只剩下一列布局了。json
那么,当屏幕尺寸发生变化时,在不一样屏幕规格上,应该呈现怎样的布局,通常是经过媒体查询 @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 文档,总共须要的其实就四份文件:
分别找下四份文件在哪,个人是在这几个路径下:
<!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 代码吧:
<!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),公众号中有个人联系方式,欢迎有事没事来唠嗑一下,若是你以为本篇内容有帮助到你,能够转载但记得要关注,要标明原文哦,谢谢支持~