什麼???CSS也能原子化!

来源:https://www.cnblogs.com/Jcloud/archive/2023/10/16/17766712.html
-Advertisement-
Play Games

原子化CSS是一種CSS的架構方法,傾向於使用用途單一且簡單的CSS,通常是根據視覺效果進行類的命名,不同於BEM規則的CSS,原子的意思就是將CSS進行拆分,每個樣式都有一個唯一的CSS規則 ...


1.什麼是原子化 CSS?

Atomic CSS is the approach to CSS architecture that favors small, single-purpose classes with names based on visual function. Let’s Define Exactly What Atomic CSS is

上文的意思翻譯過來就是原子化CSS是一種CSS的架構方法,傾向於使用用途單一且簡單的CSS,通常是根據視覺效果進行類的命名,不同於BEM規則的CSS,原子的意思就是將CSS進行拆分,每個樣式都有一個唯一的CSS規則,例子如下,每個樣式都配置一個固定類名:

// margin為0px
.m-0{
    margin:0px;
}
// 文字為紅色
.text-red{
    color:red;
}
.font-blod{
  font-weight:blod;
}
.text-center{
   text-align:center;
}

// 樣式使用方式
 <div class = "m-10 text-center text-red font-bold font-size-[48px]">你好原子化CSS</div>

樣式效果如下所示:

目前有很多種原子化的框架,例如 Tailwind CSSWindi CSS 以及 Tachyons 等。

2.為什麼要原子化CSS?

傳統方式可能會使用比如scss預處理器生成自己想要的class類,如下所示:

@for $i from 1 through 10 {
  .m-#{$i} {
    margin: $i px;
  }
}
// 結果為:
.m-1 { margin: 1 px; } 
.m-2 { margin: 2 px; } 
/* ... */ 
.m-10 { margin: 10 px; }


上述方式會產生很多場景下可用的class,可以涵蓋很多場景,但是其中也會有很多種並不會被使用到,從而了導致大量的冗餘;因此原子化CSS中對於這個也進行了優化,通過按需載入的理念進行預設等方式減少CSS的打包體積;

相比原始寫法,應用原子化CSS可以減少很多CSS的書寫工作,減少每次新增一個新的樣式而重覆新增的代碼,比如一個項目中flex和margin配置一般都會重覆寫很多次,使用原子化CSS不用重新去寫這些樣式,直接綁定相對應的class類名就可以起到同樣的效果,因此減少了項目整體的代碼行數量和無用的工作量;

在樣式編寫層面,​​CSS​​​預處理和後處理器很大程度上依賴單獨的樣式表,原子化​​CSS​​​可以充分利用​​Sass​​​、​​Less​​​等​​CSS​​​預處理器功能進行樣式的編寫,同時可以藉助​​PostCSS​​​進一步增強​​CSS​​​的功能。而對於行內樣式,雖然在技術上支持使用預處理和後處理器對其進行處理,但很少有成熟的工具對此提供支持和維護。

在一致性層面,原子化​​​CSS​​​框架一般有預定義的設計系統,開發者僅能在設計系統中選擇要設置的值。而對於行內樣式或者傳統​​CSS​​​類定義來說,可設置的值是沒有任何限制的。對於行內樣式或者傳統的​​CSS​​​類設置來說,一個標簽的字體大小可能是​​14px​​​或​​0.875rem​​​,當產品(​​or​​​ 客戶)說需要調小一點時,開發者A可能調整為​​13px​​​,開發者B可能調整為​​12px​​​。但對於原子化​​CSS​​​框架來說,調小一點意味著設置的類從​​text-sm​​​變為​​text-xs​​。

總的來說原子化CSS可以減少CSS的體積,同時提高CSS類的復用率,減少類名起名的複雜度;但是由於多種CSS樣式堆積,可能會造成class名過長的缺點;同時增加記住CSS樣式的記憶成本;

那麼目前哪些人在使用原子化CSS呢?

一些網站已經開始使用原子化CSS比如 github , swiper.js 等↓如下圖所示,他們頁面的CSS類型可以明顯看出是使用了原子化CSS

3.一種原子化CSS框架-UnoCss

UnoCSS 是一個引擎,而非一款框架,因為它並未提供核心工具類,所有功能可以通過預設和內聯配置提供;

跟Vite的按需載入的理念一樣,unocss提供用啥打包啥的使用方式,極大的減少了記憶體和提高了運行速度,並且提供插件預設進行增強,可以使用自定義規則進行rule校驗,增加個性化開發的方式。

UnoCSS官網鏈接

具體使用方式如下:

1.搭建環境

確保你項目的node版本>=16

pnpm add -D @unocss/preset-uno

2.修改配置

2.1修改vite.config.js

如下麵代碼所示,將Unocss引入

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import viteCompression from 'vite-plugin-compression'
import UnoCSS from 'unocss/vite'
export default defineConfig(({command, mode})=>({
 plugins: [
  vue(),
  viteCompression(),
  UnoCSS({configFile: '../uno.config'}) 
 ]
 })  // 引入下文配置好的config文件

2.2創建uno.config.js

import {
    defineConfig,
    presetAttributify,
    presetIcons,
    presetTypography,
    presetUno,
    presetWebFonts,
    transformerDirectives,
    transformerVariantGroup
  } from 'unocss'
import presetUno from '@unocss/preset-uno'
export default defineConfig({
   rules: [
        [/^mg-0.([\.\d]+)$/, ([_, num]) => ({ margin: `(${num}px)` })],
    ],
    shortcuts: [
      // ...
    ],
    theme: {
      colors: {
        // ...
      }
    },
    presets: [
      presetUno(),
      presetAttributify(),
      presetTypography(),
      presetWebFonts({
        fonts: {
          // ...
        }
      })// 使用自帶的內部預設,按需引用
    ] 
    transformers: [transformerDirectives(), transformerVariantGroup()] })

3.UnoCSS多種功能:

3.1自定義樣式規則:

在config.js裡面可以自定義規則,比如mb-300px是官方的,下麵可以寫mg-10是因為我在config文件裡面自定義設置的rules正則規則,代表:margin:10px;

規則配置代碼如下所示:

 rules: [ [/^mg-0.([\.\d]+)$/, ([_, num]) => ({ margin: `(${num}px)` })], ],

3.2 圖標:

<!-- A basic anchor icon from Phosphor icons -->
<div class="i-ph-anchor-simple-thin" />
<!-- An orange alarm from Material Design Icons -->
<div class="i-mdi-alarm text-orange-400" />
<!-- A large Vue logo -->
<div class="i-logos-vue text-3xl" />
<!-- Sun in light mode, Moon in dark mode, from Carbon -->
<button class="i-carbon-sun dark:i-carbon-moon" />
<!-- Twemoji of laugh, turns to tear on hovering -->
<div class="i-twemoji-grinning-face-with-smiling-eyes hover:i-twemoji-face-with-tears-of-joy" />

展示效果如下,滑鼠動上去會進行旋轉等動效:

3.3屬性模式:

相比普通模式來說可讀性和可維護性更高;兩種模式相比較,屬性模式樣式更為直觀,可讀性更強一點;

//使用屬性模式和普通模式進行對比:
// 普通模式:
<div class="bg-blue-400 hover:bg-blue-500 text-sm text-white py-2 px-4 border-2 rounded border-blue-200">普通模式 </div>
//屬性模式
<div 
  bg="blue-400 hover:blue-500"
  text="sm white"
  font="mono light"
  p="y-2 x-4"
  border="2 rounded  blue-200"
>
  屬性模式
</div>

效果如下所示:

同時在vscode安裝UnoCSS插件後寫代碼還會有提示能力,放置在css樣式上還會浮現具體CSS樣式使得開發更加簡單~如下圖所示,在寫類名的過程中會進行代碼提示,非常友好;

4.個人感受

在使用UnoCSS的過程中,感受到了不用寫的快樂,不用來回穿插CSS文件和VUE文件,CSS類名隨手就寫上,想要什麼樣式往上堆積就行,還不用去絞盡腦汁的去想起什麼類名,帶來了很多便捷的地方;但是也存在一定的困難點,就是會造成無法快速定位樣式問題的困惑;

總而言之,UnoCSS還有許多值得去探索的地方,這裡只展示了其中的一部分我認為有趣的地方,開源項目總會有很多bug等著我們去解決,一起探討吧~

作者:京東保險 卓雅倩

來源:京東雲開發者社區 轉載請註明來源


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

-Advertisement-
Play Games
更多相關文章
  • tv屏中,最難處理的就是焦點問題,而複雜的焦點處理要屬應用列表模塊了 根據展示的列表,可以翻頁,預設焦點處於左上角第一個,此時通過遙控器上下左右可以控制焦點移動位置 焦點所在應用需要有個黃色邊框標識,往右移動到邊界,自動到下一行,繼續往右移動到邊界底部自動翻頁,往下移動到底部自動翻頁 長按應用彈出編 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 很多時候在工作中會碰到完全由前端導出word文件的需求,因此特地記錄一下比較常用的幾種方式。 一、提供一個word模板 該方法提供一個word模板文件,數據通過參數替換的方式傳入word文件中,靈活性較差,適用於簡單的文件導出。需要依賴: ...
  • 前言 有關設計模式的學習資料中,大部分都是以 java 語言實現的,畢竟 java 作為老牌面向對象的語言最能說明設計模式的核心概念,所以 js 的相關設計模式的學習資料也大多使用 class 類實現,本文記錄下 js 使用函數實現策略模式和狀態模式設計模式的方式,更有助於理解策略模式和狀態模式如何 ...
  • 三元運算符 基礎: let hungry = true; let eat; if (hungry true) { eat = 'yes'; } else { eat = 'no'; } 高階: let hungry = true; let eat = hungry true ? 'yes' : 'n ...
  • 1. 前言 大家好,我是沙漠盡頭的狼。 Dotnet工具箱是一個純前端的、開源和免費的工具網站,周末我參考了開源項目it-tools,對網站界面文字進行了漢化,並重新部署了網站。該網站共有10大工具分類,提供了73個實時線上小工具。使用Vue3開發的Dotnet工具箱具有獨特的特色,本文詳細介紹了其 ...
  • 此篇以百度地圖為例 1、去高德地圖註冊自己的key(註冊流程可借鑒百度地圖註冊流程) 2、什麼是坐標 地球坐標系——WGS84:常見於 GPS 設備,Google 地圖等國際標準的坐標體系。 火星坐標系——GCJ-02:中國國內使用的被強制加密後的坐標體系,高德坐標就屬於該種坐標體系。 百度坐標系— ...
  • MicroApp是由京東前端團隊推出的一款微前端框架,它從組件化的思維,基於類WebComponent進行微前端的渲染,旨在降低上手難度、提升工作效率。MicroApp無關技術棧,也不和業務綁定,可以用於任何前端框架。 ...
  • 1.React起源與發展 React 起源於 Facebook 的內部項目,因為該公司對市場上所有 JavaScript MVC 框架,都不滿意,就決 定自己寫一套,用來架設Instagram 的網站。做出來以後,發現這套東西很好用,就在2013年5月開源 了。 2.React與傳統MVC的關係 輕 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...