使用 TailwindCSS 中的 color-mix() 构建自定义调色板

news2024/11/13 8:01:30

在这篇文章中,我们将了解如何使用 CSS 函数color-mix()和 CSS 变量,通过 TailwindCSS 高效地为 Nuxt 应用程序生成自定义调色板。

先决条件

最好使用以下命令设置 Nuxt 应用程序:

npx nuxi init tailwindcss-color-mix

在安装提示期间选择 TailwindCSS 作为依赖项是最好的。

创建后,在项目的根目录中,您应该创建两个文件 - 其中一个位于包含以下代码的文件夹tailwind.css中:styles

/** styles/tailwind.css */ @tailwind base; @tailwind components; @tailwind utilities;

我们创建另一个文件,tailwind.config.js用于扩展项目中TaiwindCSS的配置:

/** tailwind.config.js */ module.exports = { }

然后在 中nuxt.config.js,您需要tailwindcss使用以下代码设置插件的配置:

/** nuxt.config.js */ export default { //... tailwindcss: { cssPath: '~/styles/tailwind.css', configPath: '~/tailwind.config.js' }, }

了解调色板变体

TailwindCSS 调色板是一组颜色,分为两个部分:较浅的颜色(色调变体)和较深的颜色(阴影变体)。色调变体的范围是 50 到 400,较暗的颜色是 600 到 900,基色是 500 的变体。TailwindCSS 调色板的颜色示例如下#96454c

铜锈色的颜色变体

生成调色板变体的方法有很多。您可以使用调色板生成器从图像构建调色板,或者构建您的机制以获取颜色并使用 JavaScript 生成适当的调色板。

或者你可以使用CSS功能——color-mix()来实现这个目标。

使用 color-mix() 生成具有色调和阴影变体的调色板

color-mix()是一个 CSS 函数,它接受两种颜色并根据给定的颜色空间返回所需的混合颜色变体。要使用color-mix(),我们需要定义colorSpace来计算混合baseColor和的值blendingColor,如以下语法所示:

color-mix( in colorSpace, baseColor <baseColorPercent>, blendingColor <blendingColorPercent> )

如果适用,我们还可以指示浏览器用于混合baseColorPercent的百分比。下面是在颜色空间中将红色与白色混合的示例:baseColor``blendingColorPercent``blendingColor``50%``20%``sRGB``color-mix()

CSS 中生成的混合颜色

虽然baseColorblendingColor可以是任何 CSS 支持的颜色值,但我们也可以使用color-mix()不同的颜色空间进行颜色混合,从 sRGB 到 HSL。结果颜色将根据所选颜色空间而有所不同。在这篇文章中,我们将使用 sRGB 作为我们的色彩空间。

现在我们了解了color-mix()工作原理,我们将探索如何生成色调并共享 Tailwind 调色板的变体。

生成色调变体

如前所述,色调变体是基色的较浅色调,是通过将基色与白色以一定强度级别(或百分比)混合而产生的。

换句话说,我们通过将一种颜色与一定比例的白色混合来创建一个新的变体,使用color-mix()以下公式:

color-mix(in srgb, <color>, white <whitePercentage>)

基于上面的公式,我们实现一个函数getTintVariantColor,它接受一个基数color和一个intensity从 0 到 1 的值,并返回一个包含适当 CSS 代码的字符串color-mix

function getTintVariantColor(color, intensity) { return `color-mix(in srgb, ${color}, white ${intensity * 100}%)` }

由于我们的色调需要 50、100、200 和 400 的变体,因此我们可以whitePercentage相应地逐渐增加每个变体级别的值,如下例所示:

const tintVariants = { 50: 0.95, //95% 100: 0.9, //90% 200: 0.7, //70% 300: 0.5, //50% 400: 0.3, //30% }

伟大的。现在让我们转到文件并使用文件中的字段tailwind.config.js从原色提供自定义调色板,如下所示:#96454c``theme.extend.colors``tailwind.config.js

module.exports = { theme: { extend: { colors: { primary: { 50: getTintVariantColor('#96454c', tintVariants.50), 100: getTintVariantColor('#96454c', tintVariants.100), 200: getTintVariantColor('#96454c', tintVariants.200), 300: getTintVariantColor('#96454c', tintVariants.300), 400: getTintVariantColor('#96454c', tintVariants.400), 500: '#96454c', } }, } }, }

就是这样。当您将以下代码添加到文件中时pages/index.vue,您将看到原色的色调调色板#96454c

`` <template> <main class="flex items-center flex-col gap-5 my-10"> <h1>Current template:</h1> <h2 class="text-primary-500">Base color: #96454c</h2> <ul style="width: 200px"> <li v-for="variant in palettes" :class="bg-primary-${variant} px-3 py-2 ${ variant > 500 ? 'text-white': ''}`" key="variant" > {{variant}}

```

色调变体

由于我们动态计算模板中的类,因此我们需要将primary颜色的类模式添加到safelistTailwindCSS 配置中。否则,TailwindCSS 将不会生成相关类,因为它认为它们未被使用。

module.exports = { //... safelist: [ { pattern: /-primary-/, } ] }

或者,我们还可以为混色器定义基色而不是白色的百分比。在这种情况下,我们计算每个强度级别的colorPercentage值:100% - whitePercentage

const tintVariantsForBaseColor = { 50: 0.05, //95% white 100: 0.1, //90% 200: 0.3, //70% 300: 0.5, //50% 400: 0.7, //30% }

我们的公式将更改为以下形式:

color-mix(in srgb, <color> <colorPercentage>%, white)

结果应该与之前的实现保持相同。

接下来,我们将应用相同的方法来生成阴影变体。

生成阴影变体

虽然色调是由颜色与白色混合产生的变体,但作为较暗的变体,阴影是由我们的目标颜色与黑色以某种强度级别混合产生的颜色。按照前面的色调颜色公式,我们可以getShadeVariantColor()用类似的方式编写一个函数:

function getShadeVariantColor(color, intensity) { return `color-mix(in srgb, ${color}, black ${intensity * 100}% ) }

我们还需要将强度级别定义为 0 到 1 的范围,作为我们的色调的 600、700、800 和 900 的变体,通过逐渐将其值增加 0.2 (20%):

const tintVariants = { 600: 0.1, //10% 700: 0.3, //30% 800: 0.5, //50% 900: 0.7, //70% }

然后在 中tailwind.config.js,我们将使用该getShadeVariantColor()函数生成原色的剩余变体:

module.exports = { theme: { extend: { colors: { primary: { //... 600: getShadeVariantColor('#96454c', shadeVariants.600), 700: getShadeVariantColor('#96454c', shadeVariants.700), 800: getShadeVariantColor('#96454c', shadeVariants.800), 900: getShadeVariantColor('#96454c', shadeVariants.900), } }, } }, }

在该pages/index.vue文件中,我们可以添加剩余的变体代码,palettes如下所示:

```

```

我们现在将看到整个调色板显示在浏览器中:

#96454c 的颜色变体

伟大的。但是如果我们想将主要基色更改为另一种基色怎么办?手动替换变体计算的每一行可能效率很低。我们需要找到一种方法使其更加动态,例如使用 help 或currentColorCSS 变量。接下来我们就来探讨一下。

将 color-mix() 与 currentColor 和 CSS 变量结合使用

不幸的是,我们不能使用currentColorinside color-mix()var()然而,我们可以在函数 and的帮助下使用 CSS 变量color-mix()

以我们的示例调色板为例。我们可以将 CSS 变量分配--color-primary-base给文件中的扩展基础层,而不是直接在配置文件中映射颜色代码tailwind.css,如下所示:

``` /**styles/tailwind.css */ @tailwind base; @tailwind components; @tailwind utilities;

@layer base { :root { --color-primary-base: #96454c; } } ```

然后在 中tailwind.config.js,我们将 的值更改#96454cvar(--color-primary-base)

colors: { 'primary': { 50: 'color-mix(in srgb, var(--color-primary-base) 5%, white)', 100: 'color-mix(in srgb, var(--color-primary-base) 10%, white)', 200: 'color-mix(in srgb, var(--color-primary-base) 30%, white)', 300: 'color-mix(in srgb, var(--color-primary-base) 50%, white)', 400: 'color-mix(in srgb, var(--color-primary-base) 70%, white)', 500: 'var(--color-primary-base)', 600: 'color-mix(in srgb, var(--color-primary-base), black 10%)', 700: 'color-mix(in srgb, var(--color-primary-base), black 30%)', 800: 'color-mix(in srgb, var(--color-primary-base), black 50%)', 900: 'color-mix(in srgb, var(--color-primary-base), black 70%)', }, },

结果保持不变,但每当我们想要更改主基色时,只需更改--color-primary-base主 CSS 文件中的值即可。

浏览器支持

在撰写本文时,除了 Firefox 88 及更高版本之外,大多数浏览器都支持此功能。因此,如果需要 Firefox,请考虑实施回退。

分享一些资源

  • MDN - 颜色混合()
  • 使用 CSS Color-Mix() 简化您的调色板
  • color-mix() - 颜色模块 5

概括

color-mix()在本教程中,我们简要学习了如何在 TailwindCSS-Nuxt 支持的应用程序中使用 CSS 函数、var()CSS 变量和 JavaScript构建颜色变体调色板。事实上,您可以使用相同的方法来计算任何 Web 应用程序开发的颜色主题,而不仅限于 Nuxt 和 TailwindCSS。

虽然color-mix()在许多情况下对纯 CSS 很有帮助,但由于浏览器的限制(Firefox),它可能不是最佳选择。在这种情况下,使用 TailwindCSS 的内置功能进行主题化或使用调色板生成器等外部工具可能是更好的解决方案。尽管如此,纯CSS的力量正在变得越来越强大,功能也越来越方便,值得等待!

如果您尝试过类似color-mix()或任何其他 CSS 功能,请在评论部分与我分享您的经验!

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

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

相关文章

新项目即将启动!小灰做个市场调研

熟悉小灰的小伙伴们都知道&#xff0c;在2019年初&#xff0c;做了整整10年程序员的小灰离开职场&#xff0c;成为了一名自由职业者。 2021年末&#xff0c;小灰注册了自己的公司&#xff0c;名为北京小灰大黄科技有限公司。 公司虽然注册了&#xff0c;但是整个公司只有小灰一…

【C2】文件,时间,多线程,动静态库

文章目录 1.文件&#xff1a;fprint/fgets/fwrite/fread&#xff0c;ftell/rewind/fseek/fflush1.1 文本文件&#xff1a;FILE结构体1.2 二进制文件&#xff1a;没有行概念1.3 文件定位&#xff1a;linux下文本文件模式和二进制文件模式没有区别。fgets和fprintf以行方式读写文…

【Flutter】Flutter 国际化入门 使用 intl 包 格式化日期

文章目录 一、 前言二、 版本信息三、 什么是 intl 包四、 如何安装和使用 intl 包1. 安装 intl 包2. 使用 intl 包进行基本的日期和数字格式化3. 使用 intl 包进行消息翻译 五、 一个简单的使用示例六、 总结 一、 前言 在全球化的今天&#xff0c;为你的 Flutter 应用添加国…

快速上手MATLAB图像处理:100种项目全覆盖

本教程涵盖了MATLAB图像处理的广泛内容。我们学习了图像读取、显示和保存,图像的基本操作(如缩放、裁剪、旋转和翻转),以及图像的基本增强(如亮度调整、对比度调整和颜色空间转换)。本教程还介绍了常见的图像滤波技术(如均值滤波、中值滤波和高斯滤波),图像的直方图均…

JAVA临时文件的使用

目录 什么是临时文件&#xff1f; 临时文件在编程中有各种妙用 java在缓存目录创建临时文件的方式 1 按照指定文件名随机数字共同作为文件名创建 2 按照指定文件名创建 3 通过获取临时文件夹的真实路径 什么是临时文件&#xff1f; 临时文件是在计算机系统中用于临时存储数…

Spring Cloud - Gateway统一网关、断言工厂、过滤器工厂、全局过滤器、跨域问题

目录 一、什么是网关&#xff1f;为什么选择 Gateway? 二、Gateway 网关 2.1、搭建网关服务 1.创建新的module&#xff0c;引入SpringCloudGateway的依赖和nacos的服务发现依赖 2.编写nacos地址和路由配置 2.2、路由断言工厂PredicateFactory 2.3、路由过滤器 GatewayF…

2015年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

如何删除Git仓库中的敏感文件及其历史记录

本文主要介绍如何使用 git filter-branch 命令删除 Git 仓库中的敏感文件及其历史记录。在 Git 中&#xff0c;我们通常会将敏感信息(如密码、私钥等)存储在 .gitignore 文件中&#xff0c;以防止这些信息被意外提交到仓库。有时候&#xff0c;因为疏忽或私有仓库转公开仓库&am…

SQL15 查看学校名称中含北京的用户

SELECT device_id,age,university FROM user_profile WHERE university LIKE %北京%下划线 代表匹配任意一个字符&#xff1b; % &#xff1a;百分号 代表匹配0个或多个字符&#xff1b; []: 中括号 代表匹配其中的任意一个字符&#xff1b; [^]: ^尖冒号 代表 非&#xff0c;取…

CRM系统通过哪三步增加销售团队协作?

销售团队的协作是企业成功的重要保障。协调一致的销售团队能够提升销售效率&#xff0c;提高销售转化&#xff0c;获得更多业绩收入。那么企业要如何增加销售团队的协作&#xff1f;可以用CRM销售管理系统。 CRM系统如何增加销售团队协作&#xff1a; 1、建立统一的客户数据库…

SAP ABAP 如果某字段没有参数ID,如自开发程序使用的自建表 新建参数ID

1&#xff09;新建参数ID sm30 TPARA 维护 输入ID和描述 2&#xff09; 参数ID和Se11数据元素 绑定

【EasyX】扫雷

目录 扫雷1. 主体功能描述2、主要实现步骤3、效果图 扫雷 本博客介绍利用EasyX加上图片、音乐素材实现一个传统的扫雷小游戏。 1. 主体功能描述 1、全局变量&#xff1a;时间、地图、图片资源、状态&#xff1b; 2、绘图初始化函数drawinit&#xff1a;载入图片资源&#xf…

力扣 701. 二叉搜索树中的插入操作

题目来源&#xff1a;https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 思路&#xff1a;只要根据二叉搜索树的特性&#xff0c;将新插入节点的值不断地与树节点值进行比较&#xff0c;然后找到新节点所属的叶子节点位置&#xff0c;插入即好&…

Jetson Nano供电

1.Jetson Nano供电 Jetson Nano开发板有5种供电方式&#xff1a; 5V 2A(micro USB) 5V 3A(GPIO引脚) 5V 4A(DC接口) 5V 6A(所有电源IO反向供电) POE供电 其中&#xff0c; 5V 2A是受限于USB自身&#xff0c;强烈推荐DC 4A供电&#xff0c;满足Jetson Nano大部分使用场景&…

Linux基础_2

目录 一、获取帮助 1、whatis 2、查看命令的帮助 内部命令 外部命令 3、man命令 作用&#xff1a;提供命令帮助的文件 4、info命令 作用&#xff1a;常用于命令参考&#xff0c;GNU工具&#xff0c;适合通用文档参考 5、Linux安装提供的本地文档获取帮助 Applicatio…

ES6的类 vs TypeScript的类:解密两种语言中的面向对象之争

文章目录 ES6 类ES6 类的常见特性1. 构造函数2. 实例方法3. 静态方法4. 继承 TypeScript 类TypeScript 类的特性1. 类型注解2. 访问修饰符3. 类型推断4. 接口实现 ES6 类 ES6&#xff08;ECMAScript 2015&#xff09;引入了类的概念&#xff0c;为 JavaScript 增加了面向对象编…

费马原理与光的反射折射

费马原理&#xff1a;光传播的路径是光程取极值的路径 光的反射 如上图所示&#xff0c;光从P点出发射向x点&#xff0c;反射到Q点。 P 点到 x 点的距离 d 1 x 2 a 2 d1 \sqrt{x^2 a^2} d1x2a2 ​ Q 点到 x 点的距离 d 2 b 2 ( l − x ) 2 d2 \sqrt{b^2 (l-x)^2} d2…

WebAPIs-DOM操作元素属性/自定义属性

Web APIs web APIs 操作页面元素做出各种效果 DOM 文档对象模型 使用js操作页面文档 BOM 浏览器对象模型 使用js操作浏览器 API 应用程序接口 接口&#xff1a;无需关心内部如何实现&#xff0c;只需要调用就可以很方便实现某些功能 作用&#xff1a;使用js提供的接口来操…

SQL事务与隔离

事务 事务的定义 事务是完成一个任务的多条语句,这些语句中,只要有一条语句失败,那么整个事务就会失败,即使之前的语句已经执行完毕也会被撤回 举个例子: 我去银行给王哥转钱,这个转钱呢分两个步骤,第一步先把我的钱拿出来,第二步把钱给王哥,那万一刚把我钱拿出来但是没到王…