Jump Start Bootstrap 中文版 第5章

第5章 深入了解:自定义Bootstrap


想象一下,一个网站,所有的网站都是用Bootstrap构建的,看起来和感觉都一样。无聊,对吧?幸运的是,我们有能力改变我们使用的任何框架的默认样式。

许多Bootstrap的组件和插件都有自己的默认样式。为了给他们一个特别的体验,你需要替换他们的CSS规则并定义你的自己的。

在第一章,我和大家分享了一些建立在Bootstrap上的流行网站。它们都有自定义的Bootstrap的CSS,以使它们的模板看起来独一无二且美观。

在本章中,我们将讨论可以完全自定义Bootstrap默认样式的各种方法,并分析哪种方法更可取,为什么。最后,我们将尝试理解Bootstrap的CSS是如何编写的,使它成为一个高度响应的框架。

自定义Bootstrap样式


您可以通过各种方式自定义引导程序。在本节中,我们将通过静态CSS文件和较少的文件进行自定义。

什么是Less?

Less是一个CSS预处理器,它扩展了CSS功能,添加了诸如变量、混合、函数等编程特性。
它保持CSS模块化、可维护和可扩展。
更少的文件被编译来生成CSS文件,然后你可以在你的项目中使用。

如果你使用Ruby,Sass是一个替代选择。
它也是一个CSS预处理器,Bootstrap支持;然而,我们不会在本书中涵盖Sass的定制。

带有Bootstrap默认包的样式表是普通的CSS文件。如果您使用文本编辑器打开静态CSS文件,您将发现许多选择器及其相关的CSS属性。您可能会倾向于在这些文件中直接更改CSS属性及其值,以节省时间,但我强烈建议您不要使用它!

直接修改CSS文件有很多缺点。尤其是下列一些:
1、这些变化是不可逆的。您将不记得最初出现的CSS属性和它们的值,因此您将无法还原回原来的引导样式。
2、您对一个选择器所做的任何更改可能会破坏Bootstrap的响应性。
3、调试变得非常困难;您需要了解CSS继承链来到达父选择器。

在我们进入定制阶段之前,让我们首先来建立本章中将要使用的项目。和往常一样,我们将使用在第1章中创建的项目Bootstrap_demos。将所有内容复制到一个名为Chapter_5的新文件夹中。并更改index.html页面标题为“Customizing Bootstrap”。现在将<h1>标记从<body>中删除。

使用CSS自定义Bootstrap

这种类型的定制通常被称为覆盖默认的CSS。我们实际上用我们自己的自定义值覆盖了一些Bootstrap的CSS属性。

首先,我们在/css文件夹中创建一个名为app.css(或任何你想要的)的新文件。然后我们打开index.html并链接到新的CSS文件。这个新CSS文件的链接应该包含在Bootstrap的CSS文件的链接下面:

<link rel="stylesheet" type="text/css" href="css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="css/app.css">

让我们添加一个Bootstrap按钮,如图5.1所示。

<div class="container">
<a href="#" class="btn btn-primary btn-lg">Big Fat Button</a>
</div>
Figure
图5.1

我们将使用它展示如何对其默认设计进行一些更改:
1、从这个按钮上删除圆角
2、改变填充量
3、调整字体大小
4、改变背景颜色

让我们使用开发工具来检查这个按钮。我们将使用Chrome,如图5.2所示,但是您可以使用任何类似的工具,比如Firefox中的Firebug。填充、字体大小和边界半径等属性来自btn类,而属性背景则应用于类btn-primary。要修改它们,我们需要在CSS文件app.css中使用相同的选择器重写属性。

图5.2

打开app.css加入下列CSS代码:

.btn{
border-radius: 0;
padding: 5px 10px;
font-size: 16px;
}
.btn-primary{
background: #63AEF0;
}

如果我们刷新页面,我们的按钮应该看起来像图5.3。

图5.3

注意,我们使用了Bootstrap类btn和btn - primary来覆盖CSS样式。从此以后,每当您使用Bootstrap的按钮组件时,它将会有一个类似于图5.3的更改样式。要还原回原来的样式,我们只需从app. CSS文件中删除CSS样式。

如果您想要更改web页面中仅一个特定按钮的样式,而不是针对Bootstrap的选择器,请使用ID来应用CSS更改。



使用Less自定义Bootstrap


如果您是一个Less的开发人员,您将喜欢这个部分,因为有很多选择,可以使用Less的自定义Bootstrap。每个Bootstrap组件都可以轻松地更改它们的属性。要访问所有Less文件,您需要下载一个特定版本的Bootstrap。请登录http://getbootstrap.com/docs/3.3/getting-started/#download并点击[Download source]按钮(选择下载源代码)。这个源代码包包含编译后的和原始的Less文件。【注:在翻译这本书的时候,Bootstrap已经推出了v4.0.0-beta版本,但建议在推出稳定版本后再去用于实际项目】

Less文件位于Less文件夹内。在这里,你会发现很多根据Bootstrap的组件命名的.less文件。所有与特定组件相关的CSS属性和值都存在于相应的.less文件中。您还将找到一个bootstrap.less,这是.less主文件。它包含了该文件夹中的所有的less文件。您只需要编译此文件就可以生成定制的Bootstrap样式。让我们把这个文件夹里的所有文件分类。

Bootstrap的Variables和Mixins

所有Bootstrap中使用到的变量和混入分别放在两个文件中:

1、variables.less 包含了Bootstrap中使用的全部标准颜色,默认的响应宽度值、默认填充值和边界值。如果你想做任何这样的改变,你需要处理这个文件。
2、mixins.less 包含用于生成前缀的混入,并动态计算网格的宽度、占位符、按钮大小等。

复位文件

这里有两个复位文件去清除浏览器的默认值:

  1. normalize.less清除了许多浏览器默认设置如字体,字体大小,填充和边距,标题标签设置,表单元素的样式,等等。

2、print.less包含打印支持媒体查询。

核心文件

这里有七个核心文件
1、scaffolding.less包含所有辅助类的图像(如img响应。IMG圈),对各种状态的链接元素,风格水平规则,屏幕阅读方式,等等。
2、type.less是一个排版文件,它包含了标题标签、段落标记和其他与内容相关的助手类的样式,例如.lead、.text-muted等等。
3、code.less包含CSS属性,用于样式化web页面上的任何代码。
4、grid.less涉及到在Bootstrap网格系统上应用的所有CSS值。
5、tables.less用于装饰<table>元素的样式。它还为诸如此类的表定义各种助手类,例如:table-condensed。table-bordered等等。
6、forms.less美化窗体元素,如文本框、复选框、单选按钮等等。
7、buttons.less包含各类Bootstrap按钮风格造型。这里定义了所有与按钮相关的类。

组件文件

这里有Bootstrap的21个组件文件;前一章所涵盖的每个组件都有自己的文件。与组件相关的所有CSS定义都可以在其对应的less文件中找到。
■ component-animations.less
■ glyphicons.less
■ dropdowns.less
■ button-groups.less
■ input-groups.less
■ navs.less
■ navbar.less
■ breadcrumbs.less
■ pagination.less
■ pager.less
■ labels.less
■ badges.less
■ jumbotron.less
■ thumbnails.less
■ alerts.less
■ progress-bars.less
■ media.less
■ list-group.less
■ panels.less
■ wells.less
■ close.less

这个列表中还有一个文件,实际上它本身不是一个组件,close.less。它包含了将用于模式按钮的CSS规则,警报,以及关闭此特定组件的其他元素。

插件文件

这里有四个.less文件定义了通过引导标记触发或创建的JavaScript插件的CSS样式:
■ modals.less
■ tooltip.less
■ popovers.less
■ carousel.less

实用程序文件

最后,我们在Bootstrap中有两个实用程序文件
■ utilities.less
■ responsive-utilities.less

这些文件定义了帮助我们更好地组织Bootstrap组件的类。它们帮助其他类,比如.clearfix从它周围的所有元素中清除一个组件。.hide和 .show用来切换组件可见性。例如,responsive-utilities.less包含visible-lg .hidden-sm这样的可见性实用工具。



使用Less覆盖样式


让我们使用Less覆盖模式对话框的样式。我们将自定义modals.less,提供一个扁平化设计,去掉圆角,减少阴影。我们也将改变模式对话框的背景颜色和字体颜色,让我们打开modals.less并做这些改变。

模式对话框的圆角是通过类modal-content提供的。让我们在modals.less找到这个选择器。应该是这样的:

// Actual modal
.modal-content {
position: relative;
background-color: @modal-content-bg;
border: 1px solid @modal-content-fallback-border-color;
➥//old browsers fallback (ie8 etc)
border: 1px solid @modal-content-border-color;
border-radius: @border-radius-large;
.box-shadow(0 3px 9px rgba(0,0,0,.5));
background-clip: padding-box;
// Remove focus outline from opened modal
outline: 0;
}

从这代码中,我们可以看见圆角由属性border-radius设定,它的值是作为一个Less变量在variables.less中初始化的。让我们注释这一行来去除圆角。

// Actual modal
.modal-content {
position: relative;
background-color: @modal-content-bg;
border: 1px solid @modal-content-fallback-border-color;
➥//old browsers fallback (ie8 etc)
border: 1px solid @modal-content-border-color;
// border-radius: @border-radius-large;
.box-shadow(0 3px 9px rgba(0,0,0,.5));
background-clip: padding-box;
// Remove focus outline from opened modal
outline: 0;
}

现在,我们来减少阴影。分析代码,我们可以看到.box-shdow()混入是在CSS中产生阴影属性的原因。这个混入只定义在mixins.less文件中的,阴影的参数被传给这个混入。让我们根据我们的要求改变这个值。阴影效果是由参数的第三项设定的,当前值是9px。让我们把这个值减少到2px。因此,我们的选择器现在应该如下所示:

// Actual modal
.modal-content {
position: relative;
background-color: @modal-content-bg;
border: 1px solid @modal-content-fallback-border-color;
➥//old browsers fallback (ie8 etc)
border: 1px solid @modal-content-border-color;
border-radius: @border-radius-large;
.box-shadow(0 3px 2px rgba(0,0,0,.5));
background-clip: padding-box;
// Remove focus outline from opened modal
outline: 0;
}

我们还需要更改媒体查询属性(media queries)中的box-shadow值,该查询覆盖了前面的更改。我们很快将学习媒体查询。不过现在,你需要理解的是Bootstrap 对于不同大小的设备有不同的CSS规则。让我们继续,并在modals.less中找到媒体查询属性(@media):

// Scale up the modal
@media (min-width: @screen-sm-min) {
// Automatically set modal's width for larger viewports
.modal-dialog {
width: @modal-md;
margin: 30px auto;
}
.modal-content {
.box-shadow(0 5px 15px rgba(0,0,0,.5));
}
// Modal sizes
.modal-sm { width: @modal-sm; }
}

让我们在媒体查询中给box-shadow定义一个新的值传递给.box-shadow()混入:

// Scale up the modal
@media (min-width: @screen-sm-min) {
// Automatically set modal's width for larger viewports
.modal-dialog {
width: @modal-md;
margin: 30px auto;
}
.modal-content {
.box-shadow(0 5px 2px rgba(0,0,0,.5));
}
// Modal sizes
.modal-sm { width: @modal-sm; }
}

让我们改变模式对话框的背景颜色。我们将使用一个在variables.less中预定义的变量@brand-info设置模式对话框的背景颜色。这个变量初始化为#5bc0de,是淡蓝色的。文字颜色,让我们在同一文件中使用设置为#fff的@body-bg参数。现在,修改后的modal-content选项卡将如下所示:

// Actual modal
.modal-content {
position: relative;
background-color: @modal-content-bg;
border: 1px solid @modal-content-fallback-border-color;
➥//old browsers fallback (ie8 etc)
border: 1px solid @modal-content-border-color;
border-radius: @border-radius-large;
.box-shadow(0 3px 9px rgba(0,0,0,.5));
background-clip: padding-box;
// Remove focus outline from opened modal
outline: 0;
background: @brand-info;
color: @body-bg;
}

我们已经完成了所有定制的计划,但我们最后还需要修改modal-backdrop选择器。modal-backdrop是一个透明层,当模式对话框组件被触发时,它将出现在modal-content后面。

让我们把modal-background的背景色从黑变成白:

// Modal background
.modal-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: @zindex-modal-background;
background-color: @body-bg;
// Fade for backdrop
&.fade { .opacity(0); }
&.in { .opacity(@modal-backdrop-opacity); }
}

最后,我们完成了全部的自定义,是时候去编译bootstrap.less导入modals.less了。一旦这个.less文件被编译去生成Bootstrap.css,你可以在你的项目中替换旧的Bootstrap.css(我们将在下节讨论如何编译Less文件)。从此,无论何时你使用模式对话框,它都将使用自定义样式。图5.4是显示定制模式组件的屏幕截图。

图5.4



编译Less


编译Less是相对简单的。在这里,我将向你们展示一些标准的方法。

使用Node

如果你已经安装了Node,你可以用Node的包管理工具(npm)来安装less编译器.

一旦less编译器安装完毕,使用下面的命令去把bootstrap.less编译成bootstrap.css.你需要在命令行工具中切换到/less目录,然后输入命令:
$ lessc bootstrap.less > bootstrap.css

使用第三方软件

这里有一些可视化的第三方软件用于编写和编译Less代码。比较流行的有Crunch!, SimpLESS,Mixture。【注:在window下可以使用WinLess】



在下载前自定义Bootstrap


是的,你没有听错,Bootstrap允许你编辑和旋转这些你希望出现在你自己的自定义Bootstrap包中的功能。

这是每一个Less变量边上都有一个字段,所以如果你不知道如何去使用Less,你可以使用这个表单去编辑默认值。每一个Bootstrap组件和插件也都有一个多选框。如图5.5所示,你可以不选择你不需要使用的。

图5.5

不选择特定的组件可能也会关联取消选择有依赖关系的组件。例如,在自定义页面上不选择Forms(表单)也将自动不选择Input groups(输入组件)和Navbar(导航条)。因此,选择时要小心。
【注:Bootstrap 3.3版本的自定义页面的链接是http://getbootstrap.com/docs/3.3/customize/



媒体查询(Media Queries)和Bootstrap


媒体查询被作为CSS3的一部分引入,用来根据屏幕分辨率动态控制网站内容。它是今天可用的每一个响应框架下的关键技术之一。Bootstrap使用媒体查询来正确定义许多CSS规则,使之成为响应框架。

如果想自定义Bootstrap的响应网格系统,理解媒体查询是很重要的。让我们来看一个简单的媒体查询:

@media all and (min-width: 699px){
h1{
display: none;
}
}

每个媒体查询都应该有一个媒体类型和一个表达式。媒体类型指定链接文档将显示在什么类型的设备上。在这里,媒体类型是全部。该表达式使用媒体特性进一步限制样式表的范围,如宽度、高度和颜色。在这里,表达式的最小宽度是:699px。如果浏览器宽度大于699px,这个媒体查询将应用它所包含的CSS属性。因此,在大于699px的屏幕上h1元素将被隐藏。

有许多媒体类型和媒体功能可供我们使用。媒体类型的例子包括all(所有的)、print(打印的)、screen(屏幕的)和projection(投影的)。媒体特征的例子包括height(高度),max-height(最大高度),和max-width(最大宽度)。

Bootstrap已经为各种设备大小定义了许多媒体查询,以创建一个高度响应的框架。这里是Bootstrap的CSS文件中的一个片段:

@media (min-width: 768px) {
.container {
width: 750px;
}
}

要了解更多关于媒体查询的信息,请参考《Mozilla Developer Network documentation》链接是https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Media_queries


小结


在本章中,我们讨论了自定义Bootstrap的各种方法,并看到了如何用CSS和Less自定义Bootstrap。正如我们所看到的,Bootstrap提供了许多改变默认样式的选项,赋予您创建自己独特而漂亮的设计的能力。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容