nuxt.js里bootstrap4的最佳实践

当问别人会不会bootstrap4的时候,他们会说不就是link引入然后.btn就出来了,bootstrap4也许没那么简单。。。

bootstrap4太那个了,下文简称为bs4。本文主要介绍一下bs4在nuxt.js里的使用,其实不光在nuxt,只要是能编译scss的项目里都是一样的。建议最好自己能使用webpack4搭建一套bootstrap4的后台框架,熟悉scss的使用。

下面以升级的方式来介绍我在项目里如何使用bs4。

初版 bs4入门级

  1. 新建项目的时候选择 bootstrap
  2. nuxt.config.js 配置 css: [{ src: '~/assets/scss/app.scss' }]
  3. assets下新建scss/app.scss,这个scss文件跟bs4的scss文件毛关系也没有,全靠我的聪明才智写了一些方法,参考下:
// app.scss
// --------------------------------------------
$fc-white:     #fff;
$fc-dark6:     #666;
$fc-dark3:     #333;
$fc-red:       #dd3c3c;
$fc-green:     #61b633;
$fc-blue:      #53c3f1;
$fc-orange:    #ef7619;

// 拓展按钮、文字、背景颜色
$fc-colors: (
  "white":     $fc-white,
  "dark6":     $fc-dark6,
  "dark3":     $fc-dark3,
  "red":       $fc-red,
  "green":     $fc-green,
  "blue":      $fc-blue,
  "orange":    $fc-orange
);
@mixin fc-btn-color($parent, $color) {
  #{$parent} {
    color: $fc-white;
    background-color: $color;
    border-color: $color;
    &:hover {
      color: $fc-white;
      background-color: darken($color, 7.5%);
      border-color: darken($color, 10%);
    }
  }
}
@mixin fc-text-color($parent, $color) {
  #{$parent} {
    color: $color;
  }
}
@mixin fc-bg-color($parent, $color) {
  #{$parent} {
    background-color: $color;
  }
}
@each $color, $value in $fc-colors {
  @include fc-btn-color(".fc-btn-#{$color}", $value);
  @include fc-text-color(".fc-text-#{$color}", $value);
  @include fc-bg-color(".fc-bg-#{$color}", $value);
}

// 缩小col的margin间距
@media (min-width: 768px) {
  .row-m5 {
    margin-left: -5px;
    margin-right: -5px;
    .col-md-3,
    .col-md-4,
    .col-md-6,
    .col-md-8,
    .col-md-9,
    .col-md-m24 {
      padding-left: 5px;
      padding-right: 5px;
    }
  }
  .row-m10 {
    margin-left: -10px;
    margin-right: -10px;
    .col-md-3,
    .col-md-6,
    .col-md-9 {
      padding-left: 10px;
      padding-right: 10px;
    }
  }
}
// 去掉所有的focus阴影
@each $element in btn form-control {
  .#{$element}:focus {
    box-shadow: none;
  }
}
// margin-top 拓展
@for $i from 1 through 10 {
  .fc-mt-#{5 * $i} {
    margin-top:(5px * $i);
  }
}
// 产品状态
.state {
  position: absolute;
  left: 0;
  top: 0;
  display: block;
  width: 80px;
  height: 32px;
  font-size: 14px;
  line-height: 32px;
  text-align: center;
  color: #fff;
}
.state-sm {
  text-align: center;
  color: #fff;
  padding: 2px 5px;
  margin-right: 5px;
}
.state-green {
  background-color: #65a219;
}
.state-red {
  background-color: #dd3c3c;
}

自己写样式覆盖bs4原样式,网页风格像bs4还行,不然改的也太多了!

第一次升级 自定义bs4

按官网的自己编译bs4,在nuxt.config.js的modules的下面配置bootstrapVue,官网:https://bootstrap-vue.js.org/docs

// nuxt.config.js
modules: [
  ...
  'bootstrap-vue/nuxt'
],
bootstrapVue: {
  bootstrapCSS: false, // Or `css: false`
  bootstrapVueCSS: false // Or `bvCSS: false`
},
...

然后新建custom.scss来定义变量用来覆盖bs4的_variables.scss里的变量

// _custom.scss
// --------------------------------------------

// 覆盖bs4的变量
$blue:                     #52c3f1;
$green:                    #65a219;
$red:                      #dd3c3c;
$orange:                   #ef7619;
$enable-rounded:           false;
$input-btn-focus-width:    0;
$input-btn-focus-color:    transparent;
$font-size-base:           0.875rem;

// Then include the following
@import 'bootstrap/scss/bootstrap.scss';
@import 'bootstrap-vue/src/index.scss';

这里只是nuxt处理了一下,普通项目我们一般导入

@import "custom";
@import "~bootstrap/scss/bootstrap";

到这里基本达到我们的要求了,改bootstrap自带的东西也方便了。

第二次升级 提取公用变量

上面我们在custom.scss里定义的变量基本上都是我们页面频繁使用的,因此我们把它分离出来,新建var.scss,此时:

// _var.scss
// 覆盖bs4的变量
$blue:                     #52c3f1;
$green:                    #65a219;
$red:                      #dd3c3c;
$orange:                   #ef7619;
$enable-rounded:           false;
$input-btn-focus-width:    0;
$input-btn-focus-color:    transparent;
$font-size-base:           0.875rem;
// fc变量
$fc-test-color:            #f00;
// fc方法
@mixin fc-text-truncate() {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

// _custom.scss
// --------------------------------------------
@import "var";
// Then include the following
@import 'bootstrap/scss/bootstrap.scss';
@import 'bootstrap-vue/src/index.scss';

// xxxx.vue
<style lang="scss">
  @import "../../assets/scss/_var.scss";
  p {
    color: $red;
  }
</style>

这样在vue文件夹就可以直接导入var.scss使用了。

第三次升级 减少公用变量导入

上面每个组件导入var.scss也太麻烦了,于是新建style.scss,把vue里的scss提取出去,目录结构同pages,另外nuxt.config.js配置css: [{ src: '~/assets/scss/custom.scss' }, { src: '~/assets/scss/style.scss' }]

// style.scss
// 变量
@import "var";
// 布局
@import "layouts/layouts";
// 页面
@import "pages/common";
@import "pages/index";

// _common.scss
a {
  color: #212529;
  transition: all 0.3s;
  &:hover {
    text-decoration: none;
    color: $red;
  }
}
...

目录结构

scss
│  app.scss //废弃
│  custom.scss
│  style.scss
│  tree.md
│  _var.scss
│  
├─components
│  ├─index
│  │      _fc-banner.scss
│  │      _fc-panel.scss
│  │      ...
│  │      
│  ├─detail
│  │      _fc-tabs.scss
│  │      _fc-tip.scss
│  │      _fc-view.scss
│  │      
│  ├─...
│  │      
│  └─public
│      │  _help-area.scss
│      │  _login-header.scss
│      │  
│      ├─footer
│      │      _index.scss
│      │      
│      └─header
│              _index.scss
│              _nav-bar.scss
│              _search-bar.scss
│              _top-bar.scss
│              _user-bar.scss
│              
├─layouts
│      _layouts.scss
│      
└─pages
        _common.scss
        _index.scss
        _detail.scss
        ...

这样我们就能轻轻松松使用自定义的变量了!

第四次升级 使用bs4的方法

上面var.scss里我自定义了一个颜色fc-test-color和一个方法fc-text-truncate,其实bs4的scss自带了很多的方法,我们何不使用它们呢?
在style.scss导入

// style.scss
// 变量
@import "var";
// 使用bs4的方法
@import "bootstrap/scss/_functions.scss";
@import "bootstrap/scss/_variables.scss";
@import "bootstrap/scss/_mixins.scss";
// 布局
@import "layouts/layouts";
// 页面
@import "pages/common";
@import "pages/index";

你为什么会奇怪,不应该是后面的变量(variables.scss)覆盖前面(var.scss)的吗?其实是!default这个东西在起作用。

最后福利:图片路径问题

//scss图片路径
background: url('~@/assets/images/fc-banner01.jpg') no-repeat center top;
//js图片路径
imgSrc: require('~/assets/images/fc-banner01.jpg')
//vue图片路径
<img src="~assets/images/fc-logo.png" />

爱学习和捣鼓的小伙伴请加QQ群

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

推荐阅读更多精彩内容