在weex中愉快的使用scss的方法步驟
weex 是一個(gè)可以利用 vue 或者 Rax 編寫跨平臺(tái)手機(jī)應(yīng)用的框架。為了讓在 weex 有更好的樣式編寫體驗(yàn),遂有了以下的方案。
1.初始化一個(gè) weex 工程
npm install weex-toolkit -g weex create weex-test cd weex-test npm run start
這時(shí)候就可以在瀏覽器看到界面了
2.接著為了可以在vue里面寫scss, 我們需要安裝兩個(gè)東西, sass-loader、node-sass
npm install -D sass-loader@7.3.1 node-sass
在這里要注意一點(diǎn)sass-loader要安裝 7 版本的,不然會(huì)報(bào)錯(cuò),這是因?yàn)閟ass版本高導(dǎo)致的,接下來(lái)就可以愉快的寫scss,還要注意一點(diǎn)需要在style標(biāo)簽加上語(yǔ)言標(biāo)記scss
<style lang="scss"> </style>
3.為了更好的組織項(xiàng)目結(jié)夠和樣式的統(tǒng)一,我們會(huì)把一些主題顏色、字體大小、文字顏色提取到一個(gè)scss文件,我們把它命名為variable.scss如下:
$theme-color: blue; $font-big: 32px; $font-nor: 28px; $font-small: 24px;
我們把它放到項(xiàng)目的src/common/scss下, 需要的時(shí)候就在vue文件中引用, 比如在 index.vue 頁(yè)面引用
<style lang="scss">
@import './common/scss/variable.scss'
div {
background-color: $theme-color;
}
</style>
這樣就可以讓應(yīng)用的主體部分的樣式保持一致了。
4.在 weex 中有一些屬性不支持簡(jiǎn)寫的方式比如 border,還有一些需要寫兩三條的樣式如文字超出隱藏,這種樣式我們可以將它們定義成scss的混合宏(mixin),我們把它命名為mixins.scss
@mixin border($width, $style, $color) {
border-width: $width;
border-style: $style;
border-color: $color;
}
@mixin border-top($width, $style, $color) {
border-top-width: $width;
border-top-style: $style;
border-top-color: $color;
}
我們把它放到項(xiàng)目的src/common/scss下, 需要的時(shí)候就在vue文件中引用, 比如在 index.vue 頁(yè)面引用
<style lang="scss">
@import './common/scss/variable.scss';
@import './common/scss/mixins.scss';
div {
@include border(1px, solid, $theme-color);
}
</style>
這樣我們就可以將一些常用的css代碼寫進(jìn)混合宏了
5.在weex中由于不支持類名的權(quán)重覆蓋,只支持后面的定義的同類樣式覆蓋前面的樣式,這樣就會(huì)導(dǎo)致我們不能很好的組織 css 代碼, 又不能利用 scss 的優(yōu)勢(shì)代碼層級(jí)嵌套。為此我們引入BEM命名方法,并通過(guò)scss的混合宏讓其在寫法上支持嵌套,首先我們?cè)?src/common/scss 下創(chuàng)建 bem.scss,并寫入如下代碼:
$namespace: '';
$element-separator: '__';
$modifier-separator: '--';
@mixin b($block) {
@if $namespace == '' {
$B: $block !global;
} @else {
$B: $namespace+'-'+$block !global;
}
@if '#{&}' == '' {
.#{$B} {
@content;
}
} @else {
@at-root {
.#{$B} {
@content;
}
}
}
}
@mixin e($element) {
$E: $element !global;
$selector: &;
@if str-index('#{&}', '__') {
@at-root {
.#{$B + $element-separator + $element} {
@content;
}
}
} @else {
@at-root {
#{&+$element-separator+$E} {
@content;
}
}
}
}
@mixin m($modifier)
$M: $modifier !global;
@at-root {
#{&+$modifier-separator+$M} {
@content;
}
}
}
由于weex不支持層級(jí)所以我們只能用@at-root將所有類名提升到第一層。接著我們?cè)趇ndex.vue中引入這個(gè)文件:
<template>
<div class="header">
<div :class="['header__back', `header__back--${status}`]"></div>
<div class="header__content"></div>
<div class="header__other"></div>
</div>
</template>
<script>
export default {
data(){
return {
status: 'black'
}
}
}
</script>
<style lang="scss">
@import './common/scss/variable.scss';
@import './common/scss/mixins.scss';
@import './common/scss/bem.scss'
@include b('header') {
height: 100px;
width: 750px;
flex-direction: row;
align-items: center;
@include e('back') {
flex: 1;
@include m('black') {
background-color: #000000;
}
@include m('white') {
background-color: #ffffff;
}
}
@include e('content') {
flex: 3;
}
@include e('other') {
flex: 1;
}
}
</style>
編譯后的樣式為:
.header {
height: 100px;
width: 750px;
flex-direction: row;
align-items: center;
}
.header__back {
flex: 1;
}
.header__back--black {
background-color: #000000;
}
.header__back--white {
background-color: #ffffff;
}
.header__content {
flex: 3;
}
.header__other {
flex: 1;
}
這樣看起來(lái)用scss的寫法代碼的結(jié)構(gòu)性和可維護(hù)性就會(huì)更好一些。
6.由于這三個(gè)文件都是需要在每一個(gè)vue文件引入的,為了偷一下懶,我們可以用sass-resources-loader 這個(gè)loader來(lái)讓每一個(gè)vue文件都注入這幾個(gè)scss文件
npm install -D sass-resources-loader
然后修改根目錄下的 configs/utils.js ,找到如下,進(jìn)行更改
const generateLoaders = (loader, loaderOptions) => {
let loaders = options.useVue ? [cssLoader] : []
if (options.usePostCSS) {
loaders.push(postcssLoader)
}
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
//這里加入以下代碼
if (loader === 'sass') {
loaders.push({
loader: 'sass-resources-loader',
options: {
resources: [
path.resolve(__dirname, '../src/common/scss/variable.scss'),
path.resolve(__dirname, '../src/common/scss/mixins.scss'),
path.resolve(__dirname, '../src/common/scss/bem.scss')
]
}
})
}
if (options.useVue) {
return ['vue-style-loader'].concat(loaders)
}
else {
return loaders
}
}
這樣就可以在weex工程中愉快的編寫scss了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript防抖與節(jié)流超詳細(xì)全面講解
在開發(fā)中我們經(jīng)常會(huì)遇到一些高頻操作,比如:鼠標(biāo)移動(dòng),滑動(dòng)窗口,鍵盤輸入等等,節(jié)流和防抖就是對(duì)此類事件進(jìn)行優(yōu)化,降低觸發(fā)的頻率,以達(dá)到提高性能的目的。本文就教大家如何實(shí)現(xiàn)一個(gè)讓面試官拍大腿的防抖節(jié)流函數(shù),需要的可以參考一下2022-10-10
關(guān)于在IE下的一個(gè)安全BUG --可用于跟蹤用戶的系統(tǒng)鼠標(biāo)位置
本篇文章小編將為大家介紹,關(guān)于在IE下的一個(gè)安全BUG --可用于跟蹤用戶的系統(tǒng)鼠標(biāo)位置。需要的朋友可以參考一下2013-04-04
Javascript實(shí)現(xiàn)鼠標(biāo)框選操作 不是點(diǎn)擊選取
這篇文章主要介紹了Javascript實(shí)現(xiàn)鼠標(biāo)框選操作,不是點(diǎn)擊選取,利用鼠標(biāo)進(jìn)行框選,感興趣的小伙伴們可以參考一下2016-04-04
js實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)易購(gòu)物車功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
JavaScript模板引擎實(shí)現(xiàn)原理實(shí)例詳解
這篇文章主要介紹了JavaScript模板引擎實(shí)現(xiàn)原理,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript模板引擎原理、定義、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-12-12
Javascript ES6中對(duì)象類型Sets的介紹與使用詳解
這篇文章主要給大家介紹了關(guān)于Javascript ES6中Sets的介紹與使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07
前端用echarts繪制含有多個(gè)分層的波形圖關(guān)鍵代碼
每次實(shí)現(xiàn)各種圖表時(shí),總會(huì)用到echarts,不得不說(shuō)確實(shí)是一個(gè)非常好用的開源庫(kù),這篇文章主要給大家介紹了關(guān)于前端用echarts繪制含有多個(gè)分層的波形圖的相關(guān)資料,需要的朋友可以參考下2024-03-03
利用了jquery的ajax實(shí)現(xiàn)二級(jí)聯(lián)互動(dòng)菜單
二級(jí)聯(lián)互動(dòng)菜單,利用了jquery的ajax實(shí)現(xiàn),具體實(shí)現(xiàn)如下,喜歡的朋友可以參考下2013-12-12
談?wù)勎覍?duì)JavaScript DOM事件的理解
DOM與事件是JavaScript最核心的組成部分之一,他們賦予了頁(yè)面無(wú)限的想象空間,你根本無(wú)法離開他們,否則js將寸步難行。本文給大家分享我對(duì)javascript dom事件的了解,對(duì)javascript dom事件相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2015-12-12

