Hướng dẫn style css reactjs

Hướng dẫn style css reactjs

Đã đăng vào thg 2 22, 2018 3:14 SA 2 phút đọc

CSS Stylesheet

Đơn giản là bạn chỉ cần import file CSS vào component bạn muốn style.

Ví dụ ta có file DottedBox.css như sau

.DottedBox {
  margin: 40px;
  border: 5px dotted pink;
}

.DottedBox_content {
  font-size: 15px;
  text-align: center;
}

Để dùng CSS này style cho component DottedBox, ta import file này vào component DottedBox.

import React from 'react';
import './DottedBox.css';

const DottedBox = () => (
  

Get started with CSS styling

); export default DottedBox;

Inline styling

Với React, inline style không được thể hiện bằng một string mà bằng một object.

Ví dụ component Box:

import React from 'react';

const divStyle = {
  margin: '40px',
  border: '5px solid pink'
};

const pStyle = {
  fontSize: '15px',
  textAlign: 'center'
};

const Box = () => (

Get started with inline style

); export default Box;

Ta có thể tạo biến để lưu những style object này và truyền vào element bằng style={tenBien} hoặc ta có thể style trực tiếp element ví dụ style={{color: 'pink'}}.

CSS Modules

Với việc dùng CSS Module tên class và animation được giới hạn để chỉ apply cho riêng một component.

Ví dụ file DashedBox.css:

:local(.container) {
  margin: 40px;
  border: 5px dashed pink;
}

:local(.content) {
  font-size: 15px;
  text-align: center;
}

:local(.tenClass) khi dùng với create-react-app.tenClass khi không dùng với create-react-app. Ta import file CSS vào component và access tên class trong file CSS giống như ta access một object vậy.

import React from 'react';
import styles from './DashedBox.css';

const DashedBox = () => (
  

Get started with CSS Modules style

); export default DashedBox;

Như ở trên apply style của class container cho một div với . Tên của class trong file CSS sẽ tự động trở thành tên class của element mà nó style. Ta cũng cần cấu hình Webpack để CSS module hoạt động.

. . .
{
 test: /\.css$/,
 loader: 'style!css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]'
}
. . .

Kết quả có được sau khi build là tên class của CSS và element đều là duy nhất với hash code đi kèm.

HTML

Get started with CSS Modules style

CSS

.DashedBox__container__1DA66 {
  margin: 40px;
  border: 5px dashed pink;
}

.DashedBox__content__X37D1 {
  font-size: 15px;
  text-align: center;
}

Styled-components

Styled-components là một thư viện dành cho React và React Native giúp cho việc viết style CSS ngay trong một component.

Xét component FormWrapper sau:

import React from "react"
import styled from "styled-components"

const Input = styled.input`
 background: green
`

const FormWrapper = () => 

export default FormWrapper
  • Đầu tiên ta cần cài đặt style-component npm install styled-components --save hoặc yarn add styled-components
  • Import Styled-components vào component import styled from 'styled-components'
  • Tạo những wrapper dùng để style element bằng style.`style cua element` và sử dụng chúng để render

Kết quả sau khi build ta cũng được html và CSS với tên class là duy nhất.

HTML

Send

CSS

.dxLjPX {
  background: green
}

Tham khảo

Modular CSS with React

Four ways to style react components

All rights reserved

JSX mang đến cho chúng ta sự tiện lợi khi kết hợp cú pháp HTML và JavaScript trong một file trong React. và Nó cũng cho phép chúng ta viết mã CSS ben trong tệp React JSX của bạn. Tuy nhiên, có 1 số nhược điểm khi bạn cố gắng Debug các component theo style của bạn. Trong bài viết này mình sẽ giới thiệu 1 số cách style component dể việc debug dễ dàng hơn. (go)

Bắt đầu

Đầu tiên chúng ta hãy xây dựng 1 component như sau :

export default () => (
    <div className="content">
        <div className="content__img" />
            <div className="content__info">
            <div className="content__title">APeach Baby Doll</div>
            <div className="content__description">
                노래를 들으며 은은한 램프를 느낄 수 있는 무드 사운드입니다.
                스피커와 동시에 무드등으로 사용하실 수 있어요.
            </div>
        </div>
  </div>
)

và 1 file CSS


.content{
  width: 80%;
  height: 300px;
  box-shadow: 0 0 5px 2px #ccc;
}

.content__img{
  display: inline-block;
  width: 300px;
  height: 100%;
  background-image: url('https://picsum.photos/300/300?image=1062');
}

.content__info{
  display: inline-block;
  vertical-align: top;
  width: calc(100% - 300px);
  height: 100%;
  text-align: left;
}

.content__title{
  padding: 20px 0 0 20px;
  font-size: 48px;
}

.content__description{
  padding: 20px;
  font-size: 30px;
  font-style: italic;
  color: #888888;
}

.content--skyblue{
  color: skyblue;
}

sau đó ta thu được kết quả như sau :

Hướng dẫn style css reactjs

Okay . giờ mình muốn làm cho tile APeach Baby Doll có màu khác thì phải làm như thế nào ?

Chúng sẽ truyền cho Content.jsx 1 props và đặt tên là skyblue

class App extends Component {
  render() {
    return (
      <div className="App">
        <Content skyblue/>
      </div>
    )
  }
}

Bây giờ , chúng ta có thể thay đổi các thuộc tính CSS của Content.jsx dựa trên skyblue . Mình sẽ giới thiệu cho các bạn 2 phương pháp thêm các thuộc tính CSS mới thông qua CSS chung

Inline Style

export default ({ skyblue }) => {
    /* inline-style */
    let style = {}
    if (skyblue) {
      style = { color: 'skyblue' }
    }
  
    return (
        <div className="content">
            <div className="content__img" />
            <div className="content__info">
                <div style={style} className="content__title">APeach Baby Doll</div>
                <div className="content__description">
                    노래를 들으며 은은한 램프를 느낄 수 있는 무드 사운드입니다.
                    스피커와 동시에 무드등으로 사용하실 수 있어요.
                </div>
            </div>
      </div>
    )
}

Như bạn có thể thấy , mình lấy skyblue như một điều kiện để thêm các thuộc tính CSS vào đối tượng .Sau đó chúng ta inject đối tượng kiểu như một kiểu inline style. Bây giờ kết quả sẽ như thế này.

Hướng dẫn style css reactjs

Màu của tiêu đề bây giờ là màu xanh da trời như yêu cầu .

Bây giờ chúng ta sẽ chuyển qua cách thứ 2.

Thêm các Class CSS mới

import React from 'react'
import './content.css'

export default ({ skyblue }) => {

  /* add new css classes */
    let titleStyles = ['content__title']
    if (skyblue) {
        titleStyles.push('content--skyblue')
    }

    return (
        <div className="content">
            <div className="content__img" />
            <div className="content__info">
                <div className={titleStyles.join(' ')}>APeach Baby Doll</div>
                <div className="content__description">
                노래를 들으며 은은한 램프를 느낄 수 있는 무드 사운드입니다.
                스피커와 동시에 무드등으로 사용하실 수 있어요.
                </div>
            </div>
        </div>
    )
}

Mình đã tạo một lớp CSS được gọi là content--skyblue. Điều này là đơn giản để làm cho màu xanh da trời. Mình muốn thêm lớp này vào tiêu đề* Chú chó con dễ thương*. Những gì chúng ta đang làm là tạo một mảng để lưu trữ các lớp CSS, sau đó sử dụng phương thức join để phân chia các lớp với spave. Vì vậy, bây giờ, className sẽ như thế này

 <div className="content__title content--skyblue">APeach Baby Dolldiv> 

Nhìn vào 2 cách trên bạn có thể thấy rằng chúng không tiện sửa đổi đặc biệt khi gặp trường hợp UI phức tạp. Không ai muốn viết nhiều câu điều kiện để style cho các component của mình phải không nào ? Đó là lý do tại sao mình muốn giới thiệu đến các bạn Styled-components

Styled-components

Use the best bits of ES6 and CSS to style your apps without stress Các style Component là 1 thư viện giúp bạn dễ dàng thay đổi các thuộc tính CSS. Bạn chỉ cần install chúng qua npm hoặc yarn bằng câu lệnh sau :

npm install styled-components --save hoặc yarn add styled-components

Sau đó sử dụng styled-components để styles cho components của bạn. chúng ta sẽ tiếp tục thực hiện với ví dụ trên.


import React from 'react'
import styled from 'styled-components'

const ContentWrapper = styled.div`
  width: 80%;
  height: 300px;
  box-shadow: 0 0 5px 2px #ccc;
`

const Img = styled.div`
  display: inline-block;
  width: 300px;
  height: 100%;
  background-image: url('https://picsum.photos/300/300?image=1062');
`

const InfoWrapper = styled.div`
  display: inline-block;
  vertical-align: top;
  width: calc(100% - 300px);
  height: 100%;
  text-align: left;
`

const Title = styled.div`
  padding: 20px 0 0 20px;
  font-size: 48px;
  color: ${props => (props.skyblue ? 'skyblue' : 'black')};
`

const Description = styled.div`
  padding: 20px;
  font-size: 30px;
  font-style: italic;
  color: #888888;
`

export default ({ skyblue }) => {
    return (
        <ContentWrapper>
            <Img />
            <InfoWrapper>
                <Title>APeach Baby Doll</Title>
                <Description>
                노래를 들으며 은은한 램프를 느낄 수 있는 무드 사운드입니다.
                스피커와 동시에 무드등으로 사용하실 수 있어요.
                </Description>
            </InfoWrapper>
        </ContentWrapper>
    )
}

Để sử dụng được chúng ta cần import styled-components vào component của mình. Chúng ta import nó như là một tên gọi styled. Sau đó chúng ta định nghĩa phần tử HTML nào sẽ được sử dụng cho từng thành phần được style . Ví dụ

const Button = styled.button` /* CSS Properties */ `

Nó có nghĩa là components Button này là viết tứ theo styled-component render 1**