unocss+vite+vue3初使unocss

news2024/11/23 21:19:19

一、什么是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.coloradmin.cn/o/1069394.html

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

相关文章

Sonar代码审查

概念 Sonar 下载地址 是一款功能强大的代码审核工具&#xff0c;可以帮助开发团队更好的维护项目代码。同时&#xff0c;Sonar只是一个统称&#xff0c;这款工具不是单纯一个应用&#xff0c;一般来说我们会使用Sonar Qube和Sonar scanner这两个组件来搭配使用。Sonar Scanner…

面试算法21:删除倒数第k个节点

题目 如果给定一个链表&#xff0c;请问如何删除链表中的倒数第k个节点&#xff1f;假设链表中节点的总数为n&#xff0c;那么1≤k≤n。要求只能遍历链表一次。 例如&#xff0c;输入图4.1&#xff08;a&#xff09;中的链表&#xff0c;删除倒数第2个节点之后的链表如图4.1&a…

LabVIEW应用开发——控件的使用(一)

LabVIEW与其他开发语言相比&#xff0c;最大的优点就是可用控件非常多&#xff0c;涵盖了各种数值、数组、波形、图表、图形等控件&#xff0c;在前面板右键调出控件面板选择。 1、数值型控件 按左上角的图钉&#xff0c;可以使相同控件类别的固定显示&#xff0c;始终处于打开…

模板中的依赖类型使用 --- typename

依赖类型&#xff0c;顾名思义就是依赖于模板参数的类型&#xff0c;在使用这种类型时&#xff0c;必须使用 typename&#xff0c;否则编译器是无法知道是在使用类型&#xff0c;还是类的成员&#xff08;因为类的静态成员的使用方法也是T::xxx&#xff0c;这跟某个类中的类型的…

【EI会议信息】第二届航空航天与控制工程国际学术会议(ICoACE 2023)

2023 2nd International Conference on Aerospace and Control Engineering 第二届航空航天与控制工程国际学术会议(ICoACE 2023) 2023年第二届航空航天与控制工程国际学术会议&#xff08;ICoACE 2023&#xff09;将于2023年12月15-17日在江苏南京召开。ICoACE 2023会议主要…

【虚拟机】NAT 模式下访问外网

目录 一、NAT 模式的作用原理 二、配置 NAT 模式实现外网访问 1、配置NAT模式的网段 2、虚拟机选择 VMnet8 网卡 3、IP地址设为自动分配 一、NAT 模式的作用原理 NAT模式下&#xff0c;虚拟机的系统会把宿主机当作一个大路由器&#xff0c;发送的网络请求和数据都是先发给…

LongLoRA:超长上下文,大语言模型高效微调方法

麻省理工学院和香港中文大学联合发布了LongLoRA&#xff0c;这是一种全新的微调方法&#xff0c;可以增强大语言模型的上下文能力&#xff0c;而无需消耗大量算力资源。 通常&#xff0c;想增加大语言模型的上下文处理能力&#xff0c;需要更多的算力支持。例如&#xff0c;将…

借助PLC-Recorder,汇川中型PLC(AM、AC系列,CODESYS平台)2ms高速采集的方法

高速数据采集要保证速度&#xff0c;也要保证时刻的准确性。在windows系统里&#xff0c;时间稳定性是个很难的问题。如果PLC发送的数据里带有时间信息&#xff0c;则可以由PLC来保证采样周期的稳定性。 从V2.12版本开始&#xff0c;PLC-Recorder软件可以处理发送电文里的时间…

国庆出游远程实测:ToDesk 、TeamViewer、AnyDesk远程控制软件稳定性

ToDesk 、TeamViewer、AnyDesk远程控制软件稳定性 【前言】【实测软件】【测试环境】【实操体验】1. 软件安装2. 登录速度3. 文件传输4. 操作延迟5. 画面清晰度6. 安全防护 【本文小结】 【前言】 随着科技的不断发展&#xff0c;远程控制软件已成为我们生活中不可或缺的一部分…

数据结构-图-最短路径问题

最短路径问题 单源最短路径Dijkstra算法原理代码实现 Bellman-Ford算法原理代码实现SPFA优化SPFA代码实现 多元最短路径Floyd-Warshall算法原理代码实现 单源最短路径 &#x1f680;最短路径&#xff1a;从图G的某个顶点出发到达另一个顶点的最短路径&#xff0c;其中最短是指…

鼠标灵敏度怎么调?4个方法提高使用体验感!

“不知道怎么回事&#xff0c;我的鼠标反应很慢慢&#xff0c;有时候好像会有延迟。使用起来感觉特别不舒服。这个问题应该怎么解决呢&#xff1f;希望大家帮帮我&#xff01;” 在使用电脑的过程中&#xff0c;鼠标是很常用的一个工具。调整鼠标的灵敏度对电脑的使用体验会有显…

DBeaver 导出数据的问题 SQL 错误: jdbc 驱动内部错误 Java heap space

DBeaver 导出结果集 报错 具体操作如下&#xff1a; 网友给出的解决方案是 &#xff1a;调整java参数 dbeaver.ini -startup plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_6…

第八章 排序 九、归并排序

一、定义 把两个或多个有序的序列合并成一个有序序列 二、2路归并 三、归并排序 四、例子 1、首先将数组A复制一份到另一个B数组。 2、在定义三个指针分别指向A数组头部、中间、尾部。定义两个指针指向B数组的头部和中间。 3、然后比较B数组中头指针和中间指针的数字大小&a…

Dockerfile自定义容器

1、Dockerfile Dockerfile 是用于构建 Docker 镜像的文本文件&#xff0c;其中包含一系列的指令和配置&#xff0c;用于定义镜像的构建过程。通过 Dockerfile&#xff0c;你可以定义镜像的基础操作系统、依赖、环境设置、应用程序等信息&#xff0c;从而实现可复制、自动化的镜…

mmcv视频处理,如何遇到异常帧不中断

背景 mmcv读取视频帧如果遇到error&#xff0c;则会直接停止执行。但是&#xff0c;视频后面的内容有时候也十分重要&#xff0c;所以这个时候就需要一种方式可以继续处理后续帧。 处理方法 修改mmcv的VideoReader中的__next__函数&#xff0c;修改为如下&#xff1a; def _…

Django使用SMTP发送邮件教程

CONTENTS 1. SMTP介绍2. 申请邮箱授权码3. Django发送邮件 1. SMTP介绍 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议&#xff0c;它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。SMTP 协议属于 TCP/I…

fiddler 的用法

使用fiddler进行抓包 举例一些常见的代理工具 1.wireshark:功能非常强大,但是使用起来更复杂一些 2.fiddler:功能虽然比wireshark少,但是使用简单方便,功能也足以应付大部分场景了 安装了fiddler之后,http和https的请求和响应都会被抓包工具捕捉到,其他的不会 打开软件,左侧是…

网络安全:六种常见的网络攻击手段

1、什么是VPN服务&#xff1f; 虚拟专用网络&#xff08;或VPN&#xff09;是您的设备与另一台计算机之间通过互联网的安全连接。VPN服务可用于在离开办公室时安全地访问工作计算机系统。但它们也常用于规避政府审查制度&#xff0c;或者在电影流媒体网站上阻止位置封锁&#…

mybatis:mybatis-generator插件使用

mybatis&#xff1a;mybatis-generator插件使用 1 idea配置 idea&#xff0c;点击File->Settings->Plugins->设置&#xff0c;点击&#xff1a;Manage Plugin Repositories: 配置如下&#xff1a; http://plugins.jetbrains.com/下载插件并重启idea&#xff1a; 2 …

Avalonia环境搭建

1.开发文档 开发文档&#xff0c; GitHub项目地址 https://github.com/avaloniaui/avalonia 2.VS2022 及扩展安装 建议使用vs2022最新版本下载并安装扩展Avalonia for Visual Studio 2022 3.安装Avalonia UI模板 dotnet new install Avalonia.Templates 查看安装版本 dot…