unocss+vite+vue3初使unocss

一、什么是UnoCss?

UnoCSS 是一个即时的原子CSS引擎,而非一款框架,因为它并未提供核心工具类,所有功能可以通过预设和内联配置提供。它可以让你用简短的类名来控制元素的样式
原子样式也有很多选择,最著名的就是 Tailwind

二、noCss优点

  • 增加开发维护效率:少打很多字符,也解决了来回跳转 style 写 CSS
  • 复用性强,缩小项目体积
  • 降低命名负担,不需要定义很多class
  • 更易于维护,因为它避免了样式冲突和重复代码。只是更改了某个东西的class名,而不是更改class里的属性

三、使用 unocss

参考官方文档Vite配置

3.1 安装

npm install -D unocss

3.2 打包配置

在vite.config.js 中

// vite.config.js
import UnoCSS from 'unocss/vite'
import { defineConfig } from 'vite'export default defineConfig({UnoCSS({configFile: './uno.config.ts'}),
})

3.3 创建一个uno.config.ts 配置文件

import { defineConfig, presetUno, presetAttributify } from 'unocss';
// presetAttributify 属性化模式,属性冲突时,可以通过默认un-前缀来解决:<div m-2 rounded text-teal-400 >代替class</div>
import presetRemToPx from '@unocss/preset-rem-to-px';
// 此处我用了rem to px的预设,所以后面不加单位的数字的话会直接被转化为px(如果不用这个预设,就需要用m-100px之类的)export default defineConfig({presets: [presetUno(), presetAttributify(), presetRemToPx({ baseFontSize: 4 })],rules: [[/^fs-(\d+)$/, ([, num]) => ({ 'font-size': `${num}px` })],[/^lh-(\d+)$/, ([, num]) => ({ 'line-height': `${num}px` })]],variants: [matcher => {if (!matcher.startsWith('hover:')) {return matcher;}return {matcher: matcher.slice(6),selector: s => `${s}:hover`};}],shortcuts: {'center': 'flex items-center justify-center'}
});

或者我们可以新建一个 自定义方案的文件:

// css-preset.ts
import type { Preset } from 'unocss'export const myPreset: Preset = {name: 'my-preset',rules: [],variants: [],shortcuts: {}
}

然后再uno配置文件中只需要

// uno.config.ts
import { defineConfig, presetUno, presetAttributify } from 'unocss'
import { myPreset } from './css-preset'
import presetRemToPx from '@unocss/preset-rem-to-px'export default defineConfig({presets: [myPreset,presetUno(),presetAttributify(),presetRemToPx({ baseFontSize: 4 })],// ...其他配置项
})

3.4全局引入

// main.js
import 'uno.css';

其他介绍

我们需要在vscode安转UnoCss插件,这样当你移入样式回自动提示;
在初期使用的时候我们会不太熟练,不用担心,官方提供了:互动性文档(查询默认预设中的东西)
配置vscode输入的时候自动提示
ctrl + shift + p => 输入 open Setting => 选择 首选项:打开用户设置

"editor.quickSuggestions": {"strings": true,"other": true,"comments": true,},

其他配置项

配置项
Rules 写自定义规则
Variants 可以设置:hover这样的样式(hover已经在默认预设里了)
Shortcuts 用来设置需要重复利用,并且有多种样式的class 将多个规则合并为一个简写
Theme 可用于定义主题相关的配置,如颜色、字体、间距。相当于在theme里存储一套方案,然后在rules里面可以匹配到theme,再进行判定(看官网文档例子)
Layer 设置优先级,并排序
SafeList/ BlockList 预加载/不加载某些class

下面是一些常见的在 theme 下自定义的属性:

  • colors:用于定义颜色变量,可以是命名颜色或自定义的颜色值。
  • fontSize:用于定义字体大小变量,可以是像素值、百分比或 rem 单位。
  • fontWeight:用于定义字体粗细变量,如正常、粗体、细体等。
  • spacing:用于定义间距变量,如边距、内边距等。
  • borderRadius:用于定义边框圆角变量,可以是像素值或百分比。
  • boxShadow:用于定义阴影效果变量,可以是单个阴影或多个阴影组成的数组。
  • fontFamily:用于定义字体系列变量,可以是字体名称或字体栈。
  • lineHeight:用于定义行高变量,可以是数字、百分比或单位值。
  • zIndex:用于定义层级变量,控制元素在层叠上下文中的显示顺序。
  • opacity:用于定义透明度变量,控制元素的不透明度。

margin和padding不支持;所以需要借助rules

定义全局变量

定义我们系统中的主题颜色

theme: {colors: {// 这种方式可以使用element中的颜色 但是在代码中看不到颜色// primary: 'var(--el-color-primary)',// primary: 'rgb(var(--el-color-primary-rgb))','primary': '#427cff',},fontSize: {'small': '12px','base': '14px','medium': '16px'},margin: {'small': '20px','base': '24px','large': '32px','extra-large': '46px'},
}

使用

<div class="c-primary font-size-large font-size-18 mr-small">算法平台</div>

如果是想在css中使用,我们需要安装

npm i @unocss/transformer-directives -D

在uno.config.ts中

import transformerDirectives from '@unocss/transformer-directives';
// 转换器插件,用于在编译时处理样式中的指令  style中可以使用theme()export default defineConfig({presets: [...],transformers: [transformerDirectives()],...
})

当时在处理margin的时候 ,像处理颜色一样。但是一直有问题;后来发现是margin不支持使用theme的自定义属性,所以我借助rules解决

[// [mp] 将会被捕获为第一个分组,(\d+) 仍然捕获后续的数字作为第二个分组。/^([mp])r-(.+)$/,([, prefix, value], { theme }: any) => ({[`${prefix === 'm' ? 'margin' : 'padding'}`]: `${theme.margin[value]}`})],

同时我们在自定义rules的时候 想使用br-primary-2 代表border的宽度和颜色
但是我们大多数的时候默认是1

[/^br-(.*?)(?:-(.*))?$/,([, color, width = 1], { theme }: any) => ({ 'border': `${width}px solid ${theme.colors[color]}` })
],

自定义规则rules分为两类: 静态规则 和 动态规则

静态规则

export default defineConfig({rules: [['m-1', { margin: '1px' }] // 一个配置为一个数组]
}).m-1

动态规则

export default defineConfig({rules: [/** match[1]代表获取到的值 */[/^m-(\d+)$/, match => ({ margin: `${match[1]}px` })],]
})

Shortcuts配置快捷方式(样式集合)

假如你有个盒子,里面的内容需要垂直居中,那么就可以定义为:

export default defineConfig({shortcuts: [{'flex-row': 'flex items-center justify-center',},// ['flex-row', 'flex items-center justify-center']]
})

也支持动态

export default defineConfig({shortcuts: [[/^br-(.*?)(?:-(.*))?$/,([, color, width = 1], { theme }: any) => `border-${width} border-solid border-${theme.colors[color]}`]]
})

优秀参考文章👍

在使用过程中: 我遇到了一下问题

  1. Element-Plus自定义主题(scss变量覆盖)
    创建了一个文件夹diy-element, index.scss中
    Element-Plus自定义主题
@forward 'element-plus/theme-chalk/src/common/var.scss' with ($colors: ('primary': ('base': #427cff),'success': ('base': #009817),'warning': ('base': #e27d02),'danger': ('base': #fb4a32),'error': ('base': #ff5f5f),'info': ('base': #65676f)),$text-color: ('primary': #646a74,'regular': #edf3fc,'secondary': #333333,'placeholder': #9598a3,'disabled': #dcdee4)
);@use 'element-plus/theme-chalk/src/index.scss' as *;

这样覆盖的话 会导致f12的时候 有很多样式被覆盖
最后换了一种方式,写一个hooks

import { onMounted } from 'vue';export const setElementTheme = () => {onMounted(() => {setStyle('--el-color-primary', '#14C2C2');setStyle('--el-text-color-regular', '#000000d9');setStyle('--el-text-color-placeholder', '#00000040');});const setStyle = (key: string, value: string) => {document.documentElement.style.setProperty(key, value);};
};

在app.vue中


import { setElementTheme } from '@/hooks/setElementTheme';setElementTheme();

详细看文章

  1. theme.color使用覆盖后的变量
    防止我们以后更改系统的主题颜色 我们需要更改element文件。也需要更改这里,所以想直接使用ele的变量
 theme: {colors: {// 这种方式可以使用element中的颜色 但是在代码中看不到颜色// primary: 'var(--el-color-primary)',// primary: 'rgb(var(--el-color-primary-rgb))','primary': '#427cff',}}

虽然最后没有使用, 因为代码中颜色不提示 考虑到也不经常改变主题颜色

  1. 调研elementplus组件样式修改
rules: [['el-button',{color: 'red',background: 'green'}]

上面这种样式是可以实现,可以我想设置hover的时候 却不行,说是Unocss 不支持直接在配置文件中使用伪类选择器。最后还是在组件中直接修改了

  1. 在uno.config.ts中配置,怎么在scss片段中使用
    使用 @apply 关键字来应用定义的快捷方式
shortcuts: [['flex-row', 'flex items-center justify-center']],
@apply flex-row;
  1. 自动格式化
    //格式化后的代码:当我们保存后,会自动进行eslint格式化,它会按照默认的配置(可以自定义)进行排列,所有写的原子类按照同一个风格,我们看起来就比较方便了,
    首先我们需要安装插件
npm install -D @unocss/eslint-config

.eslintrc.cjs中添加"@unocss",//添加unocss eslint规则
请添加图片描述
在setting.json中

  "eslint.enable": true,//eslint开启"editor.codeActionsOnSave": {"source.fixAll.eslint": true, // 开启eslint保存自动格式化},

eslint插件是怎么知道保存的时候怎么格式化的呢 ? 就是利用unocss/eslint-config插件 所以这两个插件缺一不可

  1. 生成class
    我们有些时候 同一个页面 有很多耦合的设置 我们就会给他生成一个class 其他地方使用这个class即可
    插件:transformer-compile-class
    这里需要注意是,这里必须要加一个前缀,默认的是:uno:,这个前缀可以通过配置修改。
    安装
npm install -D @unocss/transformer-compile-class
//unocss.config.ts
import transformerCompileClass from '@unocss/transformer-compile-class'transformers: [// 指令:@apply等transformerDirectives(),//非必须transformerCompileClass(),//必须,这个是编译class的,要放在这之前transformerVariantGroup(),//非必须
],

官方文档

使用:

 <div class=":uno-title: text-center c-primary">算法平台</div><div class="uno-title">hahahah</div>
  1. 自定义类名
    想写一个滚动条隐藏的代码
    在rules中
[/^scrollbar-none$/,() => {return `&::-webkit-scrollbar  {display: none;}
`;}]

使用

@apply scrollbar-none;

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

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

相关文章

019 基于Spring Boot的教务管理系统、学生管理系统、课表查询系统

基于Spring Boot的教务管理系统、学生管理系统、课表查询系统 一、系统介绍 本作品主要实现了一个课表查询系统&#xff0c;采用了SSM&#xff08;Spring SpringMVC MyBatis&#xff09;的基础架构。 二、使用技术 spring-bootspring-MVCthymeleafmybatis-plusdruidLombo…

保护 Web 服务器安全性

面向公众的系统&#xff08;如 Web 服务器&#xff09;经常成为攻击者的目标&#xff0c;如果这些业务关键资源没有得到适当的保护&#xff0c;可能会导致安全攻击&#xff0c;从而导致巨大的财务后果&#xff0c;并在客户中失去良好的声誉。 什么是网络服务器审核 当有人想要…

Graph RAG: 知识图谱结合 LLM 的检索增强

本文为大家揭示 NebulaGraph 率先提出的 Graph RAG 方法&#xff0c;这种结合知识图谱、图数据库作为大模型结合私有知识系统的最新技术栈&#xff0c;是 LLM 系列的第三篇&#xff0c;加上之前的图上下文学习、Text2Cypher 这两篇文章&#xff0c;目前 NebulaGraph LLM 相关的…

Folium 笔记:MarkerCluster

在一张地图上以聚簇的形式显示大量的标记&#xff08;markers&#xff09; 举例&#xff1a; import folium from folium.plugins import MarkerCluster import randomm folium.Map(location[45.5236, -122.6750], zoom_start13) # 创建一个基本的地图marker_cluster Marker…

git 取消待推送内容

选择最后一次提交的记录&#xff0c;右键->软合并

k8spod就绪检查失败

pod 一直未就绪 kube-system metrics-server-7764f6c67c-2kts9 0/1 Running 0 10m kubect describe 查看 就绪探针未通过 Normal Started 3m19s kubelet Started container metrics-server Warning Unhealthy 5s (x20 over 2m55s) kubelet Readiness probe failed: HTTP probe…

安全性第一!OpenWRT配置SFTP远程文件传输,实现数据安全保护

文章目录 前言1. openssh-sftp-server 安装2. 安装cpolar工具3.配置SFTP远程访问4.固定远程连接地址 前言 本次教程我们将在OpenWRT上安装SFTP服务&#xff0c;并结合cpolar内网穿透&#xff0c;创建安全隧道映射22端口&#xff0c;实现在公网环境下远程OpenWRT SFTP&#xff…

c++视觉检测-----Canny边缘算子

Canny边缘算子 cv::Canny()是OpenCV库中用于执行Canny边缘检测的函数。Canny边缘检测是一种广泛使用的图像处理技术&#xff0c;用于检测图像中的边缘。 以下是cv::Canny()函数的一般用法和参数&#xff1a; void cv::Canny(cv::InputArray image, // 输入图像&#x…

linux 给根目录扩容(lvm CentOS 7.6 kylinx86)

问题:Linux系统挂载到根目录的磁盘空间满了,如何扩容? 用命令:lsblk 可以查看磁盘和分区情况,可以发现磁盘vda下面的还有大部分空间没有使用。 操作步骤 1、使用 fdisk -l 查看硬盘序号,并用 fdisk 对硬盘操作,格式化成lvm的格式 (用命令lsblk可以看到,挂载到根目录…

【软件测试】博客系统项目测试报告(ssm项目)

文章目录 一. 报告概要二. 引言三. 测试环境四. 测试执行概况及功能测试1. 手工测试1.1 编写测试用例1.2 执行部分测试用例 2. 自动化测试Selenium2.1 编写测试用例2.2自动化测试代码1. 自动化测试工具类2. 博客登录页测试3. 博客注册页4. 博客详情页5. 博客编辑页6. 博客列表页…

【git merge/rebase】详解合并代码、解决冲突

目录 1.概述 2.merge 3.rebase 4.merge和rabase的区别 5.解决冲突 1.概述 在实际开发中&#xff0c;一个项目往往是多个人一起协作的&#xff0c;头天下班前大家把代码交到远端仓库&#xff0c;第二天工作的第一件事情都是从服务器上拉最新的代码&#xff0c;保证代码版本…

12. Java异常及异常处理处理

Java —— 异常及处理 1. 异常2. 异常体系3. 常见Exception4. 异常处理4.1 try finally catch关键字4.2 throws和throw 自定义异常4.3 finally&#xff0c;final&#xff0c;finalize三者的区别 1. 异常 异常&#xff1a;在程序执行过程中发生的意外状况&#xff0c;可能导致程…

【List-Watch】

List-Watch 一、定义二、工作机制三、调度过程 一、定义 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 …

银河麒麟服务器x86安装ntp客户端,并配置成功可以同步时间

脚本 # 安装ntp客户端 sudo dnf install chrony # 配置 pool 2.centos.pool.ntp.org iburst给这一行加注释 sudo sed -i s/^pool 2.centos.pool.ntp.org iburst/#&/ /etc/chrony.conf # 添加3个阿里云NTP服务器 # echo -e "server ntp1.aliyun.com iburst\nserver nt…

【Solidity】智能合约案例——①食品溯源合约

目录 一、合约源码分析&#xff1a; 二、合约整体流程&#xff1a; 1.部署合约 2.管理角色 3.食品信息管理 4.食品溯源管理 一、合约源码分析&#xff1a; Producer.sol:生产者角色的管理合约&#xff0c;功能为&#xff1a;添加新的生产者地址、移除生产者地址、判断角色地址…

多线程 - 线程池

线程池 相关的背景知识 线程池存在的意义: 使用进程来实现并发编程,效率太低了,任务太重了,为了提高效率,此时就引入了线程,线程也叫做“轻量级进程”,创建线程比创建进程更高效;销毁线程比销毁进程更高效;调度线程比调度进程更高效…此时,使用多线程就可以在很多时候代替进程…

在美国如何申请批准销售儿童玩具?提交哪些相关文件?需要的认证是?

在美国如何申请批准销售儿童玩具&#xff1f;提交哪些相关文件&#xff1f;需要的认证是&#xff1f;ASTM F963-17 ​在美国销售玩具 重要&#xff1a; 如果您要在亚马逊商城销售商品&#xff0c;则必须遵守适用于这些商品和商品信息的所有联邦、州和地方法律以及亚马逊政策。…

iNet Network Scanner for Mac,轻松管理网络

iNet Network Scanner for Mac是一款强大的网络扫描工具&#xff0c;能够帮助你轻松管理和监控网络设备。 无论你是个人用户还是企业管理员&#xff0c;iNet Network Scanner都能为你提供全面而方便的网络管理体验。它可以快速扫描并识别局域网中的所有设备&#xff0c;包括电…

Rocky(centos)安装nginx并设置开机自启

一、安装nginx 1、安装依赖 yum install -y gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel 2、去官网下载最新的稳定版nginx nginx: downloadhttp://nginx.org/en/download.html 3、将下载后的nginx上传至/usr/local下 或者执行 #2023-10-8更新 cd /usr/…

自动求导,计算图示意图及pytorch实现

pytorch实现 x1 torch.tensor(3.0, requires_gradTrue) y1 torch.tensor(2.0, requires_gradTrue) a x1 ** 2 b 3 * a c b * y1 c.backward() print(x1.grad) print(y1.grad) print(x1.grad 6 * x1 * y1) print(y1.grad 3 * (x1 ** 2))输出为&#xff1a; tensor(36.) …