上一次主要介绍了Bootstrap源码的文件分类,没有进行重写样式的具体操作,这次以button样式为例记一次踩坑记录。
只要用过Bootstrap的朋友应该都知道,它的button样式在点击后默认是有一圈跟button颜色相近的东东(线条?outline?shadow?暂时先这样称呼),那么该如何去掉呢,网上大部分人的做法是引入bootstrap的样式后再引入自己的样式进行重写,但是我们要进行的是定制化,也就是在源码中修改。
踩坑记录
一开始直接就从3方面修改:
- outline: 0;
- border: 0;
- box-shadow: none;
神奇的是,怎么改都不起作用,自己重新写一个button之后按照上面的样式定义是起作用的,所以还是bootstrap的源码有些地方没修改到。
源码追查
- 它的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, &:disabled { opacity: $btn-disabled-opacity; @include box-shadow(none); }
&: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这一项,但是并没有效果。
- .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 { @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进行升级的话,可以进行平滑过渡而不用修改任何东西。