Bootstrap入门笔记之(三)栅格系统

实现原理

栅格系统是Bootstrap中的核心,正是因为栅格系统的存在,Bootstrap才能有着如此强大的响应式布局方案。下面是官方文档中的解说:

Bootstrap 提供了一套响应式、移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列。包含了用于简单的布局选项的预定义类,也包含了用于生成更多语义布局的功能强大的混合类。

我们来理解一下这一段话,可以发现其中最重要的部分就是移动设备优先,那么什么是移动设备优先呢?

Bootstrap的基础CSS代码默认从小屏幕设备(比如移动设备、平板电脑)开始,然后使用媒体查询扩展到大屏幕设备(比如笔记本电脑、台式电脑)上的组件和网格。

有着如下策略:

  1. 内容:决定什么是最重要的。
  2. 布局:优先设计更小的宽度。
  3. 渐进增强:随着屏幕大小增加而添加元素。

工作原理

  1. 数据行(.row)必须包含在容器.container(固定宽度)或.container-fluid(100%宽度)中,以便为其赋予合适的排列(aligment)和内填充(padding)。如:
    1
    2
    3
    4
    5
    6
    7
    <div class="container"><!-- 水平居中,两边有margin,最小屏幕时,充满父元素 -->
    <div class="row"></div>
    </div>
    <!-- 或者 -->
    <div class="container-fluid"><!-- 默认一直充满整个父元素 -->
    <div class="row"></div>
    </div>
  2. 在数据行(.row)中可以添加列(column),但列数之和不能超过平分的总列数(在超过时,多余部分会换行显示),默认12。(使用Less或者Sass可以进行自定义设置)如:
    1
    2
    3
    4
    5
    <div class="container">
    <div class="row">
    <div class="col-md-2"></div>
    <div class="col-md-6"></div>
    <div class="col-md-4"></div>
  3. 页面上的具体内容应当放置于列(column)内,并且只有列(column)可以作为数据行.row容器的直接子元素
  4. 预定义的网格类,比如 .row.col-xs-4,可用于快速创建网格布局。
  5. 栅格系统中的列是通过指定1到12的值来表示其跨越的范围。例如,三个等宽的列可以使用三个.col-xs-4来创建。

注意事项:

正如上面在注释部分所展现的一样的.container(固定宽度)是固定宽度的布局方式。通过查看源码,在查看.container类的时候我们会发现,它的宽度是响应式的:(如下)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.container {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;margin-left: auto;
}
@media (min-width: 768px) {
.container {
width: 750px;
}
}
@media (min-width: 992px) {
.container {
width: 970px;
}
}
/*........*/

从上面的css代码可以看到,该类默认为整个父元素的宽度(最小屏幕),但是在大屏幕下有着不同的宽度,并且在不同宽度下左右margin会同时增加或减少(水平居中)。

.container-fluid类就和.container的默认情况一样,为100%宽度。(CSS代码一样)

除此之外

从源码中我们还可以发现,除了有左右margin外,还可以看到该类是有着左右填充(padding)存在的。

如果我们继续查看源码,可以发现数据行.row中的每一个列也有着左右填充(padding)的存在,如下:

1
2
3
4
5
6
.col-md-1, .col-lg-12 /*......*/{
position: relative;
min-height: 1px;
padding-right: 15px;
padding-left: 15px;
}

看到这里,大家应该都能想到会有什么样的情况出现!我们在第一个和最后一个列因为双填充的存在,实际上对于内容的隔离已经到了30px。我们需要怎么消除影响呢?

Bootstrap是通过.rows上的外边距(margin)取负margin-left: -15px;margin-right: -15px;,表示第一列和最后一列的行偏移,用来抵消第一个列的左内距和最后一列的右内距。

基本用法

一图胜千言,通过下表可以详细查看 Bootstrap 的栅格系统是如何在多种屏幕设备上工作的。使用方法我想应该不用再多说了,已经有提到过,直接一起来看看区别吧。(图片扒自Bootstrap中文官网

栅格参数

通过源码可以发现,如下:

1
2
3
4
5
6
7
8
9
10
11
.col-md-1/*......*/{ float: left;}/*所有的列都是默认向左浮动的*/
.col-md-1 {
width: 8.33333333%;
}
.col-md-2 {
width: 16.66666667%;
}
/*.....*/
.col-md-12 {
width: 100%;
}

从这些CSS代码也就不难发现,Bootstrap中每一列所占的宽度,以及为何在列数设置超过12时,超过部分会换行显示了。

在下面所有的示例中每一列的背景颜色与边框的效果由如下CSS代码控制:

1
2
3
4
[class *= col-]{
background-color: #eee;
border: 1px solid #ccc;
}

基础

那么我们就来看看一些示例吧,下面这种方式是最基本的用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div class="container">
<div class="row">
<div class="col-md-6">.col-md-6</div>
<div class="col-md-6">.col-md-6</div>
</div>
<div class="row">
<div class="col-md-4">.col-md-4</div>
<div class="col-md-4">.col-md-4</div>
<div class="col-md-4">.col-md-4</div>
</div>
<div class="row">
<div class="col-md-2">.col-md-2</div>
<div class="col-md-6">.col-md-6</div>
<div class="col-md-4">.col-md-4</div>
</div>
</div>

实现的效果如下:

网格基本用法

Bootstrap作为一个响应式框架当然不会只有那么简单的功能,我们继续往下走吧!

列偏移

在某些情况下,我们不希望相邻的列紧靠在一起,如果你希望不通过额外的margin或其他的手段来实现的话,Bootstrap内置为我们提供了列偏移(offset),这一系列的类来帮助我们实现想要的效果。

只需要给需要偏移的列元素上添加类名col-md-offset-*(星号代表要偏移的列组合数),那么具有这个类名的列就会向右偏移。
这些类实际是通过使用 * 选择器为当前元素增加了左侧的边距(margin)。例如:在列元素中添加.col-md-offset-6 类将 .col-md-6元素向右侧偏移了6个列(column)的宽度。

现在我们的代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
<div class="container">
<div class="row">
<div class="col-md-2 ">col-md-8 </div>
<div class="col-md-3 col-md-offset-2">col-md-4 col-md-offset-2</div>
<div class="col-md-4 col-md-offset-1">col-md-4 col-md-offset-1</div>
</div>
<p><br></p>
<div class="row">
<div class="col-md-4 ">col-md-4 </div>
<div class="col-md-3 col-md-offset-4">col-md-3 col-md-offset-4</div>
<div class="col-md-4 col-md-offset-4">col-md-4 col-md-offset-4</div>
</div>
</div>

可以实现的效果如下:

网格基本用法

从实现的效果我们就能发现一些东西,注意第二段的显示效果与代码,从那里我们可以发现:使用col-md-offset-*对列进行向右偏移时,要保证列与偏移列的总数不超过12,不然会致列断行显示。
其实原因也很简单:因为该类是对于列设置margin-left,并且我们在上面的源码展示中,也可以看有每一列都有着float:left的属性,从这些地方我们就不难发现在(偏移+列宽)超过12时,为何会换行显示了

列排序

列排序其实就是改变列的方向(顺序),就是改变左右浮动,并且设置浮动的距离。在Bootstrap框架的网格系统中是通过添加类名col-md-push-*col-md-pull-* (和上面一样,星号代表移动的列组合数)。

Bootstrap仅通过设置left和right来实现定位效果。通过查看源码,我们可以看到基本设置比较简单,如下:

1
2
3
4
5
6
7
8
9
10
.col-md-pull-12 {
right: 100%;
}
/*...*/
.col-md-push-1 {
left: 8.33333333%;
}
.col-md-push-0 {
left: auto;
}

还是继续看看我们的实际效果吧!代码如下

1
2
3
4
5
6
7
8
9
10
<div class="container">
<div class="row">
<div class="col-md-4 col-md-push-8">.col-md-4 col-md-push-8 </div>
<div class="col-md-8 col-md-pull-4">.col-md-8 col-md-pull-4 </div>
</div>
<div class="row">
<div class="col-md-4 ">.col-md-4 默认</div>
<div class="col-md-8 ">.col-md-8 默认</div>
</div>
</div>

网格基本用法

我们可以发现列的位置已经发生了改变

列嵌套

Bootstrap框架的网格系统还支持列的嵌套。你可以在一个列中添加一个或者多个行(.row)容器,然后在这个行容器中插入列(像前面介绍的一样使用列)。但在列容器中的行容器(.row),宽度为100%时,就是当前外部列的宽度。(其实就是在列中嵌套多个列,下面会有实际效果展示)

注意:被嵌套的行(.row)所包含的列(column)的个数不能超过12(其实,没有要求你必须占满12列 -_- )。

我们现在有这样一个需求:

  1. 创建一个8-4列网格。(备注:以中屏md(970px)为例)。
  2. 在第一个8列网格中插入8-4列网格。
  3. 在第二个4列网格中插入9-3列网格。

效果如下:

网格基本用法

该如何实现呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<div class="container">
<div class="row">
<div class="col-md-8">
我的里面嵌套了一个网格
<div class="row">
<div class="col-md-8">col-md-8</div>
<div class="col-md-4">col-md-4</div>
</div>
</div>
<div class="col-md-4">
我的里面嵌套了一个网格
<div class="row">
<div class="col-md-9">col-md-9</div>
<div class="col-md-3">col-md-3</div>
</div>
</div>
</div>
</div>

是不是很简单呢?当然为了完全实现和效果图一样的展示,我们还需要对CSS进行一些添加,主要是对于嵌套的添加 一些高亮的样式:

1
2
3
4
5
[class *= col-] [class *= col-] {
background-color: #f36;
border:1px dashed #fff;
color: #fff;
}

栅格系统的基础里面方面呢,上面已经说的差不多了,看上去十分简单不是吗?

要想在我们的实际项目中使页面在不同屏幕中达到一个最佳的显示效果,还需要我们对于栅格系统进行的灵活的运用!

下面就一起来进行一些实例的研究吧!

实例:

在上面我们已经实现了过最简单的从堆叠到水平排列的布局了,非常简单,我们只使用了单一的一组 .col-md-*栅格类,就创建了一个基本的栅格系统。
它在手机和平板设备上一开始是堆叠在一起的(超小屏幕到小屏幕这一范围),在桌面(中等)屏幕设备上变为水平排列

移动设备和桌面屏幕

是否不希望在小屏幕设备上所有列都堆叠在一起?那就使用针对超小屏幕和中等屏幕设备所定义的类吧,即 .col-xs-*.col-md-*
我把Bootstrap中文官网的代码稍微做了一点修改。主要是将中间的.col-md-4.col-xs-6两个类调换了一下位置(CSS层叠,说到这应该就不需要做更多的说明了吧。),代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-8">.col-xs-12 .col-md-8</div>
<div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
</div>
<div class="row">
<div class="col-md-4 col-xs-6">.col-md-4 .col-xs-6</div>
<div class="col-md-4 col-xs-6">.col-md-4 .col-xs-6</div>
<div class="col-md-4 col-xs-6">.col-md-4 .col-xs-6</div>
</div>
<div class="row">
<div class="col-xs-6">.col-xs-6</div>
<div class="col-xs-6">.col-xs-6</div>
</div>
</div>

宽屏显示效果如下:
移动设备和桌面屏幕-桌面
窄屏显示效果如下:
移动设备和桌面屏幕-移动

其实从上面代码和实际的显示效果,我们就可以看出一些问题来:

  1. 在宽屏时,使用col-md-*的布局方式,在窄屏时使用col-xs-*布局
  2. 响应式的列重置与列中设置的类的排列顺序无关。
  3. 响应式列重置,在一个.row仍然存在列超过12时,col-xs-6*3=18。多余列的元素将作为一个整体单元被另起一行排列。

在了解了上面的这些问题之后是不是明了了一些呢?

举一反三,我们再来看一个更加复杂的例子

手机、平板、桌面

在上面案例的基础上,通过增加使用针对平板设备的 .col-sm-* 类,我们来创建更加动态和强大的布局吧。

1
2
3
4
5
6
7
8
9
10
11
<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-6 col-md-8">.col-xs-12 .col-sm-6 .col-md-8</div>
<div class="col-xs-6 col-sm-12 col-md-4">.col-xs-6 .col-sm-12 .col-md-4</div>
</div>
<div class="row">
<div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div>
<div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div>
<div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div>
</div>
</div>

这一次会比原来的情况更加复杂,一个会有3种情况出现:

宽屏:
桌面
中屏:
平板
窄屏:
手机

然后我们从这一部分代码与实际效果,再加上上面做的一点小总结,对比之后又能发现一些问题:

  1. Bootstrap中对于栅格系统的展示总是优先展示****对应屏幕大小范围的类(.col-xs-6 .col-sm-4等等)。
  2. 在为不同大小屏幕,添加多个类一定要记住在基本用法处的表格中的内容,它决定了在不同大小屏幕下的显示与排列。
  3. 若还要继续添加在超大屏幕下的特定显示效果,只需要对列再添加一个.col-lg-*的类,就能达到你所想要的

响应式列重置

除了在上面讲到的内容,在官方文档中还提到了响应式列重置,在我看来其实就是以下几点(或者说在这样的条件下可以使用):

  1. 需要对于不同屏幕大小进行处理,添加多个对于列宽进行处理的类。
  2. 在缩小屏幕时,同一数据行(.row)针对小屏幕设置的类的宽度(.col-sm-*等等)加起来超过12,余下部分进行换行显示。
  3. 在不同列的高度,有比较大的差异。可以在未超过12超过12的部分,两者之间添加下面这样的代码:<div class="clearfix visible-xs-block"></div>。(.visible-xs-block这一系列的类,会在后面进行讲解)
    它最主要的作用是:它是响应式的,会占据未超过12的部分的宽高,且只有在发生列换行显示(堆叠)才进行设置。
  4. 为了便于大家理解,我加一句:把上面那段代码复制到数据行.row容器内的最末端,它所占据的宽高和.row是一样的。(内容中有多段这样的代码的时候不成立,原因大家应该都能看出来了)

说到这里呢,栅格系统的部分,基本告一段落了,我们即将开始对于菜单、按钮及导航,这一部分的组件进行学习

参考:

Bootstrap入门笔记之(二)表单

关于表单的应用自然不需要多说,只要您的的网站可以用户登录,那么不可能不用到表单!表单主要功能是用来与用户做交流的一个网页控件,JavaScript发明之初最大的作用也就是用来进行表单操作。所以表单是每一个前端开发者必须要熟练掌握的东西。

良好的表单设计能够让网页与用户更好的沟通。表单中常见的元素主要包括:文本输入框、下拉选择框、单选按钮、复选按钮、文本域和按钮等。其中每个控件所起的作用都各不相同,而且不同的浏览器对表单控件渲染的风格都各有不同。传统的HTML表单就不在这样进行讲解了,下面就开始Bootstrap表单的学习吧!

一. 基础表单

在Bootstrap对于基础表单没有做太多的定制效果,仅仅是对于一些元素的margin、padding和border进行了一些细化设置。
当然,也不会那么简单,在Bootstrap框架中,通过定制了一个类名form-control,也就是说,使用了类名form-control,将会实现一些设计上的定制效果。从源码中(2551行,嗯,善用搜索)可以得出结论如下:

  1. 宽度变成了100%
  2. 设置了一个浅灰色(#ccc)的边框
  3. 具有4px的圆角
  4. 设置阴影效果,并且元素得到焦点之时,阴影和边框效果会有所变化
  5. 设置了placeholder(输入框的提示文字)的颜色为#999

这个类一般用于输入框,对于其他的类型使用,嗯,你可以试试自己尝试一下。

1
2
3
4
5
6
7
8
9
10
<form role="form">
<div class="form-group"><!-- form-group这个类在在这里用于控制表单之间的间隔,之后会有另外介绍 -->
<label for="exampleInputEmail1">邮箱:</label>
<input type="email" class="form-control" id="exampleInputEmail1" placeholder="请输入您的邮箱地址">
</div>
<div class="form-group">
<label for="exampleInputPassword1">密码</label>
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="请输入您的邮箱密码">
</div>
</form>

一般来说效果是这样的:
基础表单

内联表单

还是上面那一段代码:我们只需要给form加上下面.form-inline这个类就可以实现表单元素在一行排列:

内联表单

它的实现原理很简单,其实就是在添加了这个类后,将内部的表单元素设置为了内联块(inline-block)。

我们继续改变屏幕大小会发现小到一定层度之后又变成了原来的样式,那是因为这个类是处于媒体查询中的!这样是为了更好的在移动设备上体验,Bootstrap本来就是一个响应式框架不是吗?

如果你想更简洁一点还可以对于label添加一个.sr-only类,把label标签进行隐藏。(注意是隐藏,而不是人为删除,设置label标签有助于屏幕阅读器理解此处的含义)

水平表单

Bootstrap框架默认的表单是垂直显示风格,除了上面的内联表达之外,很多时候我们需要的是水平表单风格。在Bootstrap框架中要实现水平表单效果,必须满足以下两个条件:

  1. <form>元素是使用类名.form-horizontal,作用如下:
  • 设置表单控件padding和margin值。
  • 改变“form-group”的表现形式,类似于栅格系统的“row”。
  1. 配合Bootstrap框架的栅格系统。(栅格布局会在以后的章节中详细讲解)
  • 例如:使用<div class="col-sm-6"></div>将我们的input进行包裹,具体情况到栅格布局的时候再说

可以实现下面的效果,(同样处于媒体查询中)
水平表单

二. 表单控件

输入框input

单行文本框在html编写时,我们都需要设置type属性为text,在Bootstrap中也必须正确的添加type的类型,因为在这里是使用CSS的属性选择器如:input[type="text"]来进行样式设置的!
为了让控件在各种表单风格中样式不出错,需要添加类名“form-control”,如:<input type="email" class="form-control" placeholder="请输入您的邮箱">

下拉选择框select

Bootstrap框架中的下拉选择框使用和原始的一致,但是Bootstrap框架为这些元素提供统一的样式风格。如:

1
2
3
4
5
6
7
8
9
10
<form role="form">
<div class="form-group">
<select class="form-control">
<option>踢足球</option>
<option>游泳</option>
<option>慢跑</option>
<option>跳舞</option>
</select>
</div>
</form>

想要实现多行选择,只需要在select中设置multiple属性的值为multiple。<select multiple class="form-control">

需要注意的是,经过测试多行选择是固定高度的(82px),也就是说只有一个选项时,也占据那么高的高度,在选项多时,将出现滚动条

文本域textarea

文本域和原始使用方法一样,设置rows可定义其高度,设置cols可以设置其宽度。但如果textarea元素中添加了类名form-control类名,则无需设置cols属性。因为Bootstrap框架中的form-control样式的表单控件宽度为100%或auto。
如:<textarea class="form-control" rows="3"></textarea>

复选框checkbox和单选按钮radio

Bootstrap对于这两个按钮进行了一些优化,要想达到最佳显示效果,有着如下说明:

  1. 不管是checkbox还是radio都使用label包起来了。
  2. checkbox按钮连同label标签放置在一个名为.checkbox的容器内,radio连同label标签放置在一个名为.radio的容器内。
  3. 在Bootstrap框架中,主要借助.checkbox.radio样式,来处理复选框、单选按钮与标签的对齐方式。
  4. 只需要将checkbox换成checkbox-inline就可以了,你可以添加在label上也可以添加在外部的容器上。

表单控件大小

在Bootstrap中除了使用传统的控制大小(height,padding等等)方式外,还特意定制了两个类名用来控制大小,如下:

  1. input-sm:让控件比正常大小更小
  2. input-lg:让控件比正常大小更大

这两个类适用于表单中的input,textarea和select控件

表单控件状态

焦点状态

焦点状态是通过伪类:focus来实现。在Bootstrap框架中表单控件的焦点状态删除了outline的默认样式,重新添加阴影效果。.

禁用状态

Bootstrap实现禁用和普通的表单禁用状态的实现方法一样的,就是在相应的表单控件上添加属性disabled,只不过Bootstrap做了一些样式风格的处理:

禁用状态

其次,除了单独给相应的表单控件添加disabled外,还可以直接添加到域中<fieldset disabled></fieldset>,在这种情况,整个域中的表单全部都将会被禁用,此外还有一个小bug:如果该域中存在<legend>(域标题),在其内的表单控件,虽然有禁用的样式,但是实际上可以进行输入,点击等操作!

验证状态

在前面我们说过,Bootstrap有着大量的对于特定的情景内容的颜色设置,表单当然也不例外!在制作表单时,不免要做表单验证。同样也需要提供验证状态样式,那么Bootstrap框架中就提供了这几种效果:

  1. .has-warning:警告状态(黄色)
  2. .has-error:错误状态(红色)
  3. .has-success:成功状态(绿色)

除此之外,Bootstrap还实现了在不同的状态提示不同的icon,如果你想让表单在对应的状态下显示这样的效果,只需要在对应的状态下添加类名has-feedback。请注意,此类名要与has-errorhas-warninghas-success在一起,代码如下:

1
2
3
4
5
6
7
8
<form role="form">
<div class="form-group has-success has-feedback"><!-- 最后一个class控制图标显示 -->
<label class="control-label" for="inputSuccess1">成功状态</label>
<input type="text" class="form-control" id="inputSuccess1" placeholder="成功状态" >
<span class="glyphicon glyphicon-ok form-control-feedback"></span><!-- 图标显示!选取显示图标 -->
</div>
<!-- ...... 还有不同的图标显示例如glyphicon-warning-sign glyphicon-remove等等 -->
</form>

在 Bootstrap 的小图标都是使用**@font-face**来制作,只要有一个容器,就可以通过不同的类名来控制显示的图标。具体内容后面再详细介绍。

显示效果如下:

禁用状态

表单提示信息

在表单验证的过程,未免会要提供不同的提示信息。在Bootstrap框架中也提供了这样的效果。提供了一个help-block类,例如:<span class="help-block">您输入的信息是错误的</span>只要将其插入到input之后,提示信息将以块状显示,并且显示在控件底部。

三. 按钮

众所周知,我们创建的按钮通常通过下面这几种形式::

  • input[type="submit"]:提交按钮
  • input[type="button"]:普通按钮
  • input[type="reset"]:重置按钮
  • <button></button>:按钮元素,(默认行为是提交)

在Bootstrap框架中的按钮都是采用<button>来实现。

1. 情景按钮

也正如我们前面所说,Bootstrop对于按钮也做了不同情景下的类,用不同的颜色展示很好的描述了当前的状态。一下图片来自慕课网

默认状态
多种状态

记住一点!Bootstrap中的按钮,第一前提是必须添加btn这个类,其他的各种类,都只能添加到其后。所以一个按钮应该是这个样子的:<button class="btn btn-info" >信息按钮</button> ,若还有其他的样式,往btn-info后添加,充分利用css的层叠特性。

2. 按钮大小

Bootstrap有着很对相似的类(学习完后总结一下吧颜色,大小等等),比如现在要说的,改变按钮的大小,当然你可以自定义,但是Bootstrap默认为我们提供了一些,添加到btn类后就行!

按钮大小

3. 块状按钮

Bootstrap框架中提供了一个类名btn-block。使用这个类名就可以让按钮充满整个容器,并且这个按钮不会有任何的padding和margin值。在实际当中,常把这种按钮称为块状按钮。同样添加到btn类后即可生效

4. 活动与禁用状态

Bootstrap框架针对按钮的状态做了一些特殊处理。主要分为两种:活动状态和禁用状态。

活动状态

Bootstrap按钮的活动状态主要包括按钮的悬浮状态(:hover),点击状态(:active)和焦点状态(:focus)几种。

通过在源码中我们可以看到,Bootstrap对于每一种风格的按钮都做了单独的定制。需要进行修改的话可以参考源码!

禁用状态

在Bootstrap框架中,要禁用按钮有两种实现方式:

  1. 在标签中添加disabled属性
  2. 在元素标签中添加类名.disabled
1
2
<a href="//guowenfh.github.io/" class="btn btn-danger disabled" type="button">添加disabled类</a>
<a href="//guowenfh.github.io/" class="btn btn-danger " type="button" disabled>添加disabled属性</a>

这两个方式除了样式上的改变之外,还存在是否阻止默认行为上的区别。(此处有大坑,暂时不能跳,以后在详细了解吧。不同浏览器,对于实现阻止默认行为的方式不同,IE11:两个方式都阻止默认行为,IE10-通过属性可以阻止,FF、Chrome通过类可以阻止默认行为。。我已经醉了)

从这里我们也可以看到,Bootstrap只需要在制作按钮的标签元素比如<div>,<span>等等,上添加类名btn就可以为其加上按钮风格,但是,并不建议这样使用,为了避免浏览器兼容性问题,个人强烈建议使用button或a标签来制作按钮。

四. 图像

在Bootstrap框架中对于图像的样式风格提供以下几种风格:

  1. .img-responsive:响应式图片,主要针对于响应式设计
  2. .img-rounded:圆角图片
  3. .img-circle:圆形图片
  4. .img-thumbnail:缩略图片,相框效果

直接把类名添加到img标签上就行了!

注意:
设置图片大小时,由于样式没有对图片做大小上的样式限制,所以在实际使用的时候,需要通过其他的方式来处理图片大小。比如说控制图片容器大小。(注意不可以通过css样式直接修改img图片的大小,这样操作就不响应了)

图标

这里说的图标就是Web制作中常看到的小icon图标,包括250多个来自 Glyphicon Halflings 的字体图标,Bootstrap框架中图标都是glyphicons.com这个商业网站提供的,并且免费授权给Bootstrap框架使用。

可以在Glyphicons 字体图标,看到全部图标的样式,您可以根据你的需求进行设置

在网页中使用图标也非常的简单,在任何内联元素上应用所对应的样式即可:

1
2
<span class="glyphicon glyphicon-cloud"></span>
<span class="glyphicon glyphicon-chevron-left"></span>

这里第一个类是所有字体图标所必需的,第二个类用来自定义显示的图标。

从源码中我们可以看到glyphicon这个类,最主要的部分有着如下样式设置:

1
2
3
4
5
6
7
8
9
.glyphicon {
position: relative;
top: 1px;
display: inline-block;
font-family: 'Glyphicons Halflings';
font-style: normal;
font-weight: normal;
line-height: 1;
}

从这里,也就不难发现为什么是必须的了,它控制了标签的显示方式,和引入了字体图标库;而第二个类,仅仅是调用对应字体的编码而已

表单的部分呢,学到这里也就基本高一段落了,下面就要开始进行,Bootstrap的核心栅格系统的学习了,继续加油!

参考:

Bootstrap入门笔记之(一)排版

1. 标题

在Bootstrap中使用标题的方式和常规html一样:从<h1><h6>分别从大到小安排标题元素,只不过在Bootstrap中重新设置了其默认样式,从源码中可以看到有如下共性:

字体颜色与字体样式继承自父元素,字体粗细为500,且行高全部设为1.1(也就是font-size的1.1倍)

1
2
3
4
5
6
{
font-family: inherit;
font-weight: 500;
line-height: 1.1;
color: inherit;
}

在不同大小的标题中有着如下区别:

  1. 在Bootstrap中对于不同级别标题字体大小设置为:h1=36px,h2=30px,h3=24px,h4=18px,h5=14px和h6=12px。
  2. 重新设置了margin-topmargin-bottom的值,h1~h3重置后的值都是20pxh4~h6重置后的值都是10px

除此之外在Bootstrap中为了让非标题元素和标题使用相同的样式,还特意定义了**.h1~.h6**六个类名。如下所示:

在Bootstrap中,下面的代码,显示效果相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--Bootstrap中的标题-->
<h1>Bootstrap标题一</h1>
<h2>Bootstrap标题二</h2>
<h3>Bootstrap标题三</h3>
<h4>Bootstrap标题四</h4>
<h5>Bootstrap标题五</h5>
<h6>Bootstrap标题六</h6>

<!--Bootstrap中让非标题元素和标题使用相同的样式-->
<div class="h1">Bootstrap标题一</div>
<div class="h2">Bootstrap标题二</div>
<div class="h3">Bootstrap标题三</div>
<div class="h4">Bootstrap标题四</div>
<div class="h5">Bootstrap标题五</div>
<div class="h6">Bootstrap标题六</div>

因为在实际应用中,我们可能经常会遇到除了主标题外,之后紧跟着一个副标题的情况。Bootstrap人性化的为我们设置了这样一个效果。使用方式也特别简单,如下:

1
<h1>Bootstrap标题一<small>我是副标题</small></h1>

当然毋庸置疑的是,从<h1><h6>都可以使用该设置。副标题<small>有着自己一些独特的样式:

  1. 行高全部都设置为了1,而且字体粗细变成了常规效果(不加粗),同时颜色被设置为灰色(#999)。
  2. 在h1h3内的<small>标签文本,其大小都设置为当前字号的65%;而在h4h6内的字号都设置为当前字号的75%;

2. 正文文本

Bootstrap中的文本全局样式如下:

  1. 字体大小为14px
  2. 行高为1.42867143(约等于20px)
  3. 字体颜色为#333
  4. p标签外部有着10个像素的下外边距margin-bottom:10px;

当然,你是可以自行设置重置样式的。^_^

3. 强调

字体风格相关

1
2
3
4
5
6
<p class="lead">lead</p><!-- 字体变大,行高变大,下外边距变大 -->
<i>i</i><!--无特殊意义, 斜体 -->
<small>small</small><!-- 小号字体-->
<strong>strong</strong><!-- 语气强烈的强调,粗体 -->
<em>em</em><!-- 强调,斜体 -->

强调相关的类

在Bootstrap中定义了一系列的这样的类,用于不同的情景,出去text外,还有bg(背景颜色)等等。使用方法类似,只是前面的文本进行了一些改变!所以。记住这6个单词吧

1
2
3
4
5
6
<p class="text-muted">提示,使用浅灰色(#999)</p>
<p class="text-primary">主要,使用蓝色(#428bca)</p>
<p class="text-success">成功,使用浅绿色(#3c763d)</p>
<p class="text-info">通知信息,使用浅蓝色(#31708f)</p>
<p class="text-warning">警告,使用黄色(#8a6d3b)</p>
<p class="text-danger">危险,使用褐色(#a94442)</p>

4. 文本对齐风格

1
2
3
4
<p class="text-left">我居左</p>
<p class="text-center">我居中</p>
<p class="text-right">我居右</p>
<p class="text-justify">我两端对齐</p>

在Bootstrap中,为了简化操作,方便使用,使用了上面这四个类分别对应我们在CSS中常常使用text-align来实现文本的对齐风格的设置。

5. 列表

在Bootstrap中对于列表的设置与原生的html基本一致,需要注意的有:

  1. 在列表之间有10px的下外边距
  2. 在嵌套列表中,不含有下边距

Bootstrap当然不会就这么简单做一点点修改,它定义了一些关于列表的类给我们使用。

去点列表.list-unstyled

1
2
3
4
.list-unstyled {
padding-left: 0;
list-style: none;
}

从源码中,我们可以看到这样的信息,它除了将项目编号去除之外,还将默认的左边距也清除掉了。

1
2
3
4
5
6
7
8
9
<ol>
<li class="list-unstyled">
项目列表
<ul class="list-unstyled">
<li>带有项目编号</li>
<li>带有项目编号</li>
</ul>
</li>
</ol>

在这样一段代码中,三个列表项会整齐的排列在一起,且都没有项目符号

内联列表.list-inline

除了去点列表之外,Bootstrap还可以通过添加类名“.list-inline”来实现内联列表,简单点说就是把垂直列表换成水平列表,而且去掉项目符号(编号),保持水平显示。也可以说内联列表就是为制作水平导航而生。

水平定义列表.dl-horizontal

现有代码如下:

1
2
3
4
5
6
<dl class="dl-horizontal">
<dt>标题一:</dt>
<dd>描述内容,我很喜欢前端,也很喜欢响应式布局,它能在个不同大小的屏幕下提供很好的体验,我现在是初学者,但是我会越来强的</dd>
<dt>标题二:标题二:标题二:标题二:</dt>
<dd>描述内容</dd>
</dl>

在浏览器全屏显示中可以看到效果如下:

自定义水平列表大屏

我们来把屏幕大小进行改变,在遇到一个临界值时(小屏),水平定义列表将回复到原始的状态,如下改变:

自定义水平列表小屏

这是为什么呢?我们去看看源码吧!
原来在这里添加了一个媒体查询,只有屏幕大于768px的时候,添加类名.dl-horizontal才具有水平定义列表效果。其实现主要方式:

  1. 将dt设置了一个左浮动,并且设置了一个宽度为160px
  2. 将dd设置一个margin-left的值为180px,达到水平的效果
  3. 当标题宽度超过160px时,将会显示三个省略号

现在再看看上面的效果是不是和这里的描述都是一样的呢?答案当然是肯定的 ^ ^

6. 代码

在Bootstrap主要提供了三种代码风格:

  1. 使用<code></code>来显示单行内联代码——针对于单个单词或单个句子的代码
  2. 使用<pre></pre>来显示多行块代码——针对于多行代码(也就是成块的代码)
  3. 使用<kbd></kbd>来显示用户输入代码——表示用户要通过键盘输入的内容

直接来看效果吧!

code风格

代码如下:(需要注意的是,**不管使用哪种代码风格,在代码中碰到小于号(<)和大于号(>)都需要使用转义字符来替代)

1
2
3
4
5
6
7
8
9
10
11
12
code风格:
<div>Bootstrap的代码风格有三种:<code>&lt;code&gt;</code><code>&lt;pre&gt;</code><code>&lt;kbd&gt;</code></div>
pre风格:
<div>
<pre>
&lt;ul&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
</pre>
</div>
kbd风格:
<div>请输入<kbd>ctrl+c</kbd>来复制代码,然后使用<kbd>ctrl+v</kbd>来粘贴代码</div>

<pre>元素一般用于显示大块的代码,并保证原有格式不变。但有时候代码太多,而且不想让其占有太大的页面篇幅,就想控制代码块的大小。Bootstrap也考虑到这一点,你只需要在pre标签上添加类名.pre-scrollable,就可以控制代码块区域最大高度为340px,一旦超出这个高度,就会在Y轴(纵向)出现滚动条。

当然,你也可以进行自定义配置,例如:只需要在自定义的css中,对于该类添加一个word-wrap: normal;,这样的话,在代码块边框横向宽度小于内部代码横向长度时,就会出现横向滚动条。

7. 表格

表格是Bootstrap的一个基础组件之一,Bootstrap为表格提供了1种基础样式4种附加样式以及1个支持响应式的表格

对应上面所说的,Bootstrap为表格不同的样式风格提供了不同的类名,主要包括:

.table 基础表格
.table-striped 斑马线表格
.table-bordered 带边框的表格
.table-hover 鼠标悬停高亮的表格
.table-condensed 紧凑型表格
.table-responsive 响应式表格

.table主要有三个作用:

  • 给表格设置了margin-bottom:20px以及设置单元内距
  • 在thead底部设置了一个2px的浅灰实线
  • 每个单元格顶部设置了一个1px的浅灰实线

具体大家可以在源码中查看,后几种附加的样式在这里也不多说,但是下面说一些注意事项:

  1. 后几种表格附加样式,必须在基础样式.table之后,例如<table class="table table-bordered table-hover">
  2. 响应式表格:其原理是在表格外部添加容器把普通表格包裹起来,下面进行详细说明:
1
2
3
4
5
6
7
8
<div class="table-responsive"><!-- 关键!容器包裹后实现响应式 -->
<table class="table table-bordered"><!-- 设置表格样式,带边框的表格 -->
<thead><!-- 一个表格应该有表头,若直接写tr>td这样的结构,浏览器会自动创建一个tbody包裹 -->
</thead>
<tbody><!--与上同理,即使你不创建,浏览器也会自动添加tbody包裹你的代码 -->
</tbody>
</table>
</div>

下面是宽屏的效果(和普通的表格无区别):

表格行的类

此处是窄屏的效果(可以看到滚动条的出现):
表格行的类

表格行的类,表格情景

在上面已经说到了在Bootstrap中,为不同的情景做了不一样的颜色,用于不同的信息展示。只是在类名上做了一些小小的改变。下面就可以看到:(图片来自慕课网

表格行的类

只需要在**<tr>标签添加上这些类就可以使用了。
除此之外,通过源码可以看到,在这些颜色设置之外,Bootstrap还单独设置了
hover效果(悬浮状态)颜色加深**效果(它对于不同的情况单独进行了颜色设置)。
实现也特别简单,只需要像<table class="table-hover">这样,在<table>标签加上一个table-hover的类。(在未对<tr>进行情景颜色设置时,该类依然有效果,只是效果不一样,上面已经说到了,因为它的单独设置,具体请到源码中查看)

也正因为这样,如果你想自定义颜色的话,除了修改tr元素的颜色样式外,在.table-hover表格中也要做相应的调整!

排版的内容到这里就告一段落了,下面进行表单的学习!加油!

参考:

Bootstrap 入门笔记之(零)简介

什么是 Bootstrap?

  1. Bootstrap 是由 Twitter 推出的一个用于快速开发 Web 应用程序和网站的前端框架。

  2. 基于 html5、css3 的 bootstrap,具有下面这些诱人特性:
    (1)移动设备优先;
    (2)漂亮的设计;
    (3)友好的学习曲线;
    (4)卓越的兼容性;
    (5)响应式设计;
    (6)12 列响应式栅格结构;
    (7)样式向导文档。

  3. 自定义 JQuery 插件,完整的类库,基于 Less、Sass 等

Bootstrap 下载

可以在其中文官网中下载,可以很明显的看到一个大大的下载按钮,此外还可以通过 CDN,git 命令,以及 npm 等等方式进行下载。

如果您恰好看了我写的sublime Text的博客的话,肯定知道我们是可以直接通过插件进行安装的。只需要在ctrl+shift+P时,输入fecth:manage,进行如下设置:

1
2
3
4
"packages":
{
"Bootstrap": "//github.com/twbs/bootstrap/releases/download/v3.3.6/bootstrap-3.3.6-dist.zip"
}

之后就可以直接通过 sublime Text 进行下载了,还是刚刚的步骤,但是这一次输入的是fetch:package。找到Bootstrap,如果下载成功在您的文件夹中应该可以看到主要包括三个文件夹cssfontsjs,如下:

下载文件夹

可以看到除去字体文件夹外的其他文件夹中每一分文件都有两个不同的版本,一个完整版的文件,方便查看源码如:bootstrap.js和一个用于实际生产情况的压缩文件如bottstrap.min.js

在字体文件中可以看到有很多文件,但是它的功能很简单,就是是用来制作icon 图标的文件,使用了 CSS3 的@font-face 技术。

在实际情况中,如果你还想使用更多的图标,还可以在Iconfont-阿里巴巴矢量图标库,自行查找设置。

Bootstrap 标准模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<!-- 在IE运行最新的渲染模式 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- 初始化移动浏览显示 -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap 标准模板</title>

<!-- 1. 加载Bootstrap层叠样式表 -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- 你自己自定义的样式文件 -->
<link href="css/your-style.css" rel="stylesheet">
<!-- 以下两个插件用于在IE8以及以下版本浏览器支持HTML5元素和媒体查询,如果不需要用可以移除 -->
<!--[if lt IE 9]>
<script src="//lib.baomitu.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="//lib.baomitu.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->

</head>
<body>
<h1>hello,world</h1>
<!-- 2. 如果要使用Bootstrap的js插件,必须加载jquery库,且必须在bootstrap库之前 -->
<script src="js/jquery-min-1.11.3.js"></script>
<!-- 3. 包括所有bootstrap的js插件或者可以根据需要使用的js插件调用-->
<script src="js/bootstrap.min.js"></script>
</body>
</html>

全局样式

Bootstrap 框架的核心是轻量的 CSS 基础代码库,他并没有一味的重置样式,而是注重各浏览器基础表现,降低开发难度。
为了增强跨浏览器表现的一致性,Bootstrap 使用了 Normalize.css。但没有一味全部使用该重置样式,而是在此基础之上进行了一些改良,让其更加符合 Bootstrap 的设计思想。
Bootstrap 保留和坚持部分浏览器的基础样式,解决部分潜在的问题,提升一些细节的体验,在排版、链接样式设置了基本的全局样式。具体说明如下:

  • 移除 body 的 margin 声明
  • 设置 body 的背景色为白色
  • 为排版设置了基本的字体、字号和行高
  • 设置全局链接颜色,且当链接处于悬浮:hover状态时才会显示下划线样式

Bootstrap 简介部分到此就结束了,在 Bootstrap 的中文官网中,有着层次清晰且详细的说明文档,下面就和我一起走进 Bootstrap 的世界吧!

jQuery入门笔记之(七)插件

插件(Plugin)也成为 jQuery 扩展(Extension),是一种遵循一定规范的应用程序接口编写出来的程序。目前 jQuery 插件已超过几千种,由来自世界各地的开发者共同编写、验证和完善。而对于jQuery开发者而言,直接使用这些插件将快速稳定架构系统,节约项目成本。

一. 插件概述

插件是以 jQuery 的核心代码为基础,编写出复合一定规范的应用程序。也就是说,插件也是 jQuery 代码,通过 js 文件引入的方式植入即可。
插件的种类很多,主要大致可以分为:UI 类、表单及验证类、输入类、特效类、Ajax类、滑动类、图形图像类、导航类、综合工具类、动画类等等。
引入插件是需要一定步骤的,基本如下:

  1. 必须先引入 jquery.js 文件,而且在所有插件之前引入;
  2. 引入插件;
  3. 引入插件的周边,比如皮肤、中文包等。

比如最常用到的表单验证插件:validate,除了最基本的插件文件jquery.validate.min.js之外,还有着messages_zh.js等等各国的语言包可以供你使用。

如何使用该插件在这里就不进行描述了,可以去看看慕课网上的视频jQuery插件——Validation Plugin,里面详细的描述了这个插件的各种配置项,以及扩展。

触类旁通,一个优秀的插件,详细的说明文档必不可少,详细的看说明文档能,并且在本地进行测试能让你快速的入门各种插件的使用。

还有各种各样的别人编写好的插件可以供你使用:比如管理cookie的插件–cookie等等。

插件可以去jQuery官网的插件模块进行查找The jQuery Plugin Registry

二. 自定义插件

前面我们使用了别人提供好的插件,使用起来非常的方便。如果市面上找不到自己满意的插件,并且想自己封装一个插件提供给别人使用。那么就需要自己编写一个 jQuery 插件了。

插件种类

按照功能分类,插件的形式可以分为一下三类:

  1. 封装对象方法的插件;(也就是基于某个 DOM 元素的 jQuery 对象,局部性,使用最多)
  2. 封装全局函数的插件;(全局性的封装)
  3. 选择器插件。(类似与.find(),例如:color(red)来选择所有的红色元素之类)

插件的基本要点

主要用以以解决各种因为插件导致的冲突、错误等问题,包括如下:

  1. 插件名推荐使用 jQuery.[插件名].js,以免和其他 js 文件或者其他库相冲突(可以使用alert($.[插件名])验证是否存在该全局方法);
  2. 局部对象附加 jQuery.fn 对象上,全局函数附加在 jQuery对象本身上(可以使用alert($(selector).[插件名])验证是否存在该局部方法);
  3. 插件内部,this 指向是当前的局部对象(通过选择器获取的jQuery对象);
  4. 可以通过 this.each 来遍历所有元素;
  5. 所有的方法或插件,必须用分号结尾,避免出现问题(为了更稳妥,可在插件头部先加上一个分号);
  6. 插件应该返回的是 jQuery 对象,以保证可链式操作;
  7. 避免插件内部使用$,如果要使用,使用闭包把传递 jQuery 进去,使插件内部继续使用$作为jQuery的别名。
    1
    2
    3
    ;(function($){//这里将$符作为匿名函数的形参
    /*在此处编写代码,可使用$作为jQuery的缩写别名*/
    })(jQuery);//这里将jQuery作为实参传递给匿名函数了

编写一个插件

假设我们的插件需求是:实现一个下拉菜单,在移入该元素时,把对应的下拉列表展现出来,移出时收回。并且可以设置其展开时的文字颜色。

根据惯例,我们在编写插件时,可以对于html结构有所约束。现在假设我们的页面上有如下HTML结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<ul class="list">
<li>导航列表1
<ul class="nav">
<li>导航列表1</li>
<li>导航列表2</li>
<li>导航列表3</li>
<li>导航列表4</li>
<li>导航列表5</li>
<li>导航列表6</li>
</ul>
</li>
<li>导航列表2
<ul class="nav">
<li>导航列表1</li>
<li>导航列表2</li>
<li>导航列表3</li>
<li>导航列表4</li>
<li>导航列表5</li>
<li>导航列表6</li>
</ul>
</li>
</ul>
<!-- 默认已经引入jquery -->

在这里,我们就对我们的插件实现效果有了第一个要求,必须在对于需要hover展现的元素内部下面建立ul列表,且className必须为nav。(插件内部都是根据该条件来做文章)

下面就可以开始编写我们的插件了。保存为jQuery.nav.js,(符合上面所说的要求,默认已经导入)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;(function($){
$.extend({ //插件定义在全局方法上
"nav" : function (color){//传参,这里只是抛砖引玉,在您编写的时候,参数选项可以更加丰富,例如传入json对象等等
$('.nav').css({//对展开的下拉列表设置样式,此处在下面进行详细说明
"list-style" : "none",
"margin" : 0,
"padding" : 0,
"display" : "none",
"color":color//由用户控制hover时,展现出来列表的文字颜色
});
$('.nav').parent().hover(//这里用到了.nav的父节点(就是hover到的元素)
//因为我们只能在插件要求的范围内进行设定,若是使用了外部的选择器,就违背了这个原则
function (){
$(this).find(".nav").stop().slideDown("normal");//注意我们在这里使用了jquery的动画方法
},function (){
$(this).find(".nav").stop().slideUp("normal");//注意stop()的使用,不然会有类似手风琴效果的出现,但那并不是我们需要的
});
}
});
})(jQuery);

注意:这里使用css方法只是为了方便,在真实插件编写过程中,若存在如此大量的css样式编写时,推荐在外部定义css样式,例如可改写为:
插件依赖的css,需和插件一起导入html中

1
2
3
4
5
6
.hover{/*插件必须样式*/
list-style: none;
margin:0;
padding: 0;
display: none;
}

在插件内部修改。

1
2
$('.nav').addClass("hover");//将CSS与jQuery分离开来
$('.nav').css("color",color);//存在用户设置时启用,不存在就不用了(进行判断)

刚刚说的都是插件的js文件,最后要起到效果,别忘了页面的js中加上那么一句话(当前插件定义在全局方法上)

1
2
3
$(function  (){
$.nav("#999");//调用插件实现的全局方法,并且设置其展现背景颜色为#999。
});

就这样,我们的全局插件就编写,而且调用完成了,在你的页面刷新看看,是不是已经有了效果呢?

但是,因为我们的方法定义在全局上,现在只要页面中出现了我们插件所规定的结构,就会存在hover展现效果,但是有时我们往往想要的不是这样,我们希望它在局部,在我指定的元素调用。所以我们需要对其进行一些改造,让其变成局部方法,其实也很简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
;(function($){
$.fn.extend({//定义为局部方法
"nav" : function (color){
$(this).find('.nav').addClass('hover');//上面已经说过了,此时this指向调用该方法的元素
$(this).find('.nav').css("color",color);//在当前元素下,增加了一次find筛选,实现在对应的元素中执行。
$(this).find('.nav').parent().hover(
function (){
$(this).find(".nav").stop().slideDown("normal");
},function (){
$(this).find(".nav").stop().slideUp("normal");
});
return this;//返回当前的对象
}
});
})(jQuery);

我们去刷新一下浏览器。
你会发现,咦,怎么没效果? 当然因为原来的代码是直接在全局调用的,现在变成局部方法了,显然就不能这样做了,需要做一点改变:

我这里就不贴html代码了,但是希望您在实践时能把上面的html代码在其下复制几份,以达到思考其实现的效果

1
2
3
4
$(function  (){//这里的eq(0)代表只对第一份起到效果,复制后的没有效果。
//(你可以把上面的find筛选删除之后再试试,您会发现,他又对余下的几份起效果了)
$(".list").eq(0).nav("red");//调用局部方法
});

现在回过头再把我们写的插件代码对应上面写的插件编写的要点,思考一下,我们还有哪些没有做到?就会发现,基本已经能对应上了。现在我们就完成了一个下拉菜单的插件。

其实编写插件并不难,最主要的是在我们编写插件的时候,一定要时刻注意这样的要点,每一个细节都遵循在大家实践过程中总结出来的最佳实现,才能自定义实现一个良好的插件。

代码首先是写个人看的,再然后才是给机器看的。

CSS多列布局

需要注意的是:本篇文章的布局,都未对父元素进行清除浮动的操作,所以在有一些使用了float的布局中,需要在parent容器清除浮动,才能在实际情况下使用。(清除浮动的方式在这里不做讨论)

一列定宽一列自适应

这部分的html结构如下:

1
2
3
4
5
6
7
8
9
<div class="parent">
<div class="left">
<p>left</p>
</div>
<div class="right">
<p>right</p>
<p>right</p>
</div>
</div>

大家先来看看直接在左侧添加浮动是怎么样的吧:
一列定宽,文字环绕效果

不要觉得诧异!因为float最开始的出现就是为了实现这个文字环绕效果的,只不过被攻城师们玩坏了,用到了布局上;但这肯定不是我们想要的,来看看我们想要的是怎么样的吧!
一列定宽,一列自适应

这样才对嘛!是我们想要的!下面就来看看css的实现吧:

1. float+margin

1
2
3
4
5
6
7
.left{
float: left;
width: 100px;
}
.right{
margin-left: 120px;
}

优点:兼容IE7+,便于理解;缺点:不兼容IE6,在right内部第一个元素存在清除浮动时,会发生right掉下去的情况。

一起来看看错误的例子:
一列定宽,错误
怎么解决呢?

2. 改进版—float+margin+fix

优点:兼容性好,兼容所有浏览器;缺点:结构增加,样式复杂。

布局改变如下:

1
2
3
4
5
6
7
8
9
10
11
12
<div class="parent">
<div class="left">
<p>left</p>
</div>
<!-- html部分在这个地方进行了添加,使用right-fix把原有结构包裹住了 -->
<div class="right-fix">
<div class="right">
<p >right</p>
<p>right</p>
</div>
</div>
</div>

css部分:

1
2
3
4
5
6
7
8
9
10
11
.left{
float: left; width: 100px;
position: relative; /*提升左边的层级*/
}
.right-fix{
float: right; width: 100%;
margin-left: -100px;/*处理右边掉下来的情况*/
}
.right{
margin-left: 120px;
}

3. float+overflow

优点:设置简单;

1
2
3
4
5
6
7
8
9
.left{
float:left;
width:100px;
margin-right:20px;
}
.right{
overflow:hidden;/*触发BFC*/
/*_zoom:1;*/ /*IE6使用zoom:1来触发BFC*/
}

3. table

HTML结构还是和第一个一样。

优点:加速table渲染,实现布局优先;缺点:代码量大,复杂

1
2
3
4
5
6
7
8
9
10
11
.parent{
display: table; width: 100%;
table-layout: fixed;/*加速table渲染,实现布局优先*/
}
.left,.right{
display: table-cell;
}
.left{
width: 100px;
padding-right: 20px;
}

4. flex

优点:结构简单;缺点:兼容性差iE10+,性能不好,常用作小范围布局

1
2
3
4
5
6
7
8
9
10
.parent{
display: flex;
}
.left{
width: 100px;
margin-right: 20px;
}
.right{
flex:1;/**/
}

多列定宽一列自适应

大家来看看想要达到的效果:
二列定宽,一列自适应
其实只是在上面的布局上,中间再加入一个center。
html结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
    <div class="parent">
<div class="left">
<p>left</p>
</div>
<div class="center">
<p>center</p>
</div>
<div class="right">
<p>right</p>
<p>right</p>
</div>
</div>

css部分:把center设置和left一样

1
2
3
4
5
6
7
8
.left,.center{
float: left;
width: 100px;
margin-right: 20px;
}
.right{
overflow: hidden;
}

一列不定宽,一列自适应

HTML结构同一列定宽一列自适应。
其实就是对一列定宽,一列自适应的后三个进行一下改造

实现效果和上面一样,但是宽度不在固定了!

1. float+overflow

优点:兼容性好,使用最多,结构简单;(其实和上面的改变就是左侧使用内容去撑开高度,因为原来的实现已经达到了这个效果)

1
2
3
4
5
6
7
8
9
.left{
float:left;
margin-right:20px;
/*width:200px;*//*可设置宽度,也可使用内容撑开*/
}
.right{
overflow:hidden;
}
.left p{width:200px;}/*使用内容去撑开宽度*/

2. table

缺点:支持IE8+,设置复杂。

对css进行如下更改:

1
2
3
4
5
6
7
8
9
10
11
.parent{
display: table; width: 100%;
}
.left,.right{
display: table-cell;
}
.left{
width: 0.1%;/*只要足够小就行*/
padding-right: 20px;
}
.left p{width:200px;}/*使用内容去撑开宽度*/

3. flex

缺点:还是上面的问题

1
2
3
4
5
6
7
8
9
10
.parent{
display: flex;
}
.left{
margin-right: 20px;
}
.right{
flex:1;/**/
}
.left p{width:200px;}/*使用内容去撑开宽度*/

两列不定宽,一列自适应。

HTML结构同两列定宽一列自适应。
float+overflow为例,只需要把center设置和left一样就可以了。

1
2
3
4
.left,.center{
float: left;
margin-right: 20px;
}

除了这个方法之外,上面的不定宽中的三个方法都能使用

等分布局

html结构如下:

1
2
3
4
5
6
<div class="parent">
<div class="column"><p>1</p></div>
<div class="column"><p>2</p></div>
<div class="column"><p>3</p></div>
<div class="column"><p>4</p></div>
</div>

按照惯例,先来分析一下实现过程。可以看到下图:
等分布局分析

其实我们只需要给父容器增加一个G,也就是一个负的margin就可以实现了,下面就来看看吧:

1. float+margin

优点:设置简单;缺点:支持IE8+,在布局变更时,需改变css样式(width:XX%)结构和样式耦合在了一起

1
2
3
4
5
6
7
8
9
10
p{background:#666;}/*对div中的p标签设置才有间隔效果,所以在设置内容时,也是在p中设置*/
.parent{
margin-left: -20px;
}
.column{
float: left;
width: 25%;
padding-left: 20px;
box-sizing: border-box;
}

实现效果如下:
等分布局存在左侧padding

效果不是就达到了呢?其实还不尽然,可以看到最左边还有一个宽度,我们不想要怎么办?

这并不是一个bug,而是我们的设置导致的,现在来删除上面的 padding-left: 20px;吧,可以看到成了这样子:
等分布局未设置padding

如果你需要有填充的话,自行设置吧

2. table+(fix)

html部分在上面的基础上,在最外层增加<div class="parent-fix">包裹住<div class="parent">

1
2
3
4
5
6
7
8
9
10
11
12
.parent-fix{
margin-left: -20px;
}
.parent{
display: table;
width:100%;
table-layout: fixed;/*布局优先,且在单元格未设宽度时,将被内容平分*/
}
.column{
display: table-cell;
padding-left: 20px;/*间隔,自行考虑是否取消*/
}

3. flex

1
2
3
4
5
6
7
8
9
.parent{
display: flex;
}
.column{
flex: 1;
}
.column+.column{/*给后三列设置间隔*/
margin-left:20px;
}

实现效果如下:
等分布局FLex
这里使用的是margin,因为flex自动分配剩余空间

等高布局

大家先来看看想要的效果:
等高布局

是不是很熟悉?html和第一部分一样:
但是两侧高度等同于高度最高的部分。

1
2
3
4
5
6
7
8
9
<div class="parent">
<div class="left">
<p>left</p>
</div>
<div class="right">
<p>right</p>
<p>right</p>
</div>
</div>

使用tableflex布局时就自然实现了等高布局

这里就不贴了,代码实现参考上面。主要是下面这个方案:

float实现

实际上没有完全相同,只是达到了效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.parent{
overflow: hidden;
}
.left,.right{
padding-bottom: 9999px;
margin-bottom: -9999px;
}
.left{
float: left; width: 100px;
margin-right: 20px;
}
.right{
overflow: hidden;
}

再一次提醒:实际情况中使用,需要在外层容器清除浮动。

使用搜索:谷歌必应百度