如何评价CSS框架TailwindCSS?

图片

端午三天,你们在放假,而我,一个人躲在家里,苦练 tailwindcss。

我在准备这样一个学习项目,它与传统的文章/视频类学习不同,我会在教程中内置大量的可交互案例,提供沉浸式的学习体验,并且还可以支持实时修改代码观察案例更改结果。大家可以期待一下。

图片

经过这个项目的历练,现在,我已熟练度拉满,彻底拿捏了 tailwindcss。

魔功大成!

这篇文章,就跟大家分享一下我在 tailwindcss 中已经使用到的高级用法。

  • 一、彻底读懂配置文件 tailwind.config.js

  • 二、定义自己喜欢的语法

  • 二、定义自己喜欢的功能块

  • 三、定义自己想要的插件

  • 三、高级用法:简单实现皮肤切换

0

高端,从读懂配置文件开始

在使用 tailwindcss 时,我们可以在项目根目录创建一个配置文件 tailwind.confing.js,用于控制 tailwindcss 的语法,理论上来说,你可以把 tw 调整成任何你需要的形状。

使用如下指令,可以在根目录创建一个最简单的配置文件模板

npx tailwindcss init
/** @type {import('tailwindcss').Config} */
module.exports = {content: [],theme: {extend: {},},plugins: [],
}

content

content 选项是一个数组,用于指定 tailwindcss 语法生效的文件集合。

content: ['./pages/**/*.{js,jsx}','./components/**/*.{js,jsx}','./app/**/*.{js,jsx}','./src/**/*.{js,jsx}',
]

tailwind 使用 fast-glob 库来匹配文件。其中,* 匹配任意字符,** 匹配 0 个或者多个目录,{js, jsx} 匹配多个值。

图片

配置完之后的文件数量越多,编译时的压力就越大,因此我们应该尽可能缩小 tailwindcss 的配置范围,只在需要它的地方使用。例如 utils 目录可能会包含大量的文件,但是不会使用 tailwindcss,那么我们就应该把他剔除掉。

当然我们还可以做其他的一些配置增强,但是大多都没什么用,对我来说,这里一个比较有用的配置项是 transform。我写的文章内容,源文件是 .md 格式,此时如果我想要在 .md 中使用 tailwindcss,那么就需要将其转换为 html 之后再适配 tailwindcss,我们就可以这样配置

const remark = require('remark')module.exports = {content: {files: ['./src/**/*.{html,md}'],transform: {md: (content) => {return remark().process(content)}}},// ...
}

theme

theme 字段的配置是我们拿捏 tailwindcss 的核心关键。我们可以通过这个字段自定义任意语法。但是这个语法新人玩家容易看不懂,一长串不知道如何使用。我给大家讲解一下很快就很搞懂了

首先,theme 中包含了大量的字段,这些字段有 colorstextColor,这个是啥意思呢?就很迷惑。

我们可以在这个地址中,查看默认的完整配置项 https://github.com/tailwindlabs/tailwindcss/blob/master/stubs/config.full.js#L5

其实,我们只需要利用好官方文档,就能很轻松的搞懂这些配置。theme 中的字段主要分为两类,一类表示 css 属性。一类表示配置。

例如在配置文件中,有一个 borderWidth的配置如下

borderWidth: {DEFAULT: '1px',0: '0px',2: '2px',4: '4px',8: '8px',
},

这看上去像是一个 css 属性,又像是一个配置项,那么我们可以去官方文档的如下地址中,直接查这个单词. 点开之后发现,这里确实是一个属性值。并且具体的缩写与写法,配置参数都一目了然,比只看官方文档更加具体。

图片

又例如,我们在配置项中发现了一个属性 spacing

spacing: {px: '1px',0: '0px',0.5: '0.125rem',1: '0.25rem',1.5: '0.375rem',2: '0.5rem',2.5: '0.625rem',3: '0.75rem',3.5: '0.875rem',4: '1rem',5: '1.25rem',6: '1.5rem',7: '1.75rem',8: '2rem',9: '2.25rem',10: '2.5rem',11: '2.75rem',12: '3rem',14: '3.5rem',16: '4rem',20: '5rem',24: '6rem',28: '7rem',32: '8rem',36: '9rem',40: '10rem',44: '11rem',48: '12rem',52: '13rem',56: '14rem',60: '15rem',64: '16rem',72: '18rem',80: '20rem',96: '24rem',
},

然后对应去官方文档查一下,发现这是一个配置项。那么我们就可以知道,这可能会作为入参运用到其他属性的设置中去。

图片

我们也可以自己定义非 rem 的属性单位,使用数组遍历的方式生成 1px -> 500px 中比较常用的一些数值,具体要结合实际情况和设计规范来约定它的配置

有了这个配置项之后,我们就可以使用它作为入参去配置其他 css 属性,例如 margin 值。这里的 theme 表示一个 get 方法,可以获取到 theme 配置项中对应属性的具体值。例如这里的 theme('spacing') 就是获取到我们刚才的配置项

margin: ({ theme }) => ({auto: 'auto',...theme('spacing'),
}),

这样,margin 写法后面跟的数字,就是我们约定的 spacing 中具体的值了。

图片

m-0.5 ,对应的值,就是 spacing 中的 0.5:0.125rem

图片

theme 中的大多数属性值,都是 css 属性值,只有少数几个值是表示配置项,具体内容不用刻意去记忆,只需要在用到的时候查阅文档即可。如果你只是需要做简单粗暴的自定义修改,直接在默认配置的基础之上修改样式就可以

1

定义自己喜欢的语法

自定义语法更好的方式是使用 extend 配置去覆盖原有配置项。例如,我想要重新针对 background-color 定义一个语法写法如下,使用黑色的拼音缩写来表达颜色,使用数字来表示不同程度的黑色

bg-heise-0
bg-heise-1
bg-heise-2
bg-heise-3
bg-heise-4

首先我们要做的第一件事情,是在官方文档中,找到 background color 对应的缩写是什么

图片

然后在 extend 字段中,对应的字段里,配置自定义的语法,heise.

theme: {extend: {backgroundColor: {heise: {0: 'rgba(0, 0, 0, 0)',1: 'rgba(0, 0, 0, 0.1)',2: 'rgba(0, 0, 0, 0.2)',3: 'rgba(0, 0, 0, 0.3)',4: 'rgba(0, 0, 0, 0.4)',},

此时,我们的语法就是属性缩写开头的方式, bg-heise-0,我们可以看到,在文件中使用改语法时,智能提示已经有了我们自己定义的语法,完美!

2

定义自己想要的功能块

tailwindcss 有三个模块。

@tailwind base;
@tailwind components;
@tailwind utilities;

base 表示样式重置模块。components 表示组件模块,utilities 表示功能模块,我们可以通过插件的形式,往这几个功能模块中新增我们想要的功能块。

例如,我希望自定义默认的 button 元素的样式,那么我们就可以往 base 模块中注入样式,首先引入插件方法

const plugin = require('tailwindcss/plugin')

然后在 plugins 字段中新增配置样式

module.exports = {plugins: [plugin(function({ addBase, theme }) {addBase({'button': { color: theme('colors.orange.700') }})})]
}

然后,我在项目中写上如下代码,对应的结果如图所示,文字颜色变成了 orange.700

<button>自定义button默认样式</button>

图片

我们可以通过这中方式约定所有的基础样式,button, input 等都非常需要这样的约定。

当然,我们也可以通过类似的方式往 components 中新增样式。例如我希望新增一个 card 组件,用于表示一个区域的容器,那么我就可以这样写

plugin(({addComponents, theme}) => {addComponents({'.card': {display: 'inline-block',padding: '1rem',border: '1px solid',borderRadius: '4px',borderColor: theme('colors.red.400'),margin: '1rem'}})
}),

然后我在项目中编写如下代码

<div className='card'><button>自定义button默认样式</button>
</div>

图片

给力!

3

定义自己想要的插件

如下图所示,此时我们想要实现的一个功能是自定义字体大小的递增序列。具体的编号和对应的值都由我们自己来定 fsize-12,而不是通过默认的 text-xxx 来约定。

图片

首先,我们先在 theme 中约定配置项,数量太多的时候,你也可以通过数组遍历来快速创建

theme: {fsizes: {12: '12px',14: '14px',16: '16px',18: '18px',24: '24px',32: '32px',},...

然后,plugins 字段中,使用 matchUtilities 方法动态匹配后缀自增的 class

plugin(({matchUtilities, theme}) => {matchUtilities({fsize: (value) => ({fontSize: value})}, {values: theme('fsizes')})
})

搞定,最后的演示结果如图所示

图片

4

高级用法:简单实现皮肤切换

最后,我们再来一个具体的,实用功能的实现:皮肤切换。具体的实现方式仍然是利用 css 自定义变量来做到。

实现效果如图所示

图片

主题来源于 tailwindcss 官方教学视频

我们来看一下实现步骤。

首先,我们要在入口 css 中文件中,约定不同主题的 css 变量。

@layer base {:root {--color-text-base: #FFF;--color-text-muted: #c7d2f7;--color-text-inverted: #4f46e5;--color-fill: #4338ca;--color-button-accent: #FFF;--color-button-accent-hover: #eef2ff;--color-button-muted: 99, 102, 241;}.theme-swiss {--color-text-base: #FFF;--color-text-muted: #fecaca;--color-text-inverted: #dc2626;--color-fill: #b91c1c;--color-button-accent: #FFF;--color-button-accent-hover: #fef2f2;--color-button-muted: 239, 68, 68;}.theme-neon {--color-text-base: #111802;--color-text-muted: #2fc306;--color-text-inverted: #ebfacc;--color-fill: #b3ff17;--color-button-accent: #243403;--color-button-accent-hover: #374f05;--color-button-muted: 212, 255, 122;}
}

@layer base 表示这些定义会运用到 base 模块中。

定义好了主题之后,我们就需要去 extend 字段中自定义语法。首先是针对于文字颜色字段,该字段在 css 中为  color,不过在 tailwind 中,被重新定义了语义,称之为 text color

图片

因此,我们要使用 textColor 来定义该语法,

extend: {textColor: {skin: {base: 'var(--color-text-base)',muted: 'var(--color-text-muted)',inverted: 'var(--color-text-inverted)',}},

textColor 的对应缩写为 text,因此最终我们自定义的语法名如下所示

图片

用同样的方式定义背景颜色

backgroundColor: {skin: {fill: 'var(--color-fill)','button-accent': 'var(--color-button-accent)','button-accent-hover': 'var(--color-button-accent-hover)','button-muted': ({opacityValue}) => {console.log(opacityValue)if (opacityValue !== undefined) {return `rgba(var(--color-button-muted), ${opacityValue})`}return `rgb(var(--color-button-muted))`},}
},

图片

在需要颜色的地方,我们使用自己定义好的语法来设置颜色。

他们的值,都由 var 来声明,对应到我们刚才定义的 css 变量。因此,这样做好之后,当我们改变 css 变量的生效结果,那么皮肤切换就能自定生成。

我们可以更改顶层父组件的 className 来做到变量名的整体切换。

图片

实现完成之后,再来看一眼演示效果,没有问题,搞定!

图片

5

总结

实践中的需求非常复杂,每个团队对于 UI 的设计规范不同,那么默认样式就很难满足所有团队的需求,因此,掌握如何将 tailwindcss 配置为你的形状,是在团队中推广和运用它的必要条件。

但是官方文档对于配置文件的讲解有一些缺漏,导致我也花了很长时间,查了不少资料才最终读懂,因此这篇文章我把缺漏的部分补上,有助于道友们更加方便理解它,并结合官方文档彻底拿捏 tailwindcss 的自定义配置。

仅供参考!!!

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

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

相关文章

Zynq7000系列FPGA中DMA引擎编程指南

DMA引擎的编程指南通常涉及一系列步骤和API调用&#xff0c;以确保数据在内存之间的高效传输&#xff0c;而无需CPU的直接干预。 DMA引擎的编程指南包括以下部分&#xff1a; 一、编写微代码为AXI事务编写CCRx程序 通道微码用于设置dmac.CCRx寄存器以定义AXI事务的属性。这是…

TikTok直播限流与网络的关系及解决方法

TikTok作为一款热门的社交平台&#xff0c;其直播功能吸引了大量用户。然而&#xff0c;一些用户可能会遇到TikTok直播限流的问题&#xff0c;例如直播过程中出现播放量低、直播画面质量差等情况。那么&#xff0c;TikTok直播限流与所使用的网络线路是否有关系&#xff1f;是否…

学习springIOC

第二章 Spring IOC 章节内容 Spring IOC技术实现Spring IOC设值注入Spring IOC构造注入 章节目标 掌握Spring IOC技术实现掌握Spring IOC设置注入掌握Spring IOC构造注入 第一节 Spring简介 1. Spring 简介 Spring 是目前主流的 Java 开发框架&#xff0c;是 Java 世界最…

Android实现手写输入

android应用开发中有时会有手写输入需求&#xff0c;非通过系统键盘手写功能&#xff0c;比如自定义键盘&#xff0c;这时就需要自己来实现&#xff0c;一般有两种场景&#xff1a;一种是类似手写签名保存&#xff1b;另一种是真正的手写输入&#xff0c;需要将笔迹识别成正确的…

JTracker IDEA 中最好的 MyBatis 日志格式化插件

前言 如果你使用 MyBatis ORM 框架&#xff0c;那么你应该用过 MyBatis Log 格式化插件&#xff0c;它可以让我们的程序输出的日志更人性化。 但是有一个问题&#xff0c;通常我们只能看到格式化后的效果&#xff0c;没办法知道这个 SQL 是谁执行的以及调用的链路。 如下图所…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑复合指标优化模态分解和 Stacking 集成的综合能源系统多元负荷预测》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【stm32】大一上学期笔记复制

砌墙单片机 外设是什么&#xff1f; ipage 8 nx轴 128 X0-127 y0-63 PWM脉冲宽度调制 PWM脉冲宽度调制 2023年10月13日 基本特性&#xff1a;脉冲宽度调制PWM是一种对模拟信号进行数字编码的方法。广泛引用于电机控制&#xff0c;灯光的亮度调节&#xff0c;功率控制等领域…

赶紧收藏!全网最佳WebSocket封装:完美支持断网重连,自动心跳!

文章目录 一、WebSocket封装库简介二、库的安装与配置2.1 安装2.2 初始化 三、功能详解3.1 断网重连3.2 自动心跳3.3 消息队列3.4 事件管理 四、示例代码五、总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&…

Windows Server 2019部署网络负载均衡NLB服务的详细操作步骤

部署前准备 首先需要准备两台Windows Server 2019服务器&#xff0c;虚拟机创建请参考 VMware Workstation安装Windows Server2019系统详细操作步骤_安装windows server 2019操作系统(写出操作过程)-CSDN博客 克隆虚拟机请参考 VMware Workstation克隆虚拟机详细步骤-CSDN博…

超详细的 C++中的封装继承和多态的知识总结<2.多态>

引言 小伙伴们我们都知道了&#xff0c;什么是封装和继承&#xff0c;在有了这个的基础上我们接着来看什么是多态。多态从字面上意思我们就可以知道&#xff0c;大概就是一个函数的不同形态&#xff0c;而且&#xff0c;前边我们在学习函数重载的时候我们已经简单的了解了如何用…

[Swiper]在React中使用Swiper时注意销毁实例

swiper版本号&#xff1a; {"swiper": "^4.4.2", }在useEffect中初始化swiper实例&#xff0c;由于依赖项的变更&#xff0c;可能会重复初始化: useEffect(() > {swiper.current new Swiper(#mainSwiper, {autoplay: {delay: 3000,//3秒切换一次},on…

推荐算法学习笔记2.1:基于深度学习的推荐算法-基于共线矩阵的深度推荐算法-AutoRec模型

AutoRec模型 前置知识&#xff1a;推荐算法学习笔记1.1:传统推荐算法-协同过滤算法 AutoRec模型通过引入自编码器结构&#xff0c;将共线矩阵中的用户向量&#xff08;基于用户的U-AutoRec&#xff09;或物品向量&#xff08;基于物品的I-AutoRec&#xff09;嵌入到低维空间后还…

讯方技术鸿蒙应用定制开发服务上架华为云商店

在当前智能化与互联互通发展的时代背景下&#xff0c;鸿蒙操作系统已成为推动创新应用发展的新引擎。随着企业对个性化智能解决方案需求的不断增长&#xff0c;鸿蒙应用定制开发已成为企业技术转型升级的重要途径。 讯方技术作为一家致力于为客户提供全面专业服务的企业&#…

LVM核心概念

1. LVM简介 LVM是逻辑盘卷管理&#xff08;Logical Volume Manager&#xff09;的简称&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制&#xff0c;LVM是建立在硬盘和分区之上的一个逻辑层&#xff0c;来提高磁盘分区管理的灵活性。 优点&#xff1a; 可以灵活分配…

2024年,精品课录制新方式,站在大屏前录出绿幕抠像的效果!感谢不坑盒子!

先做个小调查&#xff1a;你们那边请工作室录一节课&#xff0c;多少钱&#xff1f;留言区交流一下。 暑假了&#xff0c;老师们又有时间来录课了。 早在2021年秋天&#xff0c;精品课遴选的第一年&#xff0c;我就第一时间给大家分享了2种录精品课的方法&#xff1a;大屏前录…

python源码:opencv多视频源同屏拼接播放

一、前言 如标题所示&#xff0c;这个python代码的目的是利用opencv模块实现多视频源同屏拼接播放的&#xff0c;里面包含视频播放尺寸修改、视频播放加序号、视频流存活检测等方案&#xff0c;可做扩展开发使用。 二、代码 import cv2 import time from func_timeout import …

JAVA里的BigDecimal用法

public class BigDecimaldemo1 {public static void main(String[] args) {System.out.println(0.090.01);//为什么不是0.10呢?} }在使用float或者double类型的数据在进行数学运算的时候&#xff0c;很有可能会产生精度丢失问题。我们都知道计算机底层在进行运算的时候&#x…

科林Linux7_网络爬虫

一、爬虫 网络资源的下载工具&#xff0c;工作与万维网环境&#xff0c;持续获取网页网站中的网络信息。可持续的数据采集机器人 1、搜索引擎技术使用爬虫 2、数据分析、数据挖掘领域&#xff0c;需要爬虫进行数据准备 3、数据批处理、采集&#xff0c;大量获取某些网站中的…

LeetCode题练习与总结:二叉树的前序遍历--144

一、题目描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;roo…

数据资产的创新应用与未来展望:探讨数据资产在人工智能、物联网等新兴领域的应用前景,提出前瞻性的数据资产解决方案,为企业探索新的增长点,推动行业创新发展

目录 一、引言 二、数据资产在人工智能领域的应用 1、机器学习与深度学习 2、自然语言处理 3、计算机视觉 三、数据资产在物联网领域的应用 1、智能家居 2、工业物联网 3、智慧城市 四、前瞻性的数据资产解决方案 1、构建统一的数据管理平台 2、加强数据安全和隐私…