Bootstrap源码解析(二)

Bootstrap源码解析(二)

十二月 13, 2018

上一次主要介绍了Bootstrap源码的文件分类,没有进行重写样式的具体操作,这次以button样式为例记一次踩坑记录。

只要用过Bootstrap的朋友应该都知道,它的button样式在点击后默认是有一圈跟button颜色相近的东东(线条?outline?shadow?暂时先这样称呼),那么该如何去掉呢,网上大部分人的做法是引入bootstrap的样式后再引入自己的样式进行重写,但是我们要进行的是定制化,也就是在源码中修改。

踩坑记录

一开始直接就从3方面修改:

  1. outline: 0;
  2. border: 0;
  3. box-shadow: none;

神奇的是,怎么改都不起作用,自己重新写一个button之后按照上面的样式定义是起作用的,所以还是bootstrap的源码有些地方没修改到。

源码追查

  1. 它的button样式都是.btn开头,首先我们去看这个的样式定义
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
.btn {
display: inline-block;
font-weight: $btn-font-weight;
color: $body-color;
text-align: center;
vertical-align: middle;
user-select: none;
background-color: transparent;
border: $btn-border-width solid transparent;
@include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);
@include transition($btn-transition);

@include hover {
color: $body-color;
text-decoration: none;
}

&:focus,
&.focus {
outline: 0;
box-shadow: $btn-focus-box-shadow;
}

// Disabled comes first so active can properly restyle
&.disabled,
&:disabled {
opacity: $btn-disabled-opacity;
@include box-shadow(none);
}

// Opinionated: add "hand" cursor to non-disabled .btn elements
&:not(:disabled):not(.disabled) {
cursor: pointer;
}

&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled).active {
@include box-shadow($btn-active-box-shadow);

&:focus {
@include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
}
}
}

发现他的outline有的地方没有定义,我直接在focus和active一级原有样式中都加了,并且暂时移除box-shadow这一项,但是并没有效果。

  1. .btn是基础button样式,一般我们在用bootstrap button的时候都会加上.btn-类型颜色的样式,所以从着手:
1
2
3
4
5
@each $color, $value in $theme-colors {
.btn-#{$color} {
@include button-variant($value, $value);
}
}

我们看到其中引用了button-variant这个mixin,点进去查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {
color: color-yiq($background);
@include gradient-bg($background);
border-color: $border;
@include box-shadow($btn-box-shadow);

@include hover {
color: color-yiq($hover-background);
@include gradient-bg($hover-background);
border-color: $hover-border;
}

&:focus,
&.focus {
// Avoid using mixin so we can pass custom focus shadow properly
@if $enable-shadows {
box-shadow: $btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);
} @else {
box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);
}
}
}

它有这么一个变量$enable-shadows,就是开不开启阴影效果,在variables中定义是关闭的,但是它的else逻辑会走另一个box-shadow逻辑,点进去发现btn-focus-width定义为.2rem,将其改为0之后解决问题,当然我们也可以去掉else中的逻辑,同样可以解决,建议修改变量方式,后面要添加阴影效果可以灵活改变。

总结一下,Bootstrap预置了好多变量,如果我们要修改某一个组件样式的话,应该从源码一步一步找到对应定义变量,然后在变量上做修改,不论是修改还是维护都很方便,就放在variable.scss这个文件中,它的变量定义后面都加了!default,意思就是如果前面没有定义这个变量的话,就采用这个默认值,所以我们在修改的时候可以创建一个我们自己的variables.scss文件,然后在其中写入要修改的变量以及值,这样的好处就是如果bootstrap进行升级的话,可以进行平滑过渡而不用修改任何东西。