当前位置: 首页 > article >正文

Tailwind CSS 自定义样式

Tailwind CSS 自定义样式学习笔记一、自定义样式的层次结构┌──────────────────────────────────────────────────────┐ │ tailwind.config.js → 设计系统 Token颜色/间距/字号 │ │ layer base → 全局基础样式重置 │ │ layer components → 组件级自定义类 │ │ layer utilities → 自定义工具类 │ │ layer 外部 → 第三方/覆盖样式 │ │ arbitrary values → 一次性行内自定义值 │ └──────────────────────────────────────────────────────┘二、方法一Arbitrary Values任意值无需修改配置直接在类名中使用方括号语法写入任意 CSS 值。基本语法!-- 间距 --divclassmt-[17px] w-[calc(100%-3rem)] p-[2.5rem]!-- 颜色 --spanclasstext-[#1da1f2] bg-[rgb(59,130,246,0.5)]!-- 字体 --pclasstext-[22px] leading-[27px] font-[500] tracking-[0.01em]!-- 动画 --divclassanimate-[spin_1.5s_linear_infinite]!-- 背景图 --divclassbg-[url(/hero-pattern.png)] bg-[size:100px_100px]任意变体Arbitrary Variants!-- 任意媒体查询 --divclass[supports(display:grid)]:grid!-- 任意选择器 --divclass[:nth-child(3)]:underlinedivclass[::before]:content-[→] [::before]:mr-2!-- 子元素选择器 --navclass[li]:flex [li]:items-center!-- 父级上下文 --divclass[.dark_]:text-white注意事项任意值中的空格用_代替animate-[spin_1s_linear_infinite]任意值中的逗号用_代替grid-cols-[repeat(3,1fr)]→grid-cols-[repeat(3,1fr)]仅用于一次性场景频繁出现应提取到配置中三、方法二扩展 Theme 配置2.1 扩展 vs 覆盖// tailwind.config.jsmodule.exports{theme:{// ❌ 覆盖 — 完全替换默认值丢失 Tailwind 默认色板colors:{brand:#3b82f6,},// ✅ 扩展 — 在默认值基础上追加extend:{colors:{brand:#3b82f6,},},},};2.2 自定义颜色module.exports{theme:{extend:{colors:{// 简单值brand:#3b82f6,// 色阶对象生成 text-brand-50 ~ text-brand-950brand:{50:#eff6ff,100:#dbeafe,200:#bfdbfe,300:#93c5fd,400:#60a5fa,500:#3b82f6,600:#2563eb,700:#1d4ed8,800:#1e40af,900:#1e3a8a,950:#172554,},// CSS 变量引用surface:var(--color-surface),on:{surface:var(--color-on-surface),},},},},};buttonclassbg-brand-500 text-white hover:bg-brand-600品牌按钮/buttondivclassbg-surface text-on-surface主题卡片/div2.3 自定义间距 / 尺寸extend:{spacing:{4.5:1.125rem,18:4.5rem,128:32rem,},width:{1/7:14.2857%,2/7:28.5714%,},height:{screen/2:50vh,},}2.4 自定义字体extend:{fontFamily:{sans:[Inter,system-ui,sans-serif],mono:[JetBrains Mono,Fira Code,monospace],display:[Cal Sans,sans-serif],},fontSize:{xxs:[0.625rem,{lineHeight:0.875rem}],2xl:[1.25rem,{lineHeight:1.75rem,letterSpacing:-0.01em}],},}h1classfont-display text-2xl标题/h1codeclassfont-mono text-xxs代码/code2.5 自定义动画extend:{keyframes:{fade-in:{0%:{opacity:0,transform:translateY(10px)},100%:{opacity:1,transform:translateY(0)},},slide-in-right:{0%:{transform:translateX(100%)},100%:{transform:translateX(0)},},shimmer:{100%:{transform:translateX(100%)},},},animation:{fade-in:fade-in 0.3s ease-out forwards,slide-in-right:slide-in-right 0.4s ease-out,shimmer:shimmer 2s infinite,},}divclassanimate-fade-in淡入效果/divdivclassanimate-slide-in-right右侧滑入/div2.6 自定义阴影 / 边框圆角 / 过渡extend:{boxShadow:{glow:0 0 15px rgba(59, 130, 246, 0.5),inner-lg:inset 0 2px 4px 0 rgb(0 0 0 / 0.1),},borderRadius:{4xl:2rem,5xl:2.5rem,},transitionTimingFunction:{bounce-in:cubic-bezier(0.68, -0.55, 0.265, 1.55),},}四、方法三layer 指令4.1 Base 层 — 全局基础样式tailwindbase;layerbase{/* 全局字体平滑 */html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}/* CSS 变量定义 */:root{--color-surface:#ffffff;--color-on-surface:#1a1a2e;--header-height:4rem;}.dark{--color-surface:#1a1a2e;--color-on-surface:#e2e8f0;}/* 重置或覆盖默认样式 */h1{applytext-2xl font-bold tracking-tight;}h2{applytext-xl font-semibold;}/* 焦点样式 */*:focus-visible{applyoutline-2 outline-offset-2 outline-blue-500;}}4.2 Components 层 — 组件级样式tailwindcomponents;layercomponents{/* 使用 apply 聚合 */.btn{applyinline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colorsfocus-visible:outline-nonefocus-visible:ring-2focus-visible:ring-offset-2disabled:pointer-events-nonedisabled:opacity-50;}.btn-primary{applybtn bg-blue-600 text-whitehover:bg-blue-700focus-visible:ring-blue-500;}/* 也可以写原生 CSS */.input-field{applyw-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm transition-colors;}.input-field:focus{applyborder-blue-500 ring-1 ring-blue-500 outline-none;}/* 响应式组件 */.container-narrow{applymx-auto w-full px-4sm:px-6lg:max-w-3xl;}}4.3 Utilities 层 — 自定义工具类tailwindutilities;layerutilities{/* 自定义工具类 */.text-balance{text-wrap:balance;}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none;::-webkit-scrollbar{display:none;}}.line-clamp-4{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4;}}Layer 优先级base components utilities 无 layer 的样式utilities层优先级最高可以覆盖components层不在layer中的样式优先级最高慎用五、方法四Plugin 插件5.1 内联插件// tailwind.config.jsconstpluginrequire(tailwindcss/plugin);module.exports{plugins:[// 添加自定义工具类plugin(function({addUtilities,theme}){constnewUtilities{.text-shadow:{textShadow:0 2px 4px rgba(0,0,0,0.1),},.text-shadow-lg:{textShadow:0 4px 8px rgba(0,0,0,0.15),},.text-shadow-none:{textShadow:none,},};addUtilities(newUtilities);}),// 添加自定义组件plugin(function({addComponents,theme}){addComponents({.card:{backgroundColor:theme(colors.white),borderRadius:theme(borderRadius.xl),padding:theme(spacing.6),boxShadow:theme(boxShadow.lg),border:1px solid${theme(colors.gray.200)},},.card-compact:{padding:theme(spacing.4),},});}),// 添加基础样式plugin(function({addBase,theme}){addBase({h1:{fontSize:theme(fontSize.2xl)},h2:{fontSize:theme(fontSize.xl)},});}),// 动态生成工具类plugin(function({addUtilities,e,theme}){constgradientstheme(gradients,{});Object.entries(gradients).forEach(([name,value]){addUtilities({[.bg-gradient-${e(name)}]:{backgroundImage:value,},});});}),],theme:{gradients:{blue:linear-gradient(to right, #3b82f6, #8b5cf6),green:linear-gradient(to right, #10b981, #3b82f6),sunset:linear-gradient(to right, #f97316, #ec4899),},},};5.2 独立插件包// my-tailwind-plugin/index.jsconstpluginrequire(tailwindcss/plugin);module.exportsplugin.withOptions(function(options{}){returnfunction({addUtilities,theme}){constprefixoptions.prefix??my;addUtilities({[.${prefix}-text-gradient]:{backgroundImage:var(--gradient,${theme(gradients.blue,linear-gradient(to right, #3b82f6, #8b5cf6))}),WebkitBackgroundClip:text,WebkitTextFillColor:transparent,},});};},function(options){return{theme:{gradients:{blue:linear-gradient(to right, #3b82f6, #8b5cf6),sunset:linear-gradient(to right, #f97316, #ec4899),},},};});// 使用module.exports{plugins:[require(./my-tailwind-plugin)({prefix:app}),],};六、方法五CSS 变量 Tailwind 联动6.1 定义 CSS 变量layerbase{:root{--color-background:#ffffff;--color-foreground:#171717;--color-primary:#2563eb;--color-muted:#f5f5f5;--radius:0.5rem;}.dark{--color-background:#0a0a0a;--color-foreground:#ededed;--color-primary:#3b82f6;--color-muted:#262626;}}6.2 在 Tailwind 配置中引用module.exports{theme:{extend:{colors:{background:var(--color-background),foreground:var(--color-foreground),primary:var(--color-primary),muted:var(--color-muted),},borderRadius:{DEFAULT:var(--radius),},},},};divclassbg-background text-foregroundbuttonclassbg-primary text-white rounded-md按钮/buttondivclassbg-muted p-4静音区域/div/div6.3 运行时切换主题// 切换暗色模式document.documentElement.classList.toggle(dark);// 动态修改变量如用户自定义主题色document.documentElement.style.setProperty(--color-primary,#ec4899);七、方法六Important 修饰符与优先级控制!-- ! 前缀强制 important --pclass!text-red-500 font-bold!-- 生成: color: #ef4444 !important; --// 全局开启 important避免与第三方 CSS 冲突module.exports{important:true,// 所有工具类都加 !important// 或指定选择器推荐避免与第三方库冲突important:#app,};/* 生成结果 */#app .text-red-500{color:#ef4444;}八、完整配置示例// tailwind.config.jsconstpluginrequire(tailwindcss/plugin);module.exports{content:[./src/**/*.{html,js,jsx,ts,tsx,vue}],important:#app,theme:{extend:{// 颜色系统colors:{brand:{50:#eff6ff,500:#3b82f6,600:#2563eb,700:#1d4ed8,},surface:var(--color-surface),},// 字体fontFamily:{sans:[Inter,system-ui,sans-serif],mono:[JetBrains Mono,monospace],},// 动画keyframes:{fade-in:{0%:{opacity:0},100%:{opacity:1},},},animation:{fade-in:fade-in 0.3s ease-out,},// 自定义间距spacing:{18:4.5rem,},},},plugins:[// 自定义工具类插件plugin(function({addUtilities}){addUtilities({.text-balance:{textWrap:balance},.scrollbar-hide:{-ms-overflow-style:none,scrollbar-width:none,::-webkit-scrollbar:{display:none},},});}),],};九、决策速查表需求推荐方案示例一次性特殊值Arbitrary Valuestop-[17px]设计系统级颜色/间距theme.extendcolors.brand.500全局基础样式layer base字体平滑、CSS 变量组件级样式聚合layer componentsapply.btn-primary自定义工具类layer utilities或 Plugin.text-balance动态主题切换CSS 变量 theme.extendvar(--color-primary)可复用插件Plugin 包addUtilities/addComponents覆盖第三方样式important或!前缀!text-red-500核心原则Arbitrary Values 用于一次性— 出现 2 次以上就应提取到配置extend优先于覆盖— 保留 Tailwind 默认值CSS 变量实现动态主题— 配合theme.extend双向联动layer控制优先级— base components utilitiesPlugin 用于跨项目复用— 单项目用layer即可

相关文章:

Tailwind CSS 自定义样式

Tailwind CSS 自定义样式学习笔记 一、自定义样式的层次结构 ┌──────────────────────────────────────────────────────┐ │ tailwind.config.js → 设计系统 Token(颜色/间距/字号) │ │…...

基于Mastra框架构建生产级AI应用:从Agent与Workflow设计到实战部署

1. 从零到一:为什么选择 Mastra 来构建你的 AI 应用?如果你正在用 TypeScript 栈开发 AI 应用,并且已经尝试过直接调用 OpenAI 的 API 或者用 LangChain 搭过一些原型,那你大概率会遇到几个绕不开的痛点:模型切换成本高…...

M2FP人体解析零基础教程:5分钟搭建WebUI服务,一键识别身体部位

M2FP人体解析零基础教程:5分钟搭建WebUI服务,一键识别身体部位 1. 什么是M2FP人体解析? M2FP(Mask2Former-Parsing)是一种先进的计算机视觉模型,专门用于识别图片中人物的各个身体部位。想象一下&#xf…...

Phi-3.5-mini-instruct部署避坑指南:vLLM加载失败排查、Chainlit连接超时解决方案

Phi-3.5-mini-instruct部署避坑指南:vLLM加载失败排查、Chainlit连接超时解决方案 1. 模型简介 Phi-3.5-mini-instruct是Phi-3模型家族中的轻量级成员,作为一款先进的开放模型,它具备以下核心特点: 128K超长上下文:…...

开源无代码数据库Baserow:自托管部署与CRM应用实战

1. 项目概述:为什么我们需要一个开源的“Airtable”? 如果你曾经为团队寻找过一款既能像电子表格一样直观操作,又能像数据库一样结构化存储数据的工具,那么Airtable这个名字大概率会出现在你的搜索结果里。它确实很棒,…...

Weka机器学习工具入门与实战指南

1. Weka机器学习工具入门指南Weka作为一款开源的机器学习工具集,自1997年由怀卡托大学开发以来,已成为学术界和工业界广泛使用的数据挖掘平台。它集成了数据预处理、分类、回归、聚类、关联规则挖掘和可视化等完整功能链,特别适合没有编程基础…...

Vivado仿真器底层工具链揭秘:xvlog、xelab、xsim到底在干什么?

Vivado仿真器底层工具链揭秘:xvlog、xelab、xsim到底在干什么? 当你在Vivado中点击"Run Simulation"按钮时,背后实际上启动了一个精密的工具链流水线。这个看似简单的操作背后,隐藏着三个关键角色:xvlog、xe…...

【深入解析LoRA】从低秩自适应到高效微调:原理、实践与调优指南

1. 为什么LoRA能成为大模型微调的首选方案 第一次接触LoRA是在去年部署一个客服对话系统时遇到的。当时客户扔过来一个175B参数的GPT-3模型,要求我们在两周内完成业务场景适配。看着服务器上那几块可怜的A100显卡,团队里所有人都觉得这是个不可能完成的任…...

从零开始打造AI画图大师:条件扩散模型完整实现与无分类器指引详解

你有没有想过,AI是如何听懂你的指令,画出你想要的东西的?当你对Midjourney输入“一只穿着宇航服的柴犬”,它真的能生成那张图——这背后究竟发生了什么?今天,我将带你亲手实现一个基础的文本控制AI绘图系统…...

机器学习数据预处理:数据标准化(Z-Score)

机器学习数据预处理:数据标准化(Z-Score)超通俗全解 数据标准化是**把所有特征统一变成“均值为0,标准差为1”**的最经典预处理方法,彻底解决量纲不一致、数值差距大的问题,所有对尺度敏感的模型都必须做。…...

【限时技术解禁】:VSCode 2026 Dev Tunnels直连容器的私有化部署方案(绕过GitHub Auth,企业级离线可用)

更多请点击: https://intelliparadigm.com 第一章:VSCode 2026 Dev Tunnels直连容器的技术演进与企业适配价值 VSCode 2026 引入的 Dev Tunnels 原生直连容器能力,标志着远程开发范式从 SSH 代理与端口转发迈向零配置、身份感知、双向加密隧…...

本地GPU预训练Llama模型全流程与优化策略

1. 本地GPU预训练Llama模型全流程解析在自然语言处理领域,Transformer架构已成为大语言模型的事实标准。作为其中的佼佼者,Llama系列模型因其出色的性能和开源特性备受关注。本文将手把手教你如何在本地GPU上完成Llama模型的预训练全流程。1.1 为什么选择…...

深度学习模型集成方法:Bagging实战与优化

1. 深度学习模型集成方法概述在机器学习领域,集成学习(Ensemble Learning)是一种通过组合多个模型的预测结果来提升整体性能的技术。这种方法的核心思想是"三个臭皮匠顶个诸葛亮"——多个模型的集体智慧往往比单个模型表现更好。特别是在深度学习领域&…...

GeniA:大语言模型驱动的生物信息学智能体框架实战指南

1. 项目概述:当AI遇上基因,GeniA如何重塑生物信息学工作流如果你是一名生物信息学研究员、计算生物学家,或者任何需要与高通量测序数据打交道的从业者,那么你一定对“数据洪流”这个词深有体会。从二代测序到三代测序,…...

Transformer位置编码原理与实战技巧详解

1. 位置编码的本质与必要性在传统RNN结构中,序列数据是逐个元素处理的,这种顺序处理方式天然包含了位置信息。但Transformer模型采用并行处理的注意力机制,需要显式地注入位置信息才能理解序列中元素的相对或绝对位置。这就是位置编码&#x…...

神经网络反向传播算法实现与优化指南

1. 神经网络与反向传播算法基础神经网络是机器学习中最强大的工具之一,而反向传播算法则是训练神经网络的核心技术。让我们从一个开发者的角度来理解这个看似复杂的概念。想象你正在教一个孩子识别动物。最初孩子会犯很多错误,但每次错误后你会指出哪里错…...

流体天线阵列与空中计算技术的联合优化实践

1. 流体天线阵列与空中计算技术解析在物联网设备数量爆炸式增长的今天,传统"先通信后计算"的模式正面临严峻挑战。想象一下,当数千个传感器同时向云端发送数据时,不仅会挤占宝贵的无线频谱资源,还会产生难以忍受的通信延…...

3步解密网页视频下载:VideoDownloadHelper智能解析实战指南

3步解密网页视频下载:VideoDownloadHelper智能解析实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾遇到过这样的…...

NovelClaw:基于动态记忆与可观测架构的AI长篇叙事工作台

1. 项目概述:从“一次性生成”到“可检视的写作工作台”如果你尝试过用大语言模型(LLM)来创作长篇小说,大概率会遇到这样的困境:你给了一个精彩的开头设定,模型也洋洋洒洒生成了几千字。但当你想要继续写第…...

量子计算基础:Hadamard门与CNOT门的原理与应用

1. 量子门基础与物理意义在量子计算中,Hadamard门和CNOT门如同经典计算机中的与、或、非门一样,构成了量子电路的基础构建模块。但与经典比特不同,量子比特(qubit)可以同时处于|0⟩和|1⟩的叠加态,这种特性…...

MPS:用Go语言打造轻量级媒体服务器,让旧安卓设备变身家庭流媒体中心

1. 项目概述:一个为移动设备量身定制的媒体播放服务器如果你和我一样,手头有几台旧手机、平板电脑,或者干脆就是一台性能不那么强劲的安卓电视盒子,想把它们变成家庭媒体中心,那你大概率遇到过和我一样的困境。主流的媒…...

Qwen3-14B开源大模型实战:构建垂直领域微调数据集生成Pipeline

Qwen3-14B开源大模型实战:构建垂直领域微调数据集生成Pipeline 1. 开篇:为什么需要垂直领域数据集 在人工智能领域,通用大模型虽然表现优异,但在特定垂直场景下往往存在"知识盲区"。就像一位博学的教授,虽…...

AI智能体服务化实战:从单体Agent到生产级工具箱架构解析

1. 项目概述:一个为AI智能体服务的工具箱最近在折腾AI智能体(Agent)相关的项目,发现一个挺有意思的现象:很多开发者,包括我自己在内,在初期都会陷入一个“重复造轮子”的困境。每次启动一个新Ag…...

别再重装VSCode了!2026内存优化终极 checklist:12项配置项+8个进程级kill命令+1个自研memory-guard插件

更多请点击: https://intelliparadigm.com 第一章:VSCode 2026内存优化的底层动因与诊断范式 VSCode 2026 版本将内存管理从“被动回收”转向“预测性约束”,其核心动因源于 Electron 28 对 V8 堆快照的细粒度控制能力,以及语言服…...

【VSCode 2026权限控制黄金标准】:为什么头部科技公司已禁用“共享工作区默认读写”?4类角色权限矩阵表免费领取

更多请点击: https://intelliparadigm.com 第一章:VSCode 2026实时协作权限控制全景概览 VSCode 2026 引入了基于角色的细粒度实时协作权限模型(RBAC-RTC),在多人协同编辑同一工作区时,支持文件级、行级乃…...

机器人锂电池完整方案(选型 + 设计 + 厂家推荐)【浩博电池】

机器人锂电池完整方案(选型 设计 厂家推荐)机器人锂电池是机器人系统的核心动力单元,直接影响设备的续航能力、运动性能、安全性与稳定性。不同类型机器人(AGV、巡检机器人、四足机器人、服务机器人、消防机器人等)对…...

GPU显存碎片化暴雷预警!:CUDA 13 Unified Memory + CUDA Graph组合使用导致OOM的4种隐蔽路径与内存池动态调优脚本

更多请点击: https://intelliparadigm.com 第一章:GPU显存碎片化暴雷预警!:CUDA 13 Unified Memory CUDA Graph组合使用导致OOM的4种隐蔽路径与内存池动态调优脚本 CUDA 13 引入的 Unified Memory(UM)自动…...

nanobot效果惊艳:Qwen3-4B-Instruct准确识别并执行Linux系统命令真实截图

nanobot效果惊艳:Qwen3-4B-Instruct准确识别并执行Linux系统命令真实截图 1. nanobot:超轻量级个人AI助手 nanobot是一款受OpenClaw启发的超轻量级个人人工智能助手,仅需约4000行代码就能提供核心代理功能。相比其他类似工具动辄数十万行的…...

Kaggle竞赛入门:4步提升机器学习实战能力

1. 从零开始玩转Kaggle竞赛的实战指南作为一名在数据科学领域摸爬滚打多年的从业者,我清楚地记得第一次接触Kaggle时那种既兴奋又迷茫的感觉。Kaggle作为全球最大的数据科学竞赛平台,汇聚了来自世界各地的机器学习高手,在这里你可以找到最前沿…...

构建Llama风格解码器Transformer:从原理到实践

1. 从零构建类Llama-2/3的解码器专用Transformer模型 在自然语言处理领域,Transformer架构已成为现代大语言模型的基础。与传统Seq2Seq Transformer不同,像Llama-2/3这样的模型采用了更高效的解码器专用架构。这种设计不仅简化了模型结构,还特…...