赞
踩
Bootstrap 读音 /ˈbu:tstræp/ ,是一个非常受欢迎的前端框架,官方网站将其描述为。
简单的理解
Bootstrap原名Twitter Blueprint,由Twitter公司的Mark Otto和Jacob Thornton编写。
他们的本意是想制作一套可以让网页保持统一风格的前端框架。
在Bootstrap之前,Twitter团队在开发界面时,不同的项目组会使用不同的代码库。这样就会很容易导致界面风格不一致等问题,从而增加了后期的维护成本。
Mark Otto发现自己设计的工具比别人设计的更强大,能够做更多的事情。几个月之后,Mark Otto和一群开发人员做出了Bootstrap的原型。然后经过他们开发小组几个月之后的努力,大家把Twitter Blueprint改名为Bootstrap。
在2011年8月19日将其作为开源项目发布。项目由Mark Otto、Jacob Thornton和核心开发小组维护。
在2012年1月31日发布Bootstrap 2,增加了十二列网格系统和响应式组件,并对许多组件进行了修改。
在2013年8月19日发布Bootstrap 3,开始将移动设备优先作为方针,并且开始使用扁平化设计,支持IE8-9。
在2018年1月7日发布Bootstrap 4,增加了Flexbox Grid、Cards、Spacing Utilities等。
在2021年5月5日发布Bootstrap 5,增强Grid System、增强Form elements、Not Support for IE、Bootstrap Icons等
优点
缺点
总结:Bootstrap很容易上手,并且也有非常完整的中文文档;Bootstrap使用 jQuery 与HTML 交互。对于初学者来说,它将是一个不错的入门方式。 同时Bootstrap框架优秀的设计和架构思想也是非常值得学习。
Bootstrap 是一个前端框架。
Bootstrap的内容组成,不同的下载文件,包含的内容也不一样
Bootstrap框架的CDN地址
HTML中引入之后,添加重要的全局配置
<!DOCTYPE html>
添加视口(viewport)
Bootstrap 采用的是移动设备优先(mobile first) 的开发策略,为了网页能够适配移动端的设备,需在 <head>
标签中添加viewport(视口)。
在移动端会把 layout viewport 的宽度设置为设备的宽,并且不允许用户进行页面的缩放。
<meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no,maximum-scale=1.0,minimum-scale=1.0,shrink-to-fit=no">
示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- safari 9+ --> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0, shrink-to-fit=no"> <title>Document</title> <!-- 引入Bootstrap框架中的CSS文件: box-size:border-box --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css"> </head> <body> <h1 class="text-left border border-primary">Hello Bootstrap</h1> <!-- Bootstrap5 之前需要依赖jQuery库 ,故需要引入JQ库--> <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script> <!-- 引入Bootstrap的JS文件 --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script> </body> </html>
Bootstrap框架的下载
添加重要的全局配置
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0, shrink-to-fit=no"> <title>Document</title> <!-- 引入 Bootstarp中的CSS文件 --> <link rel="stylesheet" href="../libs/bootstrap-4.6.1/css/bootstrap.css"> </head> <body> <h1 class="float-right">hello Bootstrap</h1> <script src="../libs/jquery/jquery-3.6.0.js"></script> <!-- bundle.js分成下面两部分 popper.js bootstrap.js --> <script src="../libs/bootstrap-4.6.1/js/bootstrap.bundle.js"></script> </body> </html>
需求:开发两个按钮,一个天空蓝的按钮和一个橙色的按钮。
下面将使用两种方式实现:
(1) 用CSS来开发
<style> .btn{ width: 60px; line-height: 40px; color: white; text-align: center; } .btn-cirlce{ border-radius: 4px; } .btn-primary{ background-color: skyblue; } .btn-warning{ background-color: orange; } .btn-default{ background-color: #cdcdcd; } </style> <body> <div class="btn btn-cirlce btn-primary">按钮1</div> <div class="btn btn-cirlce btn-warning">按钮2</div> <div class="btn btn-cirlce btn-default">按钮2</div> </body>
(2) 用Bootstrap框架
<!-- 引入 Bootstarp中的CSS文件 -->
<link rel="stylesheet" href="../libs/bootstrap-4.6.1/css/bootstrap.css">
<body>
//只需添加对应的类名,即可实现样式
<div class="btn btn-primary">按钮1</div>
<div class="btn btn-warning">按钮2</div>
<button class="btn btn-info">按钮3</button>
//引入jQ库文件
<script src="../libs/jquery/jquery-3.6.0.js"></script>
//引入Bootstap的JS文件
<script src="../libs/bootstrap-4.6.1/js/bootstrap.bundle.js"></script>
</body>
补充:Bootstrap4 框架设计图
Containers容器是 Bootstrap中最基本的布局元素,并且该布局支持响应式。在使用默认网格系统时是必需的。
Containers容器用于包含、填充,有时也会作为内容居中使用。容器也是可以嵌套,但大多数布局不需要嵌套容器。
Bootstrap 带有三个不同的Containers容器:
.container
: 它在每个断点处会设置不同的max-width。.container-fluid
:在所有断点处都是 width: 100%。.container-{breakpoint},
默认是width: 100%,直到指定断点才会修改为响应的值。在开发一个页面时,经常会遇到一些列表(例如,商品列表),这些列表通常都是通过行和列来排版。
网格系统是什么?
如何使用网格系统?
比如,使用Boostrap来实现一行3列的布局。
<!-- 引入 Bootstarp中的CSS文件 --> <link rel="stylesheet" href="../libs/bootstrap-4.6.1/css/bootstrap.css"> <style> .container{ background-color: pink; } .item{ height: 40px; border: 1px solid red; } </style> <body> <div class="container"> <!-- 【其类名的实际css样式如下】 display: flex flex-wrap:wrap --> <div class="row"> <!-- 【其类名的实际css样式如下】 flex item: flex-grow: 1 --> <div class="col item">1</div> <div class="col item">2</div> <div class="col item">3</div> </div> </div> </body>
从Bootstrap2开始,网格系统从16 列转向12列网格,原因之一是12列比以前的16列系统更灵活。
将一个容器(row)被划分为12列网格,具有更广泛的应用,因为 12 可以被 12、6、4、3、2 、1整除,而 16列网格只能被 16、8、4 、2、1 整除,所以12列网格能够在一行中表示更多种列数组合情况。
12列网格这意味着可将一行分解为12、6、4、3、2和1份:
网格系统是有container、row、col三部分组成,底层使用flexbox来布局,并且支持12列网格布局。
container
或container-fluid
是布局容器,网格系统中必用的容器(该容器也会应用在:内容居中或作为包含其它内容等)。
row
是网格系统中的每一行,row是存放在container容器中。如果指定列宽,那么一行最多可以存放12列,超出列数会换行。
【row左右-15px的外边距margin,是用来抵消container容器15px内边距,实现row左右边缘和容器左右边缘对齐。可以理解为复制粘贴,大小尺寸一模一样】
col
是网格系统的每一列,col是存放在row容器中
Bootstrap的网格系统是可以支持嵌套的,例如:
一个案例: 用指定列宽( 语法:col-{number} ) 的方式来实现一行8列的布局
<link rel="stylesheet" href="../libs/bootstrap-4.6.1/css/bootstrap.css"> <style> .container{ background-color: pink; } .item{ height: 40px; border: 1px solid red; } </style> <body> <!-- 方式一 flex:列宽是自动拉伸,并且每列的宽度是相等的【等列宽】 --> <div class="container"> <div class="row"> <div class="col item">1</div> <div class="col item">2</div> <div class="col item">3</div> <div class="col item">4</div> <div class="col item">5</div> <div class="col item">6</div> <div class="col item">7</div> <div class="col item">8</div> </div> </div> <!-- 方式二: 指定列宽 --> <div class="container"> <div class="row"> <div class="col-6 item"> <!-- 嵌套网格系统( 嵌套的时候是可以省略container ) --> <div class="row"> <div class="col-3 item">1</div> <div class="col-3 item">2</div> <div class="col-3 item">3</div> <div class="col-3 item">4</div> </div> </div> <div class="col-6 item"> <!-- ( 嵌套的时候是可以省略container ) --> <div class="row"> <div class="col-3 item">1</div> <div class="col-3 item">2</div> <div class="col-3 item">3</div> <div class="col-3 item">4</div> </div> </div> </div> </div> </body>
col
: 等列宽(Equal-width)。 底层代码是 flex-grow: 1, max-width: 100%。该类网格系统仅用flexbox布局。
【可以理解为,每行的每个元素宽度相等,总宽度被平分】
<link rel="stylesheet" href="../libs/bootstrap-4.6.1/css/bootstrap.css"> <style> .container{ background-color: pink; } .item{ height: 40px; border: 1px solid red; } </style> <body> <!-- 网格系统-等列宽- flex-grow:1 --> <div class="container"> <div class="row"> <div class="col item">1</div> <div class="col item">2</div> <div class="col item">3</div> <div class="col item">4</div> <div class="col item">5</div> <div class="col item">6</div> <div class="col item">7</div> <div class="col item">8</div> <div class="col item">9</div> <div class="col item">10</div> <div class="col item">11</div> <div class="col item">12</div> <div class="col item">13</div> <div class="col item">13</div> <div class="col item">13</div> <div class="col item">13</div> <div class="col item">13</div> <div class="col item">13</div> <div class="col item">13</div> </div> </div> </body>
col-auto
: 列的宽为auto ,自动列宽,随着填充内容的大小变化 。其底层代码是 flex: 0 0 auto; width: auto
<!-- 网格系统-等列宽- flex-grow:1 -->
<div class="container">
<div class="row">
<!-- 随着内容的宽度变化。 其余等列宽度均分 =(总宽度-自动列宽)/剩余列的数量-->
<div class="col-auto item">auto layout layout layout </div>
<div class="col item">1</div>
<div class="col item">2</div>
<div class="col item">3</div>
</div>
</div>
col-{num}
: 指定某个列的宽(支持12列网格) 其底层代码是 flex: 0 0 x%,max-width: x%。
num的范围是1~12。比如说,col-2,意味着,这个元素的宽度占这一行宽度的2/12,也就是1/6.
<!-- 网格系统-等列宽- flex-grow:1 --> <div class="container"> <div class="row"> <!-- flex: 0 0 xx%; 超过12列就会自动换行,可以理解为分子累加超过12--> <div class="col-1 item">1/12</div> <div class="col-2 item">2/12</div> <div class="col-3 item">3/12</div> <div class="col-6 item">6/12</div> <div class="col-1 item">1/12</div> <div class="col-1 item">1/12</div> <div class="col-1 item">1/12</div> </div> <div class="row"> <!-- flex: 0 0 xx%; --> <div class="col-1 item">1/12</div> <div class="col-2 item">2/12</div> <div class="col-3 item">3/12</div> <div class="col-6 item">6/12</div> </div> </div>
运行效果如下图
5个断点(Breakpoints) : none(xs) : <576px 、sm : >=576px、 md : >=768px、 lg : >=992、 xl : >=1200px
响应式列布局的类
比如一个需求:开发响应式列表,xl屏幕显示6列,在lg屏幕显示4列,在md屏幕显示3列,在sm屏幕显示2列,特小屏(none)显示1列。
<!-- 网格系统 -->
<div class="container">
<div class="row">
<div class="col-12 col-sm-6 col-md-4 col-lg-3 col-xl-2 item">1</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 col-xl-2 item">2</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 col-xl-2 item">3</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 col-xl-2 item">4</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 col-xl-2 item">5</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 col-xl-2 item">6</div>
</div>
</div>
在开发响应式页面时,可能会有这样的需求:
Bootstrap的响应式工具类-Display
如何使用响应工具类(display)?
不同作用的类名
需求实现:
<h1 class="d-none d-lg-block">某个元素只在lg(>=992px) 和 xl 屏显示</h1>
<!-- 理解为,这个元素本身是隐藏的,然后屏幕分辨率满足lg、xl条件时显示 -->
<h1 class="d-block d-lg-none">某个元素只在lg(>=992px) 和 xl 屏隐藏</h1>
<!-- 理解为,这个元素本身是显示的,然后屏幕分辨率满足lg、xl条件时隐藏 -->
<h1 class="d-block d-md-none d-lg-block">某个元素只在 md(>=768px) 屏隐藏;</h1>
<!-- 理解为,这个元素本身是显示的,然后屏幕分辨率满足md条件时隐藏 -->
快速浮动(Float)
文本(Text)
边框
截断文本 : text-truncate
屏幕阅读器的适配(专门针对残障人士设备的适配)
增强可访问性的辅助类(针对残障人使用的设备的适配,同时增强语义化)
访问官网 https://getbootstrap.com/docs/5.3/components/accordion/
可以复制其中的组件代码体验,前提是安装好Bootstrap
前提,导入Bootstrap库以及JQ库。
效果图如下
<!-- 1.导航栏 --> <nav class="navbar navbar-expand-lg"> <div class="container-fluid"> <!-- logo --> <a class="navbar-brand" href="#"> <img class="logo" src="./img/logo.png" alt=""> </a> <!-- 按钮 <=992才会显示出来 --> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"> <img class="expand-icon" src="./img/show-icon.png" alt=""> </button> <!-- 导航列表 --> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav mr-auto"> <!-- 使用自定义的样式 --> <li class="text-link active"> <span>首页</span> </li> <li class="text-link"> <span>API</span> </li> <li class="text-link"> <span>解决方案</span> </li> <li class="text-link"> <span>案例</span> </li> <li class="text-link"> <span>新闻</span> </li> <li class="text-link"> <span>关于我们</span> </li> </ul> <p class="text-link hot-line"> <span>咨询热线:4009910008</span> </p> </div> </div> </nav>
HTML代码
<!-- 2.轮播图 --> <!-- data-ride="carousel" 当页面加载完成之后 录播图自动轮播 --> <div id="carouselExampleIndicators_liujun" class="carousel slide"> <!-- 指示器 --> <ol class="carousel-indicators"> <li data-target="#carouselExampleIndicators_liujun" data-slide-to="0" class="active"></li> <li data-target="#carouselExampleIndicators_liujun" data-slide-to="1"></li> <li data-target="#carouselExampleIndicators_liujun" data-slide-to="2"></li> </ol> <!-- 轮播图的图片 --> <div class="carousel-inner"> <!-- 改为js动态加载图片 <div class="carousel-item active"> <img src="./img/banner0.png" class="d-block w-100" alt="..."> </div> <div class="carousel-item"> <img src="./img/banner1.png" class="d-block w-100" alt="..."> </div> <div class="carousel-item"> <img src="./img/banner2.png" class="d-block w-100" alt="..."> </div> --> </div> <!-- 分页:上一张 下一张 --> <button class="carousel-control-prev" type="button" data-target="#carouselExampleIndicators_liujun" data-slide="prev"> <span class="carousel-control-prev-icon"></span> </button> <button class="carousel-control-next" type="button" data-target="#carouselExampleIndicators_liujun" data-slide="next"> <span class="carousel-control-next-icon"></span> </button> </div>
JS代码
$(function() { var currentImg = 'none' // none big small // 1.准备数据 var banners = [ { id:0, bigUrl: './img/banner0.png', smUrl: './img/banner0_sm.png' }, { id:0, bigUrl: './img/banner1.png', smUrl: './img/banner1_sm.png' }, { id:0, bigUrl: './img/banner2.png', smUrl: './img/banner2_sm.png' } ] // renderBanner(banners) //加入了之前写的节流函数 $(window).on('resize',throttle( function() { // console.log( $(this).outerWidth() ) // border + paddig + content var winWidth = $(this).outerWidth() var isBigScreen = winWidth >= 768 if(currentImg === 'none'){ // 调取这个函数来渲染界面 renderBanner(banners, isBigScreen) } if(currentImg === 'big' && !isBigScreen) { //当前为大屏,要变为小屏 renderBanner(banners, isBigScreen) } if(currentImg === 'small' && isBigScreen) { //当前为小屏,要变为大屏 renderBanner(banners, isBigScreen) } })) $(window).trigger('resize') function renderBanner(banners = [], isBigScreen) { currentImg = isBigScreen ? 'big' : 'small' // 先把之前的定时器停掉 $('.carousel').carousel('dispose') var banneHtmlString = '' // 2.将数据渲染到页面上 banners.forEach(function(item, index) { var active = index === 0 ? 'active' :'' var imgUrl = isBigScreen ? item.bigUrl: item.smUrl banneHtmlString +=` <div class="carousel-item ${active}" data-interval="3000"> <img src="${imgUrl}" class="d-block w-100" alt="..."> </div> ` }) $('.carousel-inner').empty().append(banneHtmlString) // 自动录播( 开始一个定时器 ) $('.carousel').carousel('cycle') } })
补充:节流函数代码
function throttle(fn, interval = 400, options = { leading: true, trailing: true }) { // 1.记录上一次的开始时间 const { leading, trailing } = options let lastTime = 0 let timer = null // 2.事件触发时, 真正执行的函数 const _throttle = function(...args) { // 2.1.获取当前事件触发时的时间 const nowTime = new Date().getTime() if (!lastTime && !leading) lastTime = nowTime // 2.2.使用当前触发的时间和之前的时间间隔以及上一次开始的时间, 计算出还剩余多长事件需要去触发函数 const remainTime = interval - (nowTime - lastTime) if (remainTime <= 0) { if (timer) { clearTimeout(timer) timer = null } // 2.3.真正触发函数 fn.apply(this, args) // 2.4.保留上次触发的时间 lastTime = nowTime return } if (trailing && !timer) { timer = setTimeout(() => { timer = null lastTime = !leading ? 0: new Date().getTime() fn.apply(this, args) }, remainTime) } } return _throttle }
HTML代码
<!-- 3.目标客户 --> <div class="target-customer"> <!-- 在小屏上是不可见 --> <h1 class="title text-center d-none d-md-block">目标客户</h1> <!-- 网格系统性 --> <div class="container-fluid"> <div class="row"> <div class="col-md-6 col-xl-3 item"> <img class=" d-none d-md-block" src="./img/target-1.png" alt=""> <div class="sub-title">电子银行</div> <div class="desc text-center"> <p>助力五大行、商业银行、城商行、农商行、农信社等</p> <p>手机银行与直销银行APP消费场景升级</p> </div> </div> <div class="col-md-6 col-xl-3 item"> <!-- 在小屏上是不可见 --> <img class=" d-none d-md-block" src="./img/target-2.png" alt=""> <div class="sub-title">金服平台</div> <div class="desc text-center"> <p>助力钱包、小贷、基金、保险、信托、证券等</p> <p>金融服务平台APP 消费场景升级</p> </div> </div> <div class="col-md-6 col-xl-3 item"> <img class=" d-none d-md-block" src="./img/target-3.png" alt=""> <div class="sub-title">企业福利</div> <div class="desc text-center"> <p>助力国有、私营、外资、人力资源公司等</p> <p>企业报销与福利系统消费场景升级</p> </div> </div> <div class="col-md-6 col-xl-3 item"> <img class=" d-none d-md-block" src="./img/target-4.png" alt=""> <div class="sub-title">智能终端</div> <div class="desc text-center"> <p>助力机器人、汽车中控、电子屏、商用电视等</p> <p>人工智能语音消费场景升级</p> </div> </div> </div> </div> </div>
CSS代码。因为bootstrap没有符合的,所以定制
.target-customer{ min-height: 265px; background-color: var(--bg-target-color); } .target-customer .title{ height: 80px; line-height: 80px; font-size: 30px; color: var(--title-color); font-weight: normal; } .target-customer .row .item{ display: flex; justify-content: center; align-items: center; height: 135px; cursor: pointer; overflow: hidden; } .target-customer .sub-title{ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 24px; color: var(--title-color); transition: top 0.6s ease; } .target-customer .desc{ position: absolute; top: 125%; left: 50%; width: 100%; opacity: 0; transform: translate(-50%, -50%); transition: top 0.6s ease; } @media (min-width: 768px){ .target-customer .row .item:hover .sub-title{ top: 35%; } .target-customer .row .item:hover .desc{ top: 73%; opacity: 1; } } @media (max-width: 768px){ .target-customer .sub-title{ top: 40%; font-size: 16px; } .target-customer .desc{ top: 75%; opacity: 1; font-size: 14px; } .target-customer .row .item:nth-child(odd){ background-color: white; } .target-customer .row .item:nth-child(even){ background-color: var(--bg-target-color); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。