[react]16、CSS樣式

1稀拐、CSS樣式

一火邓、內(nèi)聯(lián)樣式

內(nèi)聯(lián)樣式是官方推薦的一種css樣式的寫法:

  • style 接受一個采用小駝峰命名屬性的 JavaScript 對象,钩蚊,而不是 CSS 字符串;
  • 并且可以引用state中的狀態(tài)來設置相關的樣式;

內(nèi)聯(lián)樣式的優(yōu)點:

  • 內(nèi)聯(lián)樣式, 樣式之間不會有沖突
  • 可以動態(tài)獲取當前state中的狀態(tài)

內(nèi)聯(lián)樣式的缺點:

  • 1.寫法上都需要使用駝峰標識
  • 2.某些樣式?jīng)]有提示
  • 3.大量的樣式, 代碼混亂
  • 4.某些樣式無法編寫(比如偽類/偽元素)

二贡翘、普通的css

  • 普通的css我們通常會編寫到一個單獨的文件,之后再進行引入砰逻。
  • 這樣的編寫方式和普通的網(wǎng)頁開發(fā)中編寫方式是一致
  • 這種編寫方式最大的問題是樣式之間會相互層疊掉;
// style.css
#app > .title { // app 下的title className
    color: red;
}

三鸣驱、css modules

  • css modules并不是React特有的解決方案,而是所有使用了類似于webpack配置的環(huán)境下都可以使用的蝠咆。

    • 如果在其他項目中使用個踊东,那么我們需要自己來進行配置,比如配置webpack.config.js中的modules: true等
  • React的腳手架已經(jīng)內(nèi)置了css modules的配置:

    • css/.less/.scss 等樣式文件都修改成 .module.css/.module.less/.module.scss 等
  • css modules確實解決了局部作用域的問題

  • 但是這種方案也有自己的缺陷:

    • 引用的類名刚操,不能使用連接符(.home-title)闸翅,在JavaScript中是不識別的;
    • 所有的className都必須使用{style.className} 的形式來編寫;
    • 不方便動態(tài)來修改某些樣式,依然需要使用內(nèi)聯(lián)樣式的方式;
// styled.module.css
.title {
    font-size: 30px;
    color: blue;
}
.banner {
    color: orange;
}

四菊霜、CSS in JS

“CSS-in-JS” 是指一種模式坚冀,其中 CSS 由 JavaScript 生成而不是在外部文件中定義;
注意此功能并不是 React 的一部分,而是由第三方庫提供鉴逞。 React 對樣式如何定義并沒有明確態(tài)度;

  • 在傳統(tǒng)的前端開發(fā)中记某,我們通常會將結構(HTML)、樣式(CSS)构捡、邏輯(JavaScript)進行分離
    • 但是在前面的學習中液南,我們就提到過,React的思想中認為邏輯本身和UI是無法分離的勾徽,所以才會有了JSX的語法
    • 樣式也是屬于UI的一部分
    • 事實上CSS-in-JS的模式就是一種將樣式(CSS)也寫入到JavaScript中的方式滑凉,并且可以方便的使用JavaScript的狀態(tài)
    • 所以React有被人稱之為 All in JS;

2、styled-components

CSS-in-JS通過JavaScript來為CSS賦予一些能力喘帚,包括類似于CSS預處理器一樣的樣式嵌套畅姊、函數(shù)定義、邏輯復用吹由、動態(tài)修
改狀態(tài)等等;
依然CSS預處理器也具備某些能力涡匀,但是獲取動態(tài)狀態(tài)依然是一個不好處理的點;
所以,目前可以說CSS-in-JS是React編寫CSS最為受歡迎的一種解決方案;

  • 目前比較流行的CSS-in-JS的庫有溉知,styled-components、emotion、glamorous
  • 前可以說styled-components依然是社區(qū)最流行的CSS-in-JS庫
  • 安裝styled-components:yarn add styled-components
    1级乍、styled的樣式繼承關系
import React, { PureComponent } from 'react'
import Profile from '../profile'
import Home from '../home'
import styled, {ThemeProvider} from 'styled-components'

const HYButton = styled.button`
padding: 10px 20px;
color: red;
`
const HYPrimaryButton = styled(HYButton)`
    font-size: 10;
`
export default class App extends PureComponent {
    render() {
        return (
            <ThemeProvider id="app" theme={{themeColor: "green", fontSize: "30px"}}>
                <Home />
                <Profile />
                <HYButton>我是一個普通的按鈕</HYButton>
                <HYPrimaryButton>我我一個高級按鈕</HYPrimaryButton>
            </ThemeProvider>
        )
    }
}

2舌劳、styled元素中的不同狀態(tài)

// style.js
import styled from 'styled-components'

// span 的狀態(tài)為active hover after,寫法加&
// 可以給尾內(nèi)和尾部添加元素:: aaa
export const HomeWrapper = styled.div`
    font-size: 50px;
    color: red;

    .banner {
        background-color: blue;
        span {
            color: #fff;
            &.active { 
                color: #f00;
            }
            &:hover {
                color: green;
            }
            &::after {
                content: "aaa";
            }
        }
        
    }
`
// ThemeProvider屬性獲取
export const TitleWrapper = styled.h2`
    text-decoration: underline;
    font-size: ${props => props.theme.fontSize};
    color: ${props => props.theme.themeColor};
`
// index.js
import React, { PureComponent } from 'react'
import {HomeWrapper, TitleWrapper} from './style'

export default class Home extends PureComponent {
    render() {
        return (
            <HomeWrapper >
                <TitleWrapper >我是Home的標題</TitleWrapper>
                <div className="banner">
                    <span className="active">輪播圖1</span>
                    <span>輪播圖2</span>
                    <span>輪播圖3</span>
                </div>
            </HomeWrapper>
        )
    }
}

3、props傳遞屬性

import React, { PureComponent } from 'react'
import styled from 'styled-components'
import sytled from 'styled-components'

/** 標簽模板字符串
 * 1玫荣、props穿透
 * 2甚淡、attrs的使用
 * 3、傳入state作為props屬性
 */

const HYInput = styled.input.attrs({
    placeholder: "coderwhy",
    bColor: "yellow" // 設置bColor變量
})`
background-color: green;
border-color: ${props => props.bColor}; 
color: ${props => props.color};
`

export default class Profile extends PureComponent {
    constructor(props) {
        super(props);
        this.state = {
            color: "yellow"
        }
    }
    render() {
        return (
            <div >
                <input type={"password"}></input>
                <HYInput type={"text"} color={this.state.color}></HYInput>
                <h2 >我是Profile的標題</h2>
                <ul >
                    <li>設置列表1</li>
                    <li>設置列表2</li>
                    <li>設置列表3</li>
                    <li>設置列表4</li>
                </ul>
            </div>
        )
    }
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捅厂,一起剝皮案震驚了整個濱河市贯卦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焙贷,老刑警劉巖撵割,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辙芍,居然都是意外死亡啡彬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門故硅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庶灿,“玉大人,你說我怎么就攤上這事吃衅⊥撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵徘层,是天一觀的道長峻呕。 經(jīng)常有香客問我,道長惑灵,這世上最難降的妖魔是什么山上? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮英支,結果婚禮上佩憾,老公的妹妹穿的比我還像新娘。我一直安慰自己干花,他們只是感情好妄帘,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著池凄,像睡著了一般抡驼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肿仑,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天致盟,我揣著相機與錄音碎税,去河邊找鬼。 笑死馏锡,一個胖子當著我的面吹牛雷蹂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杯道,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼匪煌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了党巾?” 一聲冷哼從身側響起萎庭,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎齿拂,沒想到半個月后驳规,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡创肥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年达舒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叹侄。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡巩搏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趾代,到底是詐尸還是另有隱情贯底,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布撒强,位于F島的核電站禽捆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏飘哨。R本人自食惡果不足惜胚想,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芽隆。 院中可真熱鬧浊服,春花似錦、人聲如沸胚吁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腕扶。三九已至孽拷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間半抱,已是汗流浹背脓恕。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工膜宋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炼幔。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓激蹲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親江掩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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