Nuxt 项目实战 - 15:自定义unocss规则,让编写样式更高效

news2024/11/13 14:47:33

与UI设计师约定颜色命名规则

Untitled

配置color变量

  • color.scss

    $colors: (
     (
      #ffffff,
      #f8f8f8,
      #ebebeb,
      #dbdbdb,
      #cccccc,
      #999999,
      #666666,
      #333333,
      #000000
     ),
     (#daf6ef, #b4ecde, #08c193, #228f73, #43d7b2),
     (#f62f3b, #edc9c9, #f0e2e2, #ffecea, #f78185),
     (#f2f5f8, #e3e8eb, #c3cace, #a0a6a9),
     (#ffb739, #dc9e40, #fff5e4),
     (#fffaf7, #f3cfb9, #debca1, #bd835e, #6b2d00)
    );
    
    @function pad-zero($number) {
     @if $number < 10 {
      @return "0#{$number}";
     } @else {
      @return $number;
     }
    }
    
    // 生成ui设计师颜色命名规则: c-xx-xx
    @function generate-colors() {
     $color-map: ();
    
     @for $i from 1 through length($colors) {
      @for $j from 1 through length(nth($colors, $i)) {
       $var-name: --c-#{pad-zero($i)}-#{pad-zero($j)};
       $var-value: nth(nth($colors, $i), $j);
       $color-map: map-merge(
        $color-map,
        (
         $var-name: $var-value,
        )
       );
      }
     }
    
     @return $color-map;
    }
    
    
  • var.scss

    @use "./color.scss" as *;
    
    :root {
     ...
    
     @each $key, $value in generate-colors() {
      #{$key}: $value;
     }
    }
    

配置unocss rule规则

  • uno.config.ts

    // uno.config.ts
    import {
     defineConfig,
     presetAttributify,
     presetIcons,
     presetTypography,
     presetUno,
     presetWebFonts,
     transformerDirectives,
     transformerVariantGroup
    } from 'unocss'
    
    import { processCss } from "./utils";
    
    export default defineConfig({
     presets: [
      presetUno(),
      presetAttributify(),
      presetIcons(),
      presetTypography(),
      presetWebFonts({
       fonts: {
        // ...
       }
      })
     ],
     shortcuts: [
       ...
      //layout
      {
       "full-screen-w": "w-100vw ml-[calc(-50vw+50%)]",
      },
      //position
      {
       "absolute-h-center": "absolute left-50% -translate-x-50%",
       "absolute-v-center": "absolute top-50% -translate-y-50%",
       "absolute-vh-center": "absolute-h-center absolute-v-center"
      },
      //pop
      {
       "pop-layer": "fixed top-0 left-0 size-auto"
      }
     ],
     rules: [
      [/^(text|bg|border)(-.+)?-c-(\d+)-(\d+)$/, ([val, type, g1, g2, g3]) => {
       switch (type) {
        case 'text': {
         return { color: `var(--c-${g2}-${g3})` };
        }
        case 'bg': {
         return { 'background-color': `var(--c-${g2}-${g3})` };
        }
        case 'border': {
         return { 'border-color': `var(--c-${g2}-${g3})` };
        }
        default: {
         return {}
        }
       }
      }],
     ],
     theme: {
      breakpoints: {
       sm: '640px',
       md: '768px',
       lg: '1024px',
       xl: '1200px',
       xxl: '1680px',
      },
      colors: {
       primary: {
        DEFAULT: 'var(--c-primary)',
        active: 'var(--c-primary-active)',
       },
       minor: {
        DEFAULT: "var(--c-minor)",
        active: "var(--c-minor-active)"
       }
      },
     },
     //! 说明:由于unocss无法识别动态class,所以需要配置出来
     safelist: [
      ...Array.from({ length: 1920 }, (_, i) => `w-${i + 1}px`),
      ...Array.from({ length: 1080 }, (_, i) => `h-${i + 1}px`),
     ],
     transformers: [
      transformerDirectives(),
      transformerVariantGroup()
     ],
     postprocess: [
      (util) => {
       util.entries.forEach((entry) => {
        entry[1] = processCss(entry[1]?.toString());
       });
      }
     ]
    })
    
    

如何使用

<div class="bg-c-01-02 border-c-03-01 text-c-01-02"></div>

Untitled

存在的问题

<div class="bg-c-01-02/.5"></div>
// 如果要给背景色添加一个透明度,这种情况是不支持的,那么如何变得支持呢?

3.gif

说明:你可能会想到改unocss的规则,那么我们来试下

rules: [
  [/^(text|bg|border)(-.+)?-c-(\d+)-(\d+)\/?(.+)?$/, ([val, type, g1, g2, g3, g4]) => {
   switch (type) {
    case 'text': {
     return { color: `var(--c-${g2}-${g3})` };
    }
    case 'bg': {
     return { 'background-color': `rgba(var(--c-${g2}-${g3}),${g4})` };
    }
    case 'border': {
     return { 'border-color': `var(--c-${g2}-${g3})` };
    }
    default: {
     return {}
    }
   }
  }],
 ],

Untitled

说明:好些还可以,我们看下真是效果

Untitled

看到这个你发现问题了,由于我们颜色变量引用的是16进制颜色值,然后rgba的参数是4个,而且是用逗号隔开。可能你会想编译后改样式,类似webpack的css loader一样,但是我们会失去unocss的提示,在开发的时候还是很不方便。所以我想到一个办法,就是把颜色变量变成red,green,blue 最后在规则中拼一个,alpha 值。

$colors: (
 (
  255,255,255,
 )
);
//这个弄是有问题的,因为逗号sass会把数字分割成3个变量,可能你会想成这样

$colors: (
 (
  "255,255,255",
 )
);

//说明:这样最终使用的也不符合rgba参数, 最终改成这样就可以了。unquote 函数会自动把引号去掉
$colors: (
 (
  unquote('255,255,255'),
 )
);

最后的unocss.config.ts 的规则

...
rules: [
  [/^(text|bg|border)(-.+)?-c-(\d+)-(\d+)\/?(.+)?$/, ([val, type, g1, g2, g3, g4]) => {
   switch (type) {
    case 'text': {
     return { color: `rgba(var(--c-${g2}-${g3}))` };
    }
    case 'bg': {
     return {
      'background-color': g4 ? `rgba(var(--c-${g2}-${g3}),${g4})` : `rgba(var(--c-${g2}-${g3}))`
     };
    }
    case 'border': {
     return { 'border-color': `rgba(var(--c-${g2}-${g3}))` };
    }
    default: {
     return {}
    }
   }
  }],
 ],
 ...

测试最终效果

Untitled

Untitled

完美实现我们想要的效果,这样就可以更开心的写样式了。

更多

最近我开源了一个文章助手artipub,可以帮你一键将markdown发布至多平台,方便大家更好的传播知识和分享你的经验。
官网地址:https://artipub.github.io/artipub/ (提示:国内访问可能有点慢,翻墙就会很快)

帮忙点个star⭐,让更多人知道这个工具,谢谢大家🙏。如果你有兴趣,欢迎加入你的加入,一起完善这个工具。

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

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

相关文章

永恒之蓝漏洞复现记录

准备工作 实验环境搭建 下载并安装VMware Workstation软件查看VMware的虚拟网卡和虚拟网络设置安装Windows虚拟机镜像和Kali linux虚拟机镜像 实验目的 掌握Windows网络服务远程渗透攻击基本理论知识。掌握Windows漏洞及漏洞利用方法原理。掌握Windows网络服务远程渗透攻击…

Spring02——bean基础配置、bean实例化——构造方法/静态工厂/实例工厂与FactoryBean、bean的生命周期

IOC相关内容 通过前面两个案例&#xff0c;我们已经学习了bean如何定义配置&#xff0c;DI如何定义配置以及容器对象如何获取的内容&#xff0c;接下来主要是把这三块内容展开进行详细的讲解。 bean基础配置bean实例化——构造方法bean实例化——静态工厂bean实例化-实例工厂…

笔记整理—内核!启动!—uboot部分(3)uboot启动内核传参

uboot会以tag的方式给内核传递参数&#xff0c;tag是一个数据结构&#xff0c;在uboot中与linux_kernel中都有相同的结构。 kernel接收到的传参由若干个tag构成&#xff0c;从tag_start到tag_end之间的数据构成&#xff0c;读到start时开始传参&#xff0c;end结束传参。 CON…

算法专利复现_基于ngboost和SHAP值可解释预测方法

大家好&#xff0c;我是重庆未来之智的Toby老师&#xff0c;最近看到一篇专利&#xff0c;名称是《基于NGBoost和SHAP值的可解释地震动参数概率密度分布预测方法》。该专利申请工日是2021年3月2日。 专利复现 我看了这专利申请文案后&#xff0c;文章整体布局和文字内容结构不错…

算法基础-区间合并

1、按照区间的左端点排序 2、 左端点小于等于ed&#xff0c;只需要更新ed和右端点的最大值 左端点大于ed&#xff0c;存入res中&#xff0c;并更新st和ed&#xff0c;最后一组数据手动插入res public class Main {public static void main(String[] args) {Scanner in new S…

Pinterest账号被封?试试这几种解封方法

Pinterest作为一个充满创意与灵感的视觉社交平台&#xff0c;吸引着大量用户和企业前来展示、收藏和分享他们的作品。然而&#xff0c;如同其他社交媒体平台一样&#xff0c;Pinterest也设立了一套严格的使用规则和监测机制&#xff0c;以保障平台内容的质量和用户的良好体验。…

景联文科技提供运动数据采集服务

运动数据的重要性 运动数据的收集与分析对于提升个人健康管理和运动表现具有重要意义。 通过收集心率、步态、速度等生理和运动参数&#xff0c;不仅可以为运动员提供个性化的训练方案&#xff0c;帮助其优化表现&#xff0c;还能早期发现并预防伤病。对于普通健身者而言&…

MVC架构模式

MVC(ModelView Controller)是软件工程中的一种软件架构模式 &#xff0c;它把软件系统分为模型、 视图和 控制器 三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化定制界面及用户交互的同时…

华为OD机试真题 - 字符成环找偶数O - 滑动窗口(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、…

KTV结算源码--SAAS本地化及未来之窗行业应用跨平台架构

一、代码 function 未来之窗_人工智能_KTV结账(title,桌台id,类型id,类型名称){if(room_status0){alert("空房不可操作");return "空房";}if(room_status1){alert("空房不可操作");}else if(room_status2){//alert("结账");var 未来之…

图像识别智能垃圾桶项目开发

一、项目思维导图 二、语音模块配置信息 三、项目程序 main.c garbage.c garbage.h uartTool.c //串口发送数据 uartTool.h

4款pdf在线编辑工具,带你搞定PDF

作为一个在办公室里日夜奋斗的文案策划人员&#xff0c;我深知在工作中&#xff0c;效率和工具的重要性。PDF文件的编辑是我们工作中不可或缺的一部分&#xff0c;而选择一款合适的PDF编辑器&#xff0c;就像是找到了一把打开效率之门的钥匙。今天&#xff0c;我就来和大家分享…

深度学习-HW3(CNN)卷积神经网络-图像分类-【Datawhale X 李宏毅苹果书 AI夏令营】

分类实际上是一个回归问题。 登录阿里云的账号&#xff0c;才发现有3个账号&#xff0c;要认证学生身份&#xff0c;试遍了3个账号后才试出学生认证号。打开看了一下&#xff0c;居然还有高校教师优惠申请&#xff0c;努力搞一个&#xff08;最近是想薅一把教师资格证的福利&a…

中仕公考怎么样?省考笔试成绩什么时候出?

根据往年的经验&#xff0c;省考笔试的成绩通常在考试后的大约一个月左右公布&#xff0c;但具体日期会根据各省份的公告而有所差异&#xff0c;不同省份具体时间不同&#xff0c;以2024年的为例&#xff1a; 广东省预计于笔试后约30天发布、山东省预计于笔试后约35天发布、浙…

操心没小课堂第一节 协同过滤算法

协同过滤算法 协同过滤算法&#xff08;Collaborative Filtering&#xff09;是推荐系统中一种广泛应用的技术&#xff0c;它主要依赖于用户的行为数据来预测用户可能感兴趣的内容。协同过滤算法可以分为两大类&#xff1a;基于用户的协同过滤&#xff08;User-Based Collabor…

【论文阅读】LJP法律判决预测论文笔记

[大模型 | 类案检索] Precedent-Enhanced Legal Judgment Prediction with LLM and Domain-Model Collaboration key point 会议&#xff1a;EMNLP2023 贡献&#xff1a;提出了一个结合领域模型和大模型的先例增强的LJP框架&#xff0c;其实主要是用到的大模型&#xff0c;比…

Python画笔案例-024 绘制八圆围正方

1、绘制八圆围正方 通过 python 的turtle 库绘制八圆围正方的图案&#xff0c;如下图&#xff1a; 2、实现代码 绘制一个八圆围正方&#xff0c;以下为实现代码&#xff1a; """八圆围正方.py """ from turtle import Turtle # 从海龟模块导入…

阶段二 - 小程序反编译及调试

在打开小程序后&#xff0c;小程序的apkg会放在以下目录中&#xff1a; 使用解包工具对小程序进行解包&#xff1a; 解包工具&#xff1a;链接: https://pan.baidu.com/s/1KLDbivGPCPhqt1nbLVbhXA?pwdkckq 提取码: kckq 解包后会生成一个这样的文件&#xff1a; 在这里输…

【Netty】FastThreadLocal比ThreadLocal快之源码解析

ThreadLocal 【并发设计模式】聊聊线程本地存储模式如何实现的线程安全 【Java并发】从simpleDateFormart聊聊threadlocal原理机制 前两篇中已经从源码角度进行剖析&#xff0c;本篇主要从设计角度剖析。 在并发中为了保证数据安全&#xff0c;可以采用数据隔离的方式 也就是…

微信视频号 点赞+关注+喜欢+发布评论

微信视频号 点赞关注喜欢发布评论 微信视频号 点赞关注喜欢发布评论