使用styled-components實現CSS in JS

来源:https://www.cnblogs.com/xiaohuochai/archive/2018/03/10/8488057.html
-Advertisement-
Play Games

[1]基本用法 [2]組件樣式 [3]擴展樣式 [4]更換標簽 [5]傳遞屬性 [6]attrs函數 [7]動畫 [8]添加類名 ...


前面的話

  使用jsx語法可以實現HTML in JS,使用svgr可以實現svg in JS,使用styled-components可以實現CSS in JS。這樣,使用react開發,就變成了使用JS開發,統一且方便。本文將詳細介紹styled-components的用法

 

基本用法

【安裝】

$ npm install styled-components

  使用非常簡單,下麵的代碼片段展示了 React 項目中使用 styled-components,定義了 Wrapper 和 Button 兩個組件,包含了 html 結構和對應的 css 樣式,從而將樣式和組件之間的 class 映射關係移除

import styled from 'styled-components';
const Wrapper = styled.section`
  margin: 0 auto;
  width: 300px;
  text-align: center;
`;
const Button = styled.button`
  width: 100px;
  color: white;
  background: skyblue;
`;
render(
  <Wrapper>
    <Button>Hello World</Button>
  </Wrapper>
);

 

組件樣式

  如果要為組件設置樣式,則需要使用小括弧語法,而且需要在組件上設置className和children

const Link = ({ className, children }) => (
  <a className={className}>
    {children}
  </a>
)
const StyledLink = styled(Link)`
  color: palevioletred;
  font-weight: bold;
`;
render(
  <div>
    <Link>Unstyled, boring Link</Link>
    <br />
    <StyledLink>Styled, exciting Link</StyledLink>
  </div>
);

  

擴展樣式

  使用擴展樣式,可以基於已經存在的樣式進行擴展

const Button = styled.button`
  color: palevioletred;
  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;
`;

const TomatoButton = Button.extend`
  color: tomato;
  border-color: tomato;
`;

render(
  <div>
    <Button>Normal Button</Button>
    <TomatoButton>Tomato Button</TomatoButton>
  </div>
);

 

更換標簽

  在某些情況下,可以在復用樣式的基礎上更換標簽

const Button = styled.button`
  display: inline-block;
  color: palevioletred;
  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;
`;
const Link = Button.withComponent('a')
const TomatoLink = Link.extend`
  color: tomato;
  border-color: tomato;
`;
render(
  <div>
    <Button>Normal Button</Button>
    <Link>Normal Link</Link>
    <TomatoLink>Tomato Link</TomatoLink>
  </div>
);

 

傳遞屬性

  通過props可以從父組件向子組件傳遞屬性

const GlassModal = ({ children, className, backgroundColor, padding }) => (
  <Wrap backgroundColor={backgroundColor}>
    <Main padding={padding} className={className}>
      {children}
    </Main>
  </Wrap>
)
export default GlassModal

const Wrap = styled.section`
  background-color: ${props => props.backgroundColor || BLUE_DARK};
`
const Main = styled.main`
  padding: ${props => props.padding || '0'};
  background-color: ${OPACITY_LIGHT};
`
const StyledGlassModal = styled(GlassModal)`
  padding: 20px 10px;
  text-align: center;
`

  或者,基於prop來定製主題

const Button = styled.button`
  background: ${props => props.primary ? 'palevioletred' : 'white'};
  color: ${props => props.primary ? 'white' : 'palevioletred'};
  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;
`;

render(
  <div>
    <Button>Normal</Button>
    <Button primary>Primary</Button>
  </div>
);

 

attrs函數

  通過使用attrs函數,可以用來設置其他屬性

const Input = styled.input.attrs({
  type: 'password',
  margin: props => props.size || '1em',
  padding: props => props.size || '1em'
})`
  color: palevioletred;
  border-radius: 3px;
  margin: ${props => props.margin};
  padding: ${props => props.padding};
`;
render(
  <div>
    <Input placeholder="A small text input" size="1em" />
    <Input placeholder="A bigger text input" size="2em" />
  </div>
);

  或者引入第三方庫的樣式,如activeClassName

const Button = styled.button.attrs({
  className: 'small',
})`
  background: black;
  color: white;
`;

  編譯後的 html 結構如下:

<button class="sc-gPEVay small gYllyG">
  Styled Components
</button>

 

動畫

  styled-components 同樣對 css 動畫中的 @keyframe 做了很好的支持

import { keyframes } from 'styled-components';
const rotate360 = keyframes`
  from {transform: rotate(0deg);}
  to {transform: rotate(360deg);}
`;
const Rotate = styled.div`
  display: inline-block;
  animation: ${rotate360} 2s linear infinite;

`;
render(
  <Rotate>&lt; 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • IBOutlet或IBAction符號對編譯不產生任何影響,它們只是標記,用於告訴Xcode這些對象可以和UI控制項進行關聯,以便於在編輯Interface Builder上的UI控制項的時候Xcode可以自動提示。 參考資料:《iOS編程指南》 ...
  • 近日,樓主在同一臺手機上,同時安裝同一個游戲的不同渠道包,add install後,提示:Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=android.permission.具體許可權 pkg=渠道A游戲包名] 原因: 1、正要安裝的APP的自定義 ...
  • 當我們用RecyclerView時,如果想用某一個特定的版本,怎樣才能知道版本號呢?如果自己的筆記本中用過這個庫,那麼會保存在本地硬碟中。 Android自身依賴包的版本號本地存放路徑: 沒有用過該版本,也沒有關係,google develper中有說明:Support Library的版本號其實都 ...
  • 今天supprt28遇到的問題,由於28還是預覽版,還存在一些bug 都是因為如果程式內出現不同的,support或者其他外部引用庫的多個版本,Gradle在進行合併的時候會使用本地持有的,最高版本的來進行編譯,所以25的support就有可能引用26的東西,就會出現 屬性 merge 錯誤 ,或者 ...
  • 一、Gradle更新問題 Android Studio每次更新版本都會更新Gradle這個插件,而且有時候提示更新,卻一直更新不了,那是因為中國偉大的長城問題。就是下圖,我剛剛更新了,提示更新gradle,卻一直更新不了! 1.1 這有時候會導致停止在Refreshing Gradle Projec ...
  • 這個問題搞得我頭大,並且在查過百度後各位大佬給出的解釋我都不能理解,應該是我太白的原因,希望我寫的能好理解。 下麵文章視窗1、2、3,在代碼里分別為chuangkou、chuangkou1、chuangkou2. 下麵是我創建的一個及其簡易html框架結構: 製作這個網頁需要八個html文件,分別是 ...
  • 總結一下目前在用的前端代碼規範,可作為開發參考 一、基礎規範 開發規範 項目目錄和文件的命名使用小寫字母,避免使用大寫或駝峰,多個單詞以下劃線 _ 分隔 如:my_project/cast_detail.js 目錄有複數意義的時候,使用複數命名 如 scripts images 某些第三方插件可直接 ...
  • 一、簡介 瀏覽器全屏有兩種方式,一種是HTML5新增的requestFullscreen全屏,另一種是摁F11實現的全屏,本文將詳解兩種全屏的特點以及其實現。 二、requestFullscreen全屏 1、判斷是否支持全屏 通過判斷元素的requestFullscreen函數是否存在與docume ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...