2024 你還在用 CSS 框架嗎?
在如今的前端世界,曾經非?;鸨?CSS 框架是否依然保持著昔日的輝煌?又有哪些新的 CSS 框架正在嶄露頭角,引領著前端開發(fā)的潮流呢?本文將帶你一起探索目前最熱門的 CSS 框架,看看它們都有哪些優(yōu)缺點。
實用優(yōu)先
實用優(yōu)先的 CSS 框架旨在通過提供一系列預定義的、可組合的樣式類,使開發(fā)者能夠以最少的自定義CSS來快速構建現(xiàn)代和響應式的用戶界面。這里面最具代表性的就是 Tailwind CSS 和 UnoCSS。
Tailwind CSS
Tailwind CSS 是目前最火的 CSS 框架,它強調的是原子級的 CSS 類,它將各種樣式定義為獨立的類,開發(fā)者可以輕松地組合和應用這些類來構建出所需的樣式。這種設計理念使得Tailwind CSS能夠提供一套定義好了的class類字典,開發(fā)者只需通過組合這些類來實現(xiàn)各種樣式的設計,而無需自己編寫大量的CSS代碼。
Tailwind CSS 不僅內置了豐富的CSS類,還可以在配置文件(tailwind.config.js)中自定義主題,包括顏色、字體、間距等,以適應項目需求。它還提供響應式類,自動調整樣式以適應不同屏幕尺寸,簡化了響應式設計。
<body class="bg-gray-100 p-4">
<div class="bg-blue-500 text-white p-4 mb-4 sm:bg-green-500 md:bg-red-500 lg:bg-purple-500 xl:bg-orange-500">
盒子顏色隨屏幕大小而變化
</div>
<p class="text-gray-700 mb-4 sm:text-lg md:text-xl lg:text-2xl xl:text-3xl">
文字大小隨屏幕大小而變化
</p>
</body>
不過,把所有樣式直接寫在 HTML 中可能導致代碼變得冗長,類名字符串過長,降低代碼的可讀性,這也是部分開發(fā)者不喜歡 Tailwind CSS 的主要原因。
Github:https://github.com/tailwindlabs/tailwindcss
UnoCSS
UnoCSS 是 Anthony Fu(Vue 和 Vite 的核心團隊成員之一)開發(fā)是一個即時、按需的原子級 CSS 引擎,它專注于提供輕量化、高性能的 CSS 解決方案。UnoCSS 的設計理念是提供一個高性能且具靈活性的即時原子化 CSS 引擎,可以兼顧產物體積和開發(fā)性能。
UnoCSS 的主要特點:
- 即時、按需:UnoCSS 的加載和渲染速度非常快,可以立即進行使用,不需要預先編譯。它通過靜態(tài)分析和 PurgeCSS 算法在編譯過程中自動推斷和優(yōu)化樣式,并移除未使用的樣式。
- 原子級 CSS:使用原子級 CSS 樣式的概念,每個類只包含一項或幾項樣式屬性,可以在組件中靈活地組合和應用這些類,以實現(xiàn)細粒度的樣式控制。
- 高性能:UnoCSS 可以比 Tailwind CSS 的 JIT 引擎快 200 倍,幾乎為零的開銷意味著你可以將 UnoCSS 整合到你現(xiàn)有的項目中,作為一個增量解決方案與其他框架一同協(xié)作,而不需要擔心性能損耗。
- 靈活性和可定制性:UnoCSS 支持自定義工具類、變體、指令和圖標,提供了更多的可選方案,并且兼容多種風格的原子類框架。
Github:https://github.com/unocss/unocss
CSS-in-JS
CSS-in-JS 是一種將 CSS 樣式與 JavaScript 代碼結合的方法,它允許在 JavaScript 組件中編寫和管理 CSS 樣式。雖然避免全局樣式沖突,但也增加了運行時開銷和包體積。
Styled Components
Styled Components 是目前使用最多的 CSS-in-JS 庫,專為 React 和 React Native 設計,不過最近出來很多新的 CSS-in-JS 庫,Styled Components 的下載量開始走下坡路。Styled Components 允許開發(fā)者在 JavaScript 組件中直接編寫 CSS 樣式,從而實現(xiàn)樣式與組件邏輯的緊密集成。通過使用標簽模板字面量,Styled Components 提供了一種直觀且靈活的方式來定義組件的樣式。
Styled Components 的使用方式也非常簡單:
import React from 'react';
import styled from 'styled-components';
const Title = styled.h1`
font-size: 1.5em;
text-align: center;
color: palevioletred;
`;
const Wrapper = styled.section`
padding: 4em;
background: papayawhip;
`;
function MyUI() {
return (
<Wrapper>
<Title>Hello 前端充電寶!</Title>
</Wrapper>
);
}
Styled Components 雖然提供了組件化和動態(tài)樣式的便利,但其性能開銷、調試難度和代碼冗余等問題導致部分開發(fā)者不喜歡使用它。
Github:https://github.com/styled-components/styled-components
Emotion
Emotion 是一個流行的 CSS-in-JS 庫,專為 React 設計。它允許開發(fā)者以 JavaScript 的方式編寫 CSS 樣式。Emotion 提供了一種靈活且強大的方式來管理組件的樣式,支持動態(tài)樣式、主題定制、自動前綴處理等功能。
使用方式和 Styled Components 大同小異:
import styled from '@emotion/styled'
const Button = styled.button`
padding: 32px;
background-color: hotpink;
font-size: 24px;
border-radius: 4px;
color: black;
font-weight: bold;
&:hover {
color: white;
}
`
render(<Button>This my button component.</Button>)
Github:https://github.com/emotion-js/emotion
vanilla-extract
vanilla-extract 是一個創(chuàng)新性的 CSS-in-JS 庫,它的目標是提供一種簡單、高效且類型安全的方式來處理樣式。相對于上面的兩個庫,vanilla-extract 的一個顯著特點就是無運行時,樣式在構建時處理,類似于Sass和Less,不會增加應用的運行時負擔。
用法如下:
// styles.css.ts
import { createTheme, style } from '@vanilla-extract/css';
export const [themeClass, vars] = createTheme({
color: {
brand: 'blue'
},
font: {
body: 'arial'
}
});
export const exampleStyle = style({
backgroundColor: vars.color.brand,
fontFamily: vars.font.body,
color: 'white',
padding: 10
});
// app.ts
import { themeClass, exampleStyle } from './styles.css.ts';
document.write(`
<section class="${themeClass}">
<h1 class="${exampleStyle}">Hello world!</h1>
</section>
`);
Github:https://github.com/vanilla-extract-css/vanilla-extract
styled-jsx
styled-jsx 是一個用于在 React 項目中編寫 CSS 的庫,特別設計用于與 JSX 一起使用。它是由 Vercel開發(fā),旨在提供一種簡單而直觀的方式來編寫組件級的樣式,同時自動處理作用域和關鍵沖突問題。
使用方式如下:
import React from 'react';
function MyComponent() {
return (
<div>
<h1 className="title">Hello, World!</h1>
<style jsx>{`
.title {
color: blue;
font-size: 24px;
}
`}</style>
</div>
);
}
export default MyComponent;
通用框架
Bootstrap
Bootstrap 是老牌 CSS 框架,最初是由Twitter的工程師開發(fā),旨在解決內部項目中快速構建一致且響應式的用戶界面的問題。
使用方式:
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">Logo</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Features</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Pricing</a>
</li>
</ul>
</div>
</nav>
現(xiàn)在,使用 Bootstrap 的人數(shù)一直在減少,主要是因為開發(fā)者開始傾向于使用更輕量、更易于定制的CSS解決方案,如CSS-in-JS庫和原子化的CSS框架,這些工具提供了更高的靈活性和集成度,以適應不斷變化的設計趨勢和性能要求。同時,開發(fā)者對于框架的特定集成和生態(tài)系統(tǒng)的需求也在增加,導致他們尋找更符合現(xiàn)代開發(fā)實踐的替代品。
Github:https://github.com/twbs/bootstrap