溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

用CSS-in-JS來(lái)做的事情有哪些

發(fā)布時(shí)間:2021-11-06 16:31:57 來(lái)源:億速云 閱讀:161 作者:iii 欄目:web開(kāi)發(fā)

本篇內(nèi)容主要講解“用CSS-in-JS來(lái)做的事情有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“用CSS-in-JS來(lái)做的事情有哪些”吧!

除了傳統(tǒng)的 CSS,你還可以使用 內(nèi)聯(lián)樣式  CSS-in-JS 作為 React 應(yīng)用程序的樣式選項(xiàng)。

對(duì)于內(nèi)聯(lián)樣式,你可以將 JavaScript對(duì)象傳遞給樣式屬性:

const myStyle = {
  fontSize: 24,
  lineHeight: '1.3em',
  fontWeight: 'bold',
};
<span style={myStyle}>Hello World!</p>

然而,并非所有 CSS 特性都受支持。

另一方面,CSS-in-JS 是一種使用 JavaScript來(lái)設(shè)置組件樣式的技術(shù)。在解析此 JavaScript時(shí),會(huì)生成 CSS(通常作為 <style> 元素)并附加到 DOM 中。

這個(gè)功能由第三方庫(kù)實(shí)現(xiàn)。例如,下面是使用 Aphrodite 實(shí)現(xiàn)的上一個(gè)示例:

import { StyleSheet, css } from 'aphrodite';
const styles = StyleSheet.create({
    myStyle: {
        fontSize: 24,
        lineHeight: '1.3em',
        fontWeight: 'bold',
    }
});
<span className={css(styles.myStyle)}>Hello World!</p>

其他第三方庫(kù)推薦:

  • Emotion

  • JSS

  • Radium

  • Styled-components

我并不完全贊成使用 CSS-in-JS,但我不得不說(shuō),其中一些庫(kù)增加了對(duì)在某些情況下可能會(huì)有用的功能支持。

在這篇文章中,我將討論在 CSS-in-JS 中你可以用上面的庫(kù)來(lái)做的五件事,而我打賭這是你不知道的。

1.參照其他樣式組件

 styled-components  emotion 庫(kù)允許您使用 標(biāo)記模板文字 從樣式中創(chuàng)建 React 組件:

import styled from 'styled-components';
// Create a component that renders a <p> element with blue text
const BlueText = styled.p`
  color: blue;
`;
<BlueText>My blue text</BlueText>

它們也允許你定位于其他樣式組件(像你使用 CSS 選擇器一樣):

const ImportantText = styled.div`
   font-weight: bold;
`;
const Text = styled.div`
  color: gray;
  ${ImportantText} {
    font-style: italic;
  }
`;
render(
  <div>
    <Text>
      Text in gray
      <ImportantText>Important text in gray, bold and italic</ImportantText>
    </Text>
    <ImportantText>Important text bold</ImportantText>
  </div>
);

用CSS-in-JS來(lái)做的事情有哪些

這在組合偽類時(shí)很有用,例如,在懸停時(shí)更改組件的顏色:

const Text = styled.div`
  color: gray;
  &:hover ${ImportantText} {
    color: red;
  }
`;

用CSS-in-JS來(lái)做的事情有哪些

2.使用JSS(或其他庫(kù))擴(kuò)展某些庫(kù)的特性

假設(shè)你已經(jīng)使用 Aphrodite 為你的應(yīng)用程序設(shè)計(jì)樣式,現(xiàn)在你需要支持主題。

但問(wèn)題是 Aphrodite 不能輕易地支持主題。 至少不像 Emotion 那么容易。

不過(guò),這里有兩個(gè)項(xiàng)目將 JSS 的核心與 Aphrodite  styled-components 相結(jié)合, aphrodite-jss  styled-jss 。

通過(guò)這種方式,你可以保留 Aphrodite(或 styled-components) 的優(yōu)點(diǎn),并使用 JSS 的所有特性和 插件 ,從 規(guī)則緩存  規(guī)則隔離 ,以及 主題 ,主題包,以下是它提供的高階組件:

  • ThemeProvider:通過(guò) context 向 react 樹(shù)傳遞主題對(duì)象。

  • withTheme:允許你接收一個(gè)主題對(duì)象并作為屬性來(lái)更新。

例如:

const blackTheme = {
  color: 'black',
};
const App = () => (
  <ThemeProvider theme={blackTheme}>
    <MyComponent />
  </ThemeProvider>
);

 Aphrodite 和主題的案例中,作為另一個(gè)例子,你也可以使用 react-with-styles ,它有實(shí)現(xiàn) Aphrodite  JSS 接口,這樣在定義樣式時(shí)就可以訪問(wèn)主題信息了。

3.使用關(guān)鍵幀鏈接多個(gè)動(dòng)畫(huà)

與內(nèi)聯(lián)樣式不同,CSS-in-JS 允許你使用關(guān)鍵幀定義動(dòng)畫(huà)。 例如,這是使用styled-components 做的:

const heightAnimation = keyframes`
  0% { height: 0; }
  100% { height: 200; }
`;
const myComponent = styled.div`
  display: inline-block;
  width: 200;
  position: relative;
  animation-name: ${heightAnimation};
  animation-duration: 1.5s;
  animation-timing-function: ease;
`;

但是很多人不知道的是,你可以通過(guò)在 animation 屬性中使用多個(gè)關(guān)鍵幀對(duì)象來(lái)鏈接多個(gè)動(dòng)畫(huà)。 下面是修改后的兩個(gè)動(dòng)畫(huà)的例子:

const heightAnimation = keyframes`
  0% { height: 0; }
  100% { height: 200; }
`;
const rotateAnimation = keyframes`
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
`;
const myComponent = styled.div`
  display: inline-block;
  width: 200;
  position: relative;
  animation: ${props => css`
    ${heightAnimation} 1.5s ease infinite,
    ${rotateAnimation} 1.5s linear infinite
  `}
`;

Radium 是另一個(gè)通過(guò)傳遞關(guān)鍵幀對(duì)象數(shù)組作為 animationName 屬性值來(lái)支持多個(gè) 動(dòng)畫(huà) 的庫(kù):

const heightAnimation = Radium.keyframes(
  {
    0% { height: 0; }
    100% { height: 200; }
  },
  'myHeightAnimation',
);
const rotateAnimation = Radium.keyframes(
  {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  },
  'myRotateAnimation',
);
const styles = {
  myStyle: {
    animationName: [heightAnimation, rotateAnimation],
    animationDuration: '1.5s, 1s',
    animationIterationCount: 'infinite, infinite',
    animationTimingFunction: 'ease, linear',
    display: inline-block;
    width: 200;
    position: relative;
  },
};

4.聲明全局樣式

CSS 中的一切都是全局的,使用 CSS-in-JS 的目的之一是消除全局樣式定義。

但是,全局樣式的使用有時(shí)可能是很有效的,例如,當(dāng)你想對(duì)頁(yè)面中的每個(gè)元素應(yīng)用相同的字體樣式時(shí)。

當(dāng)然,你總是可以使用傳統(tǒng)的 CSS,通過(guò) Webpack 導(dǎo)入或在 index.html 文件中聲明它。

但是,如果您真的想在所有樣式中使用 JavaScript,那么有些庫(kù)實(shí)際上允許您通過(guò) helper 組件或擴(kuò)展/插件來(lái)定義全局樣式。

 Radium 中,您可以使用 Style 組件來(lái)渲染具有全局樣式的樣式元素。 例如:

<Style
  rules={{
    body: {
      fontFamily: 'Arial, Helvetica, sans-serif'
    }
  }}
/>

將返回:

<style>
body {
  font-family: 'Arial, Helvetica, sans-serif';
}
</style>

JSS 使用一個(gè) 插件 來(lái)編寫(xiě)全局樣式:

const styles = {
  '@global': {
    body: {
      fontFamily: 'Arial, Helvetica, sans-serif'
    }
  }
}

 Aphrodite 中,你可以用 第三方擴(kuò)展 來(lái)做:

import {injectGlobalStyles} from "aphrodite-globals";
injectGlobalStyles({
    "body": {
          fontFamily: 'Arial, Helvetica, sans-serif',
    }
});

或者通過(guò) aphrodit-jss 來(lái)使用 JSS 全局插件。

5.在單元測(cè)試中使用樣式測(cè)試組件

有些庫(kù)包含用于測(cè)試組件樣式的工具。

Aphrodite 提供了一個(gè)沒(méi)有文檔說(shuō)明(至少在寫(xiě)這篇文章的時(shí)候是這樣)的對(duì)象 StyleSheetTestUtils ,它僅適用于非生產(chǎn)環(huán)境(process.env.NODE_ENV!=='production'),有三個(gè)方法:

  • suppressStyleInjection:它阻止樣式被注入到DOM中,當(dāng)你想要在沒(méi)有DOM的情況下測(cè)試Aphrodite 組件的輸出時(shí)非常有用。

  • clearBufferAndResumeStyleInjection:它與 suppressStyleInjection 相反,所以它們應(yīng)該搭配使用。

  • getBufferedStyles:它返回尚未刷新的緩沖樣式字符串。

以下是如何使用它們的示例:

import { StyleSheetTestUtils, css } from 'aphrodite';
//...
beforeEach(() => {
  StyleSheetTestUtils.suppressStyleInjection();
});
afterEach(() => {
  StyleSheetTestUtils.clearBufferAndResumeStyleInjection();
});
test('my test', () => {
  const sheet = StyleSheet.create({
    background: {
      backgroundColor: 'blue'
    },
  });
  css(sheet.background);
  // buffer will contain something like [ ".background_k554e1{background-color:blue !important;}" ]
  const buffer = StyleSheetTestUtils.getBufferedStyles();
  // ...
});

Radium 是另一個(gè)例子。它有一個(gè) TestMode 對(duì)象,用于在測(cè)試期間使用 clearStateenable  disable 方法控制內(nèi)部狀態(tài)和行為。

到此,相信大家對(duì)“用CSS-in-JS來(lái)做的事情有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI