React項(xiàng)目樣式管理規(guī)范

在最近的工作中,大大小小已開發(fā)過數(shù)個(gè)基于react的前端項(xiàng)目须喂,從一開始的單打獨(dú)斗到現(xiàn)在的多人協(xié)作開發(fā),由于缺乏規(guī)范趁蕊,樣式管理一直是開發(fā)中的痛點(diǎn)坞生,樣式污染,難以定制化掷伙,依賴性高是己,各種問題層出不窮。痛定思痛任柜,我們針對(duì)開發(fā)中遇到的問題并總結(jié)開發(fā)中的實(shí)際經(jīng)驗(yàn)和網(wǎng)上的主流解決方案卒废,最終形成一套樣式管理規(guī)范。

本文首先對(duì)樣式進(jìn)行了分類宙地,然后詳細(xì)講解了不同類別樣式的管理方法摔认。本樣式管理規(guī)范只針對(duì)我們的項(xiàng)目,但對(duì)其他React項(xiàng)目也有普遍適用性宅粥,可以根據(jù)自己的需求進(jìn)行個(gè)性化的定制與修改参袱。

樣式分類

對(duì)于react項(xiàng)目,可以大致將樣式分為四類:

  1. 公共樣式
  2. 第三方樣式
  3. 容器樣式,即container樣式
  4. 組件樣式蓖柔,即component樣式

前兩類樣式的管理與傳統(tǒng)前端項(xiàng)目并無差異辰企,react項(xiàng)目的重點(diǎn)在于后兩類樣式的管理风纠。

公共樣式

主要包括:

  1. reset——樣式重置及設(shè)置默認(rèn)值况鸣,通常包括normalize.css和base.css,可根據(jù)需求定制
  2. layout——項(xiàng)目主體框架布局的相關(guān)樣式
  3. variable——存放sass變量竹观,主要包括各種主題顏色镐捧、按鈕顏色
  4. mixin——可復(fù)用的樣式片段,包括清除浮動(dòng)臭增、圓角邊框懂酱、文本溢出省略顯示、文本強(qiáng)制換行

引入方式:reset樣式在入口文件index.html中通過link標(biāo)簽引入誊抛,layout也可以在index.html引入列牺。如果在layout中使用sass,可以與其他文件統(tǒng)一放在styles文件夾中拗窃,在index.js中引入瞎领。對(duì)于variable和mixin,同樣放在styles文件夾中随夸,如果文件體積較小九默,可以合并成一個(gè)文件。

styles文件夾

variable.scss

// 主色
$primary-color          : #5a8def;

// 標(biāo)準(zhǔn)色
$green                  : #117511;
$red                    : #950505;
$blue                   : #5a8def;

// 文字顏色宾毒、標(biāo)題顏色驼修、背景顏色、字體大小
$body-background        : #fff;
$text-color             : #666;
$text-color-secondary   : #999;
$font-size-sm           : 12px;
$font-size-base         : 12px;
$font-size-lg           : 14px;

// 邊框顏色以及圓角
$border-color-base      : #d9d9d9;        
$border-color-split     : #e9e9e9;        
$border-base            : 1px solid #d9d9d9;
$border-split           : 1px solid #e9e9e9;
$border-radius-base     : 0px;
$border-radius-lg       : 4px;

// 行高
$line-height-sm         : 28px;
$line-height-normal     : 30px;
$line-height-lg         : 36px;

// 間距
$space-sm               : 5px;
$space-base             : 10px;
$space-lg               : 20px;

mixin.scss

// 清除浮動(dòng)
@mixin clearfix() {
    &:before,
    &:after {
        content: "";
        display: table;
    }
    &:after {
        clear: both;
    }
}

.container {
    @include clearfix;
}

// 圓角邊框
@mixin border-radius($radius) {
    -webkit-border-radius: $radius;
     -moz-border-radius: $radius;
      -ms-border-radius: $radius;
          border-radius: $radius;
}

.box {
    @include border-radius(10px);
}

// 文本溢出省略顯示
@mixin text-ellipsis () {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

第三方樣式

主要是第三方類庫(kù)的依賴樣式诈铛,一般通過link標(biāo)簽引入乙各。

引入方式:index.html通過link標(biāo)簽引入

容器樣式

容器即container,一般不為container單獨(dú)編寫樣式文件幢竹,將所有容器的樣式提取到一個(gè)文件中(暫定為container.scss耳峦,放在styles文件夾中),這樣可以避免樣式污染妨退,提高代碼復(fù)用性妇萄。類名命名采用類BEM的方式(開發(fā)人員表示不太習(xí)慣傳統(tǒng)BEM命名,所以進(jìn)行了改進(jìn))咬荷,在項(xiàng)目開始前冠句,前端開發(fā)人員集中對(duì)頁(yè)面進(jìn)行統(tǒng)一分析,分解為模塊并命名幸乒。之后添加新類名要與其他開發(fā)人員統(tǒng)一確認(rèn)懦底,并保證無重名。

引入方式:放在styles文件夾中罕扎,在入口index.js引入

類BEM命名

// 主要由三部分組成:塊名聚唐、元素名丐重、狀態(tài)
.blockName-elName.modifier

// 例
.shopCart
.shopCart-title
.shopCart-item
.shopCart-item.selected

.menu
.menu-item
.menu-item.active

組件樣式

根據(jù)React的組件化開發(fā)思想,同時(shí)為了避免CSS的全局作用域的影響杆查,對(duì)于組件即component的樣式扮惦,我們采用css-in-js的方案。我們的項(xiàng)目中使用的是styled-components亲桦,它是目前 React 樣式方案中最受關(guān)注的一種崖蜜,它既具備了 css-in-js 的模塊化與參數(shù)化優(yōu)點(diǎn),又完全使用CSS的書寫習(xí)慣客峭,不會(huì)引起額外的學(xué)習(xí)成本豫领。

Styled-components

import React from 'react';

import styled from 'styled-components';

// Title組件將生成一個(gè)字體大小1.5em,居中對(duì)齊舔琅,紅色文字的h1標(biāo)簽
const Title = styled.h1`
  font-size: 1.5em;
  text-align: center;
  color: red;
`;

//Wrapper組件將生成一個(gè)內(nèi)邊距為4em等恐,背景顏色為白色的section標(biāo)簽
const Wrapper = styled.section`
  padding: 4em;
  background: white;
`;

// 使用方法和正常的React組件一樣
<Wrapper>
  <Title>Hello World, this is my first styled component!</Title>
</Wrapper>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市备蚓,隨后出現(xiàn)的幾起案子课蔬,更是在濱河造成了極大的恐慌,老刑警劉巖星著,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件购笆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡虚循,警方通過查閱死者的電腦和手機(jī)同欠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來横缔,“玉大人铺遂,你說我怎么就攤上這事【ジ眨” “怎么了襟锐?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)膛锭。 經(jīng)常有香客問我粮坞,道長(zhǎng),這世上最難降的妖魔是什么初狰? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任莫杈,我火速辦了婚禮,結(jié)果婚禮上奢入,老公的妹妹穿的比我還像新娘筝闹。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布关顷。 她就那樣靜靜地躺著糊秆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪议双。 梳的紋絲不亂的頭發(fā)上痘番,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音聋伦,去河邊找鬼夫偶。 笑死界睁,一個(gè)胖子當(dāng)著我的面吹牛觉增,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翻斟,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逾礁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了访惜?” 一聲冷哼從身側(cè)響起嘹履,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎债热,沒想到半個(gè)月后砾嫉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窒篱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年焕刮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墙杯。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡配并,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出高镐,到底是詐尸還是另有隱情溉旋,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布嫉髓,位于F島的核電站观腊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏算行。R本人自食惡果不足惜梧油,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纱意。 院中可真熱鬧婶溯,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至叙身,卻和暖如春渔扎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背信轿。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工晃痴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人财忽。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓倘核,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親即彪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子紧唱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評(píng)論 25 707
  • 藍(lán)天漏益、白云、陽(yáng)光深胳、風(fēng)和你绰疤。 冬天的洱海是安靜的,極少的大風(fēng)吹起大浪舞终。 清晨太陽(yáng)慵懶地從蒼山的肩上爬起轻庆,給靜謐得洱海...
    木子and子木閱讀 384評(píng)論 0 3
  • 新的一天 No.118 又是一個(gè)下雨天,每一個(gè)路口似乎都是氤氳著权埠,欲說還休榨了。 背上電腦,買了一包MM豆攘蔽,走進(jìn)咖啡館...
    水淺_bling閱讀 147評(píng)論 0 1
  • 我是一個(gè)十分吝嗇的人龙屉。 就拿今晚上去洗腳為例,給我?服務(wù)的美女满俗,身材婀娜到噴血转捕,長(zhǎng)發(fā)飄飄一身黑絲,十分惹火唆垃。 我明...
    不用多說什么閱讀 346評(píng)論 0 0
  • 這是一個(gè)傳統(tǒng)媒體哀鴻遍野的時(shí)代辕万。 幾乎每天都能看到鋪天蓋地的消息枢步,這個(gè)報(bào)社的主編離職啦沉删,那個(gè)報(bào)社的主編跳槽啦,哎呀...
    霜寒烈日閱讀 1,414評(píng)論 5 14