UnoCss(原子化css引擎) 让你的开发更轻松愉快

news2024/11/26 23:49:57

什么是原子化CSS,UnoCSS又是什么,对此有疑问的推荐看下antfu的这篇文章——重新构想原子化 CSS (antfu.me) 相信看完这篇文章的你也会跟我一样热衷于UnoCSS.

介绍

今天介绍一个CSS开发利器 UnoCSS , 是一个具有高性能且极具灵活性的即时原子化 CSS 引擎,具有按需加载的特性,相信使用过 Tailwind CSS,Windi CSS ,等CSS框架的同学对CSS原子化这个概念都不会陌生,原子化 CSS 是一种 CSS 的架构方式,它倾向于小巧且用途单一的 class,并且会以视觉效果进行命名。

079b8202311071502346227.png

对比

unocss 的作者是Anthony Fu,是 Vite 团队的成员,也是 Vitesse (Vite 社区最受欢迎的起手模板之一) 的作者。Anthony Fu 在开发Vitesse是使用 Tailwind CSS 作为 Vitesse 的默认 UI 框架。但由于 Tailwind 生成了数 MB 的 CSS,使得加载与更新 CSS 成为了整个 Vite 应用的性能瓶颈。后来作者发现了Windi CSS,相比于Tailwind CSS 具有按需加载,零依赖等特性。在CSS文件打包的大小与加载速度上得到了很大的提升.

使用和配置

UnoCSS 是一个引擎,而非一款框架,因为它并未提供核心工具类,所有功能可以通过预设和内联配置提供。

    • 规则(Rules) - 定义原子 CSS 实用程序
    • 预设(Presets) - 常见用例的预定义配置。
    • 快捷方式(Shortcuts) - 将多个规则组合成一个简写。
    • 主题(Theme) - 定义主题变量。
    • 变体(Variants) - 将自定义约定应用于规则。
    • 转换器(Transformers) - 将转换器编码为用户源代码以支持约定。
    • 提取器(Extractors) - 定义提取实用程序的位置和方式。
    • 预检(Preflights) - 定义全局 CSS 规则。
    • 层(Layers) - 定义每个实用程序层的顺序。
    • 自动完成(Presets) - 定义自定义自动完成建议。

准备

首先,使用 vite 创建一个最基础的vue模板

pnpm create vite

安装依赖 unocss,@unocss/reset

pnpm i unocss,@unocss/reset

如果需要使用 UnoCSS 的图标预设,还需要安装@iconify/json

pnpm i @iconify/json

如果需要使用 UnoCSS 的深色模式,最好再安装一下@vueuse/core,方便切换深色模式

pnpm i @vueuse/core

集成 UnoCSS

1.修改vite.config.ts,添加 unocss plugin

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import unocss from 'unocss/vite'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue(), unocss()]
})

2.修改main.ts

import { createApp } from 'vue'

/** 重置样式 这里引入自定义的重置样式也可 */
import '@unocss/reset/tailwind.css'
/** 
 *  项目内的样式,
 *  注意:最好放在重置样式后,uno.css前
 */
import './style.css'
/** 引入uno.css,不引入不生效 */
import 'uno.css'

import App from './App.vue'

createApp(App).mount('#app')

注意:不管是UnoCSS还是tailwindcss、windicss,默认 4单位 = 1rem,即 1单位 = 1/4rem,而 rem 是相对于html的 font-size 来计算的,一般来说大部分浏览器的html默认 font-size 为 16px,即 1rem = 16px,也就是说 Unocss 的1单位换算成 px 就是 4px,这种方式没什么问题,但对于习惯了使用px计算的人来说,每次都要心算一遍要写多少单位就略显麻烦了。那么有没有办法让 unocss 的 1单位=1px 了,这样就没有心算成本了,答案是当然有:由公式 1单位 = 0.25 * ${html font-size} = 1px 可知:将 html 的 font-size 应该为 4px 即可

3.新增unocss.config.ts

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

export default defineConfig({
  presets: [presetUno(), presetAttributify(), presetIcons({scale: 1.2, warn: true})],
  shortcuts: [
    'wh-full': 'w-full h-full',
    'flex-center': 'flex justify-center items-center',
    'flex-col-center': 'flex-center flex-col',
    'flex-x-center': 'flex justify-center',
    'flex-y-center': 'flex items-center',
    'i-flex-center': 'inline-flex justify-center items-center',
    'i-flex-x-center': 'inline-flex justify-center',
    'i-flex-y-center': 'inline-flex items-center',
    'flex-col': 'flex flex-col',
    'flex-col-stretch': 'flex-col items-stretch',
    'i-flex-col': 'inline-flex flex-col',
    'i-flex-col-stretch': 'i-flex-col items-stretch',
    'flex-1-hidden': 'flex-1 overflow-hidden',
    /***** grid布局 *****/
    'grid-column-2': 'grid grid-cols-2 grid-rows-none',
    'grid-column-3': 'grid grid-cols-3 grid-rows-none',
    'grid-column-4': 'grid grid-cols-4 grid-rows-none',
    'grid-column-5': 'grid grid-cols-5 grid-rows-none',
    /**定位相关**/
    'absolute-lt': 'absolute left-0 top-0',
    'absolute-lb': 'absolute left-0 bottom-0',
    'absolute-rt': 'absolute right-0 top-0',
    'absolute-rb': 'absolute right-0 bottom-0',
    'absolute-tl': 'absolute-lt',
    'absolute-tr': 'absolute-rt',
    'absolute-bl': 'absolute-lb',
    'absolute-br': 'absolute-rb',
    'absolute-center': 'absolute-lt flex-center wh-full',
    'fixed-lt': 'fixed left-0 top-0',
    'fixed-lb': 'fixed left-0 bottom-0',
    'fixed-rt': 'fixed right-0 top-0',
    'fixed-rb': 'fixed right-0 bottom-0',
    'fixed-tl': 'fixed-lt',
    'fixed-tr': 'fixed-rt',
    'fixed-bl': 'fixed-lb',
    'fixed-br': 'fixed-rb',
    'fixed-center': 'fixed-lt flex-center wh-full',
    'nowrap-hidden': 'whitespace-nowrap overflow-hidden',
    'ellipsis-text': 'nowrap-hidden text-ellipsis',
    'transition-base': 'transition-all duration-300 ease-in-out'
  ],
  rules: [
    [/^bc-(.+)$/, ([, color]) => ({ 'border-color': `#${color}` })],
    [/^m-(\d+)$/, ([, d]) => ({ margin: `${d / 4}rem` })],
    [/^p-(\d+)$/, (match) => ({ padding: `${match[1] / 4}rem` })],
    ['card-shadow', { 'box-shadow': '0 1px 2px -2px #00000029, 0 3px 6px #0000001f, 0 5px 12px 4px #00000017' }],
  ],
  theme: {
    colors: {
      //primary: 'var(--primary-color)',
      //dark_bg: 'var(--dark-bg)',
    },
  },
})

使用UnoCSS

dd285202311071509458461.png

预览效果

d4574202311071510116845.png

插件推荐 (UnoCSS)

此插件非常强大,不仅有输入提示,并且还可以鼠标悬浮显示编译后的css样式,对自定义的 shortcuts、rules 和 colors 都生效哦, 效果如下图

effee202311071510583870.png

总结

UnoCSS 绝对是我用过的最好用的原子化CSS了,没有之一,它设计很优雅, 足够轻,用着非常爽,并且它对 tailwindcss 和 windicss 的写法做了兼容,你甚至可以直接对着 tailwindcss 文档写 UnoCSS,过渡成本无限接近 0。可能你刚开始写原子化CSS的时候会有点痛苦,但请相信我,写熟了之后你一定会直呼:卧槽,真香!

完整项目附件:点此下载

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

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

相关文章

web框架与Django

web应用程序 什么是web Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件 应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这…

ubuntu 18.04安装自己ko驱动 修改secure boot

因为本人老折腾自己的电脑,所以老重装系统,然后配置又不见了,这次配置赶紧记下来 insmod netlink_test.ko 报错:insmod: ERROR: could not insert module netlink_test.ko: Operation not permitted 添加 sudo insmod netlink_te…

C++跨模块传递CRT引发问题

SDK新增加了一个接口&#xff0c;参数使用std::vector<Class>&&#xff0c;传给dll函数中填充数值&#xff0c;然后应用层拿到这个vector出现了崩溃 越界等问题&#xff0c;调了很久&#xff0c;之前知道这个问题&#xff0c;没有想起来&#xff0c;耽误了许多时间。…

kubernetes资源监控

目录 一、资源限制 1、limitrange 2、ResourceQuota 二、metrics-server 三、图形化监控和代码行监控 1、dashboard 2、k9s 四、hpa 一、资源限制 Kubernetes采用request和limit两种限制类型来对资源进行分配。request(资源需求)&#xff1a;即运行Pod的节点必须满足运…

用友NC Cloud accept.jsp任意文件上传漏洞

一、漏洞描述 NC Cloud是用友推出的大型企业数字化平台。 用友网络科技股份有限公司NC Cloud存在任意文件上传漏洞&#xff0c;攻击者可利用该漏洞获取服务器控制权。 二、网络空间搜索引擎查询 fofa查询 icon_hash"1085941792" 三、漏洞复现 POC POST /aim/equi…

Linux程序设计shell程序学习

目录 1、编写shell脚本&#xff0c;通过循环的形式在终端上打印出等腰梯形 2、编写一个bash脚本程序&#xff0c;用for循环实现将当前目录下的所有.c文件移到指定的目录下&#xff0c;最后在显示器上显示指定目录下的文件和目录。 3、自行编写 shell 脚本&#xff0c;实现从…

Linux防火墙firewalld(粗糙版)

上篇是iptables的增删改查 自定义链&#xff1a; systemctl stop firewalld setenforce 0 iptables -N lmn iptables -vnL iptables -t filter -vnL 修改链名&#xff1a; iptables -E lmn ky01 iptables -t filter -vnL iptables -t filter -I ky01 -p icmp -j ACCEP…

RHCSA --- Linux命令替换

命令替换 把命令中某个子命令替换为其执行结果 $() echo "The current directory is $(pwd)." touch ./file$(date %H-%M-%S).txt 以文件创建时间并以相应格式命名文件 date 显示时间 echo "The current direct…

VueCli 自定义创建项目及配置

一、VueCli 自定义创建项目 1.安装脚手架 (已安装) npm i vue/cli -g2.创建项目 vue create hm-exp-mobile选项 Vue CLI v5.0.8 ? Please pick a preset:Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint) > Manually select features 选自定义手动…

12.输入一个小于1000的整数,输出平方根(不是整数,输出整数部分)

#include<stdio.h> #include<math.h>int fun(int n){int b;b pow(n,0.5);printf("%d",b);}int main(){int n;scanf("%d",&n); fun(n);return 0;}

什么是代理IP池?真实测评IP代理商的IP池是否真实?

代理池充当多个代理服务器的存储库&#xff0c;提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务&#xff0c;而无需担心被检测或阻止的风险。代理池为各种在线活动&#xff08;例如网页抓取、安全浏览等&#xff09;提高后勤保障。 读完…

毫米波雷达在环境监测中的应用:气象学和气候研究的前沿技术

随着气候变化和环境问题的日益突出&#xff0c;科学家们正在寻找更先进的技术来监测大气和气候变化。毫米波雷达技术正崭露头角&#xff0c;成为气象学和气候研究领域的一项重要工具。本文将探讨毫米波雷达在环境监测中的应用&#xff0c;特别聚焦于其在气象学和气候研究方面的…

Spring Cloud LoadBalancer 负载均衡策略与缓存机制

目录 1. 什么是 LoadBalancer &#xff1f; 2. 负载均衡策略的分类 2.1 常见的负载均衡策略 3. 为什么要学习 Spring Cloud Balancer &#xff1f; 4. Spring Cloud LoadBalancer 内置的两种负载均衡策略 4.1 轮询负载均衡策略&#xff08;默认的&#xff09; 4.2 随机负…

Crypto(9)[MRCTF2020]keyboard

下载题目&#xff0c;看看里面是什么 这是什么鬼&#xff0c;由题目可以获得线索&#xff0c;keyboard,不是键盘吗&#xff0c;然后看了看别人写的wp&#xff0c;发现是九键&#xff0c;有几个数字对应的密文就是第几个字母 比如第一个6&#xff0c;对应的字母是mno&#xff0c…

R数据分析:净重新分类(NRI)和综合判别改善(IDI)指数的理解

对于分类预测模型的表现评估我们最常见的指标就是ROC曲线&#xff0c;报告AUC。比如有两个模型&#xff0c;我们去比较下两个模型AUC的大小&#xff0c;进而得出两个模型表现的优劣。这个是我们常规的做法&#xff0c;如果我们的研究关注点放在“在原模型新引入一个预测变量&am…

基于自然语言处理的结构化数据库问答机器人系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 知识库&#xff0c;就是人们总结出的一些历史知识的集合&#xff0c;存储、索引以后&#xff0c;可以被方便的检索出来供后人查询/学习。QnA Maker是用于建立知识库的工具&#xff0c;使用…

vue项目的环境准备与创建详情

如何搭建一个vue项目 一、环境准备 1、安装node.js 下载地址&#xff1a;https://nodejs.org/zh-cn/界面展示 2、检查node.js版本 查看版本的两种方式 1|node -v 2|node -version出现版本号则说明安装成功&#xff08;最新的以官网为准&#xff09; 3、为了提高我们的…

Vite创建React项目,另外一种更加简单的方法

在上一篇blog中一个一个安装依赖dependencies&#xff0c;有没有一步到位的方法呢&#xff0c;有! 参考《React 18 Design Patterns and Best Practices Design, build, and deploy production-ready web applications with React》4th 第一章倒数第二节Vite as a solution有个…

docker形式简易部署kibana

文章目录 前言一、简易部署1.获取镜像2.启动应用4.访问页面5.总结 前言 记录下使用docker部署kibana服务的过程 一、简易部署 1.获取镜像 docker pull kibana:8.8.0[rootnginx ~]# docker pull kibana:8.8.0 8.8.0: Pulling from library/kibana Digest: sha256:a23d96ae0ae…

​软考-高级-信息系统项目管理师教程 第四版【第21章-项目管理科学基础-思维导图】​

软考-高级-信息系统项目管理师教程 第四版【第21章-项目管理科学基础-思维导图】 课本里章节里所有蓝色字体的思维导图