27 Vue3之unocss原子化

news2024/12/23 12:07:50

前置知识

什么是原子化 CSS

原子化 CSS 是一种 CSS 的架构方式,它倾向于小巧且用途单一的 class,并且会以视觉效果进行命名。

 为什么使用 原子化 CSS

传统方案

制作原子化 CSS 的传统方案其实就是提供所有你可能需要用到的 CSS 工具。例如,你可能会用预处理器(这里选用的是 SCSS)生成如下代码:

// style.scss

@for $i from 1 through 10 {
  .m-#{$i} {
    margin: $i / 4 rem;
  }
}

编译结果为:

.m-1 { margin: 0.25 rem; }
.m-2 { margin: 0.5 rem; }
/* ... */
.m-10 { margin: 2.5 rem; }

现在你可以直接使用 class="m-1" 来设置边距。但正如你所见,用这种方法的情况下,你不能使用除了 1 到 10 之外的边距,而且,即使你只使用了其中一条 CSS 规则,但还是要为其余几条规则的文件体积买单。如果之后你还想支持不同的 margin 方向,使用比如 mt 代表 margin-topmb 代表 margin-bottom 等,加上这 4 个方向以后,你的 CSS 大小会变成原来的 5 倍。如果再有使用到像 :hover 和 :focus 这样的伪类时,体积还会得更变大。以此类推,每多加一个工具类,往往意味着你 CSS 文件的大小也会随之增加。这也就是为什么传统的 Tailwind 生成的 CSS 文件会有数 MB 的大小。

为了解决这个问题,Tailwind 通过使用 PurgeCSS 来扫描你的打包产物并删除你不需要的规则。这得以使其在生产环境中 CSS 文件缩减为几 KB。然而,请注意,这个清除操作仅在生成构建下有效,而开发环境下仍要使用包含了所有规则巨大的 CSS 文件。这在 Webpack 中表现可能并不明显(项目过大也会有着巨大影响),但在 Vite 中却有着巨大的影响,毕竟其他内容的加载都非常迅捷。

Tailwind对比unocss

例如,我们知道 Tailwind 中的 border-2 标识边框宽度为 2px4 表示 4px6 表示 6px8 表示 8px,但当你使用 border-10 却不起作用你甚至需要一些时间来发现这件事!)。你可能会说这是故意而为之,以使得设计系统具有一致性。不如这样,我们来做个小测验,如果想要让 border-10 正常工作,应该如何做?

在你的全局样式中的某个位置添加这样一个工具类?

.border-10 {
  border-width: 10px;
}

快速且直观,最重要的是,它的确解决了你的需求。但是,如果什么都需要我自己手动添加,那我们为什么还需要使用 Tailwind ?

可参考文章

重新构想原子化 CSS

UnoCSS官方中文文档  指南

自 2023 年 3 月起不再积极维护windicss官方文档 Getting Started | Windi CSS


 

使用unocss 

在vscode编辑器中安装unocss插件 能友好的提示

npm i -D unocss 

vite.config.ts 

import unocss from 'unocss/vite'
 
 plugins: [vue(), vueJsx(),unocss({
      rules:[
//配置自定义规则 
        ['U-flex', { display: "flex" }]
      ]
  })],

main.ts 引入

import 'uno.css'

1 配置自定义规则

rules: [
  ['flex', { display: "flex" }]
]
<template>
  <div
    class="u-flex"
  >
    什么是原子化CSS
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
</script>

<style lang="less" scoped></style>

 效果图:

2 配置动态css(使用正则表达式)

m-参数   例如 m-10 就是 margin:10px

rules: [
  [/^m-(\d+)$/, ([, d]) => ({ margin: `${Number(d) * 10}px` })],
  ['flex', { display: "flex" }]
]

 3 .shortcuts 可以自定义组合样式

  plugins: [vue(), vueJsx(), unocss({
    rules: [
      ['pink', { color: 'pink' }]
    ],
    shortcuts: {
      btn: "pink flex"
    }
  })],

4 unocss 预设

 presets:[presetIcons(),presetAttributify(),presetUno()]
4.1.presetIcons Icon图标预设

图标集合安装

npm i -D @iconify-json/ic

首先我们去icones官网(方便浏览和使用iconify)浏览我们需要的icon,比如这里我用到了Google Material Icons图标集里面的baseline-add-circle图标 

比如你想使用Element Plus的图标库 直接查询后能看到网址https://icones.js.org/collection/ep

能看到是/ep结尾的 下载命令就是

npm i -D @iconify-json/ep

 不加/ep就是下载所有的图标库体积会特别大

4.2.presetAttributify 属性化模式支持

属性语义化 无须class

vite.config.ts 


import { defineConfig, presetAttributify, presetUno } from 'unocss'

export default defineConfig({
  presets: [
    presetAttributify({ /* preset 选项 */}),
    presetUno(),
    // ...自定义 presets
  ],
rules:[]
})
<div font="black">btn</div>
  <button
    class="bg-blue-400 hover:bg-blue-500 text-sm text-white font-mono font-light py-2 px-4 rounded border-2 border-blue-200 dark:bg-blue-500 dark:hover:bg-blue-600"
  >
    未使用属性化模式支持 css Button
  </button>
  <button
    bg="blue-400 hover:blue-500 dark:blue-500 dark:hover:blue-600"
    text="sm white"
    font="mono light"
    p="y-2 x-4"
    border="2 rounded blue-200"
  >
  使用属性化模式支持Button
  </button>
  <div w20 h20 bg-blue-500>使用属性化模式支持Button 省略class后无类名提示。。。</div>
4.3.presetUno 工具类预设

tips:默认的预设是基于Windi CSS的注意margin 和border的单位是px,其他样式是rem

默认的 @unocss/preset-uno 预设是一系列流行的原子化框架的 通用超集,包括 Tailwind CSS、Windi CSS、Bootstrap、Tachyons 等。

例如,ml-3(Tailwind CSS)、ms-2(Bootstrap)、ma4(Tachyons)和 mt-10px(Windi CSS)都是有效的。

.ma4 { margin: 1rem; }
.ml-3 { margin-left: 0.75rem; }
.ms-2 { margin-inline-start: 0.5rem; }
.mt-10px { margin-top: 10px; }
4.4 Rem to px 预设​

将所有工具类中的 rem 转换为 px。

pnpm add -D @unocss/preset-rem-to-px

// uno.config.ts
import { defineConfig } from 'unocss'
import presetRemToPx from '@unocss/preset-rem-to-px'

export default defineConfig({
  presets: [
    presetRemToPx(),
    // ...other presets
  ],
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2184881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES索引生命周期管理

基于如何 定时删除ES索引过期数据 而引发的一系列关于ES索引生命周期管理ILM(Index Lifecycle Management)的学习 快速上手 &#xff1a;定时删除ES索引中的过期数据 1. ILM解决什么问题&#xff1f; ES从6.7版本引入ILM&#xff0c;通过ILM可以解决哪些问题呢? 自动新建…

Python 课程22-Pillow

前言 Pillow 是一个 Python 图像处理库&#xff0c;是 Python Imaging Library (PIL) 的升级版。Pillow 提供了对常见图像文件格式&#xff08;如 PNG、JPEG、GIF 等&#xff09;的支持&#xff0c;并允许你进行图像裁剪、调整大小、旋转、滤镜应用、文本添加等操作。Pillow 广…

Applio:颠覆语音克隆的AI黑科技!

Applio&#xff1a;颠覆语音克隆的AI黑科技&#xff01; Applio是一个神奇的AI语音克隆工具✨&#xff0c;提供超过20,000种声音模型&#x1f3a4;&#xff0c;让你轻松创造独特音色&#x1f3b6;&#xff01;开源社区欢迎所有人参与&#xff0c;共同探索AI音频的无限可能&…

蓝桥杯备赛---2.新建工程

推荐根据视频进行工程建立 开发板资源简介&工程模板建立_哔哩哔哩_bilibili 目录 推荐根据视频进行工程建立 1.点击"File"下的"New Project"新建一个工程 ​编辑 2. 查看官方给的数据手册&#xff0c;选择对于的单片机型号 3. 查看原理图&#…

银河麒麟操作系统中设置进程堆栈大小的方法

银河麒麟操作系统中设置进程堆栈大小的方法 1、临时修改堆栈大小步骤一&#xff1a;查看当前堆栈大小步骤二&#xff1a;修改堆栈大小 2、永久修改堆栈大小步骤一&#xff1a;查看当前堆栈大小&#xff08;可选&#xff09;步骤二&#xff1a;编辑配置文件步骤三&#xff1a;注…

论文精读--Two-Stream Convolutional Networks for Action Recognition in Videos

对于单张图片&#xff0c;丢进卷积和全连接层直接得出分类结果就行 但对于视频&#xff0c;早期的一些工作把视频中的一些关键帧抽取出来&#xff0c;把一个个帧通过网络&#xff0c;最后把结果合并&#xff0c;或者把帧叠起来&#xff0c;一起丢进网络。在网络中进行early fu…

【C++】模拟实现红黑树

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 &#x1f4cc;实现RBTreeNode类模板 &#x1f38f;构造RBTreeNode类成员变量 &#x1f38f;实现RBTreeNode类构…

【数据结构】堆(Heap)详解----定义堆、初始化,删除、插入、销毁、判空、取堆顶

文章目录 一、堆的概念及其性质&#xff1a;堆的概念&#xff1a;堆的性质&#xff1a; 二、堆的定义及其基础操作的代码实现&#xff08;C语言版&#xff09;1.定义堆2.堆的初始化3.堆的销毁4.堆的插入5.堆的删除6.取堆顶的数据7.堆的数据个数8.堆的判空 总结&#xff1a; 提示…

Python开发环境配置(mac M2)

1. 前言 作为一名程序员&#xff0c;工作中需要使用Python进行编程&#xff0c;甚至因为项目需要还得是不同版本的Python如何手动管理多个版本的Python&#xff0c;如何给Pycharm&#xff08;IDE&#xff09;配置对应的interpreter等&#xff0c;都成为一个 “不熟练工” 的难…

【面向对象】设计模式概念和分类

零.前提提要 本文章是我考中级软件设计师时的笔记&#xff0c;基本都是一些自己的思路和见解&#xff0c;现记录一下&#xff0c;希望可以帮助到即将考证的同学。 一.面向对象设计模式的概念 二.面向对象的设计模式分类 设计模式确定了所包含的类和实例、他们的角色和写作方式以…

AMBER学习记录--使用Multiwfn计算有机小分子的RESP电荷--问题及解决

1 ORCAMultiwfn在wsl中的安装 ORCA的安装参考量子化学程序ORCA的安装方法 - 思想家公社的门口&#xff1a;量子化学分子模拟二次元 (sobereva.com) Multiwfn的安装 参考保姆级安装Linux版Multiwfn教程_multiwfn安装过程-CSDN博客 2 计算C3G的RESP电荷 2.1从pubchem上下载C3G的…

77. 组合【含回溯详解、N叉树类比、剪枝优化】

文章目录 77. 组合思路暴力法回溯与N叉树类比回溯法三部曲 总结剪枝优化剪枝总结 77. 组合 77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&am…

spring loCDI 详解

文章目录 一、IoC & DI 基本知识1.1 IoC 的基本概念&#xff1a;1.2 IoC 的优势&#xff1a;1.3 DI 介绍&#xff1a; 二、IoC 详解2.1 Spring 容器&#xff1a;2.2 被存储 Bean 的命名约定&#xff1a;2.3 Bean 的存储方式&#xff1a;2.3.1 五大类注解&#xff1a;2.3.1.…

MySQL高阶2010-职员招聘人数2

目录 题目 准备数据 分析数据 总结 题目 一家公司想雇佣新员工。公司的工资预算是 $70000 。公司的招聘标准是&#xff1a; 继续雇佣薪水最低的高级职员&#xff0c;直到你不能再雇佣更多的高级职员。用剩下的预算雇佣薪水最低的初级职员。继续以最低的工资雇佣初级职员&…

linux文件编程_进程

1. 进程相关概念 面试中关于进程&#xff0c;应该会问的的几个问题&#xff1a; 1.1. 什么是程序&#xff0c;什么是进程&#xff0c;有什么区别&#xff1f; 程序是静态的概念&#xff0c;比如&#xff1a; 磁盘中生成的a.out文件&#xff0c;就叫做&#xff1a;程序进程是…

Linux常用语法

Linux常用语法 0.引言特殊路径符Linux 命令基础格式重要命令mkdir命令echo-tail命令 vi\vim编辑器的三种工作模式vi/vim简单介绍基础命令 运行模式命令模式下的快捷键 进程管理进程的命令 Linux解压缩tar格式zip命令unzip命令 ping,wget,curl等命令的使用Linux端口端口端口的划…

【算法篇】回溯算法类(1)(笔记)

目录 一、理论基础 1. 相关题目 2. 遍历过程 3. 代码框架 二、LeetCode 题目 1. 组合 2. 组合总和III 3. 电话号码的字母组合 4. 组合总和 5. 组合总和II 6. 分割回文串 7. 复原IP地址 8. 子集 一、理论基础 1. 相关题目 2. 遍历过程 3. 代码框架 void backtr…

光通信——APON/EPON/GPON/10G PON

目录 APON EPON GPON 上下行对称和非对称速率 OAM功能 汇聚子层 ATM封装方式 GEM封装方式 10G EPON EPON/GPON技术原理和特点 工作原理 关键技术 &#xff08;1&#xff09;测距、同步 &#xff08;2&#xff09;突发发送和接收 &#xff08;3&#xff09…

基于Word2Vec和LSTM实现微博评论情感分析

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

【mmengine】优化器封装(OptimWrapper)(入门)优化器封装 vs 优化器

MMEngine 实现了优化器封装&#xff0c;为用户提供了统一的优化器访问接口。优化器封装支持不同的训练策略&#xff0c;包括混合精度训练、梯度累加和梯度截断。用户可以根据需求选择合适的训练策略。优化器封装还定义了一套标准的参数更新流程&#xff0c;用户可以基于这一套流…