[react]16、CSS样式

1、CSS样式

一、内联样式

内联样式是官方推荐的一种css样式的写法:

  • style 接受一个采用小驼峰命名属性的 JavaScript 对象,,而不是 CSS 字符串;
  • 并且可以引用state中的状态来设置相关的样式;

内联样式的优点:

  • 内联样式, 样式之间不会有冲突
  • 可以动态获取当前state中的状态

内联样式的缺点:

  • 1.写法上都需要使用驼峰标识
  • 2.某些样式没有提示
  • 3.大量的样式, 代码混乱
  • 4.某些样式无法编写(比如伪类/伪元素)

二、普通的css

  • 普通的css我们通常会编写到一个单独的文件,之后再进行引入。
  • 这样的编写方式和普通的网页开发中编写方式是一致
  • 这种编写方式最大的问题是样式之间会相互层叠掉;
// style.css
#app > .title { // app 下的title className
    color: red;
}

三、css modules

  • css modules并不是React特有的解决方案,而是所有使用了类似于webpack配置的环境下都可以使用的。

    • 如果在其他项目中使用个,那么我们需要自己来进行配置,比如配置webpack.config.js中的modules: true等
  • React的脚手架已经内置了css modules的配置:

    • css/.less/.scss 等样式文件都修改成 .module.css/.module.less/.module.scss 等
  • css modules确实解决了局部作用域的问题

  • 但是这种方案也有自己的缺陷:

    • 引用的类名,不能使用连接符(.home-title),在JavaScript中是不识别的;
    • 所有的className都必须使用{style.className} 的形式来编写;
    • 不方便动态来修改某些样式,依然需要使用内联样式的方式;
// styled.module.css
.title {
    font-size: 30px;
    color: blue;
}
.banner {
    color: orange;
}

四、CSS in JS

“CSS-in-JS” 是指一种模式,其中 CSS 由 JavaScript 生成而不是在外部文件中定义;
注意此功能并不是 React 的一部分,而是由第三方库提供。 React 对样式如何定义并没有明确态度;

  • 在传统的前端开发中,我们通常会将结构(HTML)、样式(CSS)、逻辑(JavaScript)进行分离
    • 但是在前面的学习中,我们就提到过,React的思想中认为逻辑本身和UI是无法分离的,所以才会有了JSX的语法
    • 样式也是属于UI的一部分
    • 事实上CSS-in-JS的模式就是一种将样式(CSS)也写入到JavaScript中的方式,并且可以方便的使用JavaScript的状态
    • 所以React有被人称之为 All in JS;

2、styled-components

CSS-in-JS通过JavaScript来为CSS赋予一些能力,包括类似于CSS预处理器一样的样式嵌套、函数定义、逻辑复用、动态修
改状态等等;
依然CSS预处理器也具备某些能力,但是获取动态状态依然是一个不好处理的点;
所以,目前可以说CSS-in-JS是React编写CSS最为受欢迎的一种解决方案;

  • 目前比较流行的CSS-in-JS的库有,styled-components、emotion、glamorous
  • 前可以说styled-components依然是社区最流行的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元素中的不同状态

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

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

推荐阅读更多精彩内容