声明
Bootstrap 中文网 http://www.bootCSS.com/
感谢大佬们的分享.
正文 - 响应式布局 (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.
这是第一种方式, 也是最省力的.
将资源下载至本地使用
这种方式就比较折腾了, 好处就在于资源文件都可以放在自己服务器上, 无需依赖他人. 下载资源到本地也有两种方式, 一是手动到官网下载, 下面三个地址:
下载 Bootstrap
下载 jQuery https://jquery.com/download/
下载 popper
二是利用一些工具来下载, 如 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 https://v4.bootcss.com/docs/4.0/examples/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 https://getbootstrap.com/docs/4.0/layout/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), 公众号中有我的联系方式, 欢迎有事没事来唠嗑一下, 如果你觉得本篇内容有帮助到你, 可以转载但记得要关注, 要标明原文哦, 谢谢支持~
来源: https://www.cnblogs.com/dasusu/p/10116533.html