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);
  }
}
// 產(chǎn)品狀態(tà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原樣式矩动,網(wǎng)頁風格像bs4還行,不然改的也太多了释漆!

第一次升級 自定義bs4

按官網(wǎng)的自己編譯bs4悲没,在nuxt.config.js的modules的下面配置bootstrapVue,官網(wǎng):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
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市骗污,隨后出現(xiàn)的幾起案子崇猫,更是在濱河造成了極大的恐慌,老刑警劉巖需忿,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诅炉,死亡現(xiàn)場離奇詭異,居然都是意外死亡屋厘,警方通過查閱死者的電腦和手機涕烧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汗洒,“玉大人议纯,你說我怎么就攤上這事∫绨” “怎么了瞻凤?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長世杀。 經(jīng)常有香客問我阀参,道長,這世上最難降的妖魔是什么瞻坝? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任蛛壳,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘衙荐。我一直安慰自己捞挥,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布赫模。 她就那樣靜靜地躺著树肃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瀑罗。 梳的紋絲不亂的頭發(fā)上胸嘴,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音斩祭,去河邊找鬼劣像。 笑死,一個胖子當著我的面吹牛摧玫,可吹牛的內容都是我干的耳奕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼诬像,長吁一口氣:“原來是場噩夢啊……” “哼屋群!你這毒婦竟也來了?” 一聲冷哼從身側響起坏挠,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤芍躏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后降狠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體对竣,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年榜配,在試婚紗的時候發(fā)現(xiàn)自己被綠了否纬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛋褥,死狀恐怖临燃,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情烙心,我是刑警寧澤膜廊,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站弃理,受9級特大地震影響溃论,放射性物質發(fā)生泄漏屎蜓。R本人自食惡果不足惜痘昌,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辆苔,春花似錦算灸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骑冗,卻和暖如春赊瞬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贼涩。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工巧涧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遥倦。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓谤绳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親袒哥。 傳聞我的和親對象是個殘疾皇子缩筛,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容