光速入门 Tailwind CSS

news2025/1/18 20:05:00

在这里插入图片描述

文章目录

  • 入门
    • 安装
    • IDE 设置
    • 使用预编译器
    • 生产环境优化
  • 基础概念
    • 分层
    • 指令
      • @tailwind
      • @layer
      • @apply
      • @config
    • 函数
      • theme()
      • screen()
  • 基础案例
    • 怎么设置属性任意值?
    • hover 父元素时,怎么选中子元素添加样式?
    • 添加 animation 动画
  • 配置主题

Tailwind CSS 中文网
Tailwind Play

入门

安装

三种使用方式:

  1. cli
  2. 结合 postcss
  3. cdn

cli 方式就和命令行使用 scss、tsc 这些工具一样,需要手动执行监听文件改变的命令,实时编译。这种方式只适合做 demo 时的简单使用。

想要正儿八经的使用,比如和构建工具结合,就要搭配 postcss 一起使用。

pnpm install -D tailwindcss postcss autoprefixer

pnpm tailwindcss init --postcss

tailwindcss 初始化后会生成 postcss 和 tailwindcss 的配置文件。
然后在 tailwindcss.config.js 的 content 选项中配置需要编译的模版文件路径。

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

将指令添加到主 css 文件:

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

此时会出现 css 无法识别 tailwind 指令的问题。

解决办法:
解决 vscode Unknown at rule @xxx 的警告

IDE 设置

vscode 安装 tailwind 插件可以获得提示和高亮。并且官方提供了一个 Prettier 插件,它会自动按照官方推荐的类顺序对你写的类进行排序。

pnpm add -D prettier prettier-plugin-tailwindcss
{
    "plugins": [
        "prettier-plugin-tailwindcss"
    ]
}

注意:项目中声明了 prettier 的配置文件的,那 vscode settings.json 中的 prettier 配置就会被覆盖。
所以项目中的配置文件除了声明使用 prettier-plugin-tailwindcss 插件外,还要补充其他额外的配置。除非你起初使用的 prettier 配置就是 prettier 默认的配置。

另外配置文件可能出现 json schema 验证失败的问题。
解决"无法从“https://json.schemastore.org/xxx”加载架构"的问题

使用预编译器

由于 Tailwind 是一个 PostCSS 插件,没有什么能阻止你将它与 Sass、Less、Stylus 或其他预处理器一起使用。

虽然可以,但非常不建议和预编译器一起使用。

当需要使用某些预编译器的功能时,你应该高度考虑依赖其他 PostCSS 插件来添加你使用的预处理器功能,而不是使用单独的 预处理器。

  • postcss 插件列表:postcss/docs/plugins.md at main · postcss/postcss

预编译器最常见的几个功能:

  1. css 拆分成多个文件导入
  2. 选择器嵌套
  3. 变量
  4. 浏览器前缀

这 4 个功能对应的 postcss 解决方案:

  1. postcss 插件:postcss-import
    1. 安装使用。
  2. 官方基于 postcss-nested(默认) 或 postcss-nesting 封装的插件:tailwindcss/nesting
    1. 已经内置,可直接使用,并且可配置应用哪个postcss-nesting 插件。不过需要安装使用。
    2. 如果使用了 postcss 预设: postcss-preset-env。则要手动关掉预设中的嵌套功能,让官方的嵌套插件生效。
  3. 直接使用 css 变量
  4. postcss 插件:autoprefixer
    1. 安装使用,并且添加在插件末尾使用。其实 init 时,已经添加在末尾。

postcss-import 它严格遵守 CSS 规范, @import 语句必须在第一行使用。

这个问题容易在两个地方忽视:一是和常规 CSS 写在一起时,二是和 tailwind 主 css 文件写在一起时。
无论是 .box {} 这样的常规 CSS 还是 @tailwind 指令,@import 都必须写在第一行。

为了解决这个容易忽视的问题,最好的办法就是拆成单独文件写。

/* components.css */
@import "./components/buttons.css";
@import "./components/card.css";
/* components/buttons.css */
.btn {
  padding: theme('spacing.4') theme('spacing.2');
  /* ... */
}

使用 postcss-nesting 作为嵌套实现,并关闭 postcss 预设插件中的嵌套功能:

// postcss.config.js
module.exports = {
  plugins: {
    'postcss-import': {},
    'tailwindcss/nesting': 'postcss-nesting',
    tailwindcss: {},
    'postcss-preset-env': {
      features: { 'nesting-rules': false },
    },
  }
}

总结 postcss 配置:

pnpm add -D postcss-import

pnpm add -D autoprefixer
export default {
    plugins: {
        "postcss-import": {},
        "tailwindcss/nesting": {},
        tailwindcss: {},
        autoprefixer: {}
    }
};

硬要和预编译器一起使用,具体参考文档。

生产环境优化

对于尽可能小的生产构建,我们建议使用 cssnano 等工具缩小 CSS,并使用 Brotli 压缩 CSS。

如果你使用的是 Tailwind CLI,则可以通过添加 --minify 标志来缩小 CSS:

npx tailwindcss -o build.css --minify

如果你已将 Tailwind 安装为 PostCSS 插件,请将 cssnano 添加到插件列表的末尾:

module.exports = {
  plugins: {
    tailwindcss: {},
    autoprefixer: {},
    ...(process.env.NODE_ENV === 'production' ? { cssnano: {} } : {})
  }
}

如果你使用的是框架,请查看文档,因为这通常会在生产中自动为你处理,你甚至不需要对其进行配置。

基础概念

分层

首先我们要明白,tailwind 能通过类的方式来写样式,是因为它已经提供了这些写好了 css 的类。并且 tailwind 把这些类分成了三层。

Tailwind 将其生成的样式组织成三个不同的 “layers” — 这是 ITCSS 推广的概念。

  • base 层用于重置规则或应用于纯 HTML 元素的默认样式。
  • components 层用于你希望能够使用工具覆盖的基于类的样式。
  • utilities 层用于小型、单一用途的类,这些类应始终优先于任何其他样式。

ITCSS(Inverted Triangle CSS)是一种CSS架构方法,它通过将CSS代码组织成一系列层次来提高CSS的可维护性和可扩展性。这些层次从宽泛的、全局的设置到非常具体、局部的样式,形成一个倒三角形的结构。

每一层都有其明确的职责,如下:

  1. Settings:包含设计中的变量,如颜色、字体和断点。
  2. Tools:包含辅助函数、混合宏和实用工具类。
  3. Generic:包含重置、标准化样式和排版规则。
  4. Base:包含元素的样式,如按钮、表单和网格系统。
  5. Objects:包含设计中的布局模式,如媒体对象和列表。
  6. Components:包含更复杂的功能模块,如按钮组、轮播和导航。
  7. Utilities:包含最具体的设计调整,如间距、文本样式和可见性。

ITCSS的目标是通过限制CSS的特异性、减少依赖性、避免重叠和冲突,以及提供清晰的代码组织结构,来创建一个易于管理和扩展的CSS代码库。这种方法特别适合大型项目和团队协作,因为它有助于确保一致性和减少不必要的复杂性。

指令

tailwind 总共就提供了 4 个指令。

@tailwind

@tailwind 指令就像是导入语句 import,将 Tailwind 提供的 base、components、utilities 和 variants 样式插入到你的 CSS 中。

@layer

自定义样式的时候,我们可能会添加一些自定义类。@layer 指令就是用来告诉 tailwind 这些自定义的类应该属于三层中的哪一层,tailwind 你要按这一层的规矩管理它。

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

@layer base {
  h1 {
    @apply text-2xl;
  }
  h2 {
    @apply text-xl;
  }
}

@layer components {
  .btn-blue {
    @apply bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded;
  }
}

@layer utilities {
  .filter-none {
    filter: none;
  }
  .filter-grayscale {
    filter: grayscale(100%);
  }
}

@apply

@apply 指令如上所示,就是可以在自定义的 css 中使用 tailwind 提供的类。而且它不仅仅局限于 tailwind 提供的类,自定义的类也可以提取其中的样式进行复用。

  • 不过要注意:从类中提取的样式会删掉 !important。
@layer base {
  h1 {
    @apply text-2xl;
  }
}
.foo {
  color: blue !important;
}

.bar {
  @apply foo;
}

还有一点,就是 @apply 指令在 Vue 组件中无法提取应用其他 css 文件中自定义的类。比如在主 css 文件 main.css 中自定义了一个 card 类,在组件中无法 @apply 应用 card 类。

这是因为每个 Vue 组件中

解决办法是在 tailwind 插件中添加自定义的 css 类,这样就能全局共享了。

const plugin = require('tailwindcss/plugin')

module.exports = {
  // ...
  plugins: [
    plugin(function ({ addComponents, theme }) {
      addComponents({
        '.card': {
          backgroundColor: theme('colors.white'),
          borderRadius: theme('borderRadius.lg'),
          padding: theme('spacing.6'),
          boxShadow: theme('boxShadow.xl'),
        }
      })
    })
  ]
}

但老实说,最好的解决办法就是根本不做这种奇怪的事情。因为你完全可以在 html 模版上写类,压根不需要

@config

@config 指令指定 Tailwind 在编译该 CSS 文件时应使用哪个配置文件。这对于需要为不同的 CSS 入口点使用不同的配置文件的项目很有用。

你提供给 @config 指令的路径是相对于该 CSS 文件的,并且将优先于 PostCSS 配置或 Tailwind CLI 中定义的路径。

@config "./tailwind.admin.config.js";

@tailwind base;
@tailwind components;
@tailwind utilities;
@config "./tailwind.site.config.js";

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

函数

Tailwind 添加了一些自定义函数,用来在自定义样式时,在 css 中获取 tailwind 提供的样式中的一些值。比如使用 tailwind 提供的间距,颜色等。

theme()

theme() 读取 tailwind 类中的样式。使用.表示法读取值。

  • 如果类中就带了点,避免歧义使用[]获取
.content-area {
  height: calc(100vh - theme(spacing.12));
}

.content-area {
  height: calc(100vh - theme(spacing[2.5]));
}
  • 访问嵌套颜色值时不要使用破折号语法,要把破折号换成点
/* 错误 */
.btn-blue {
  background-color: theme(colors.blue-500);
}

/* 正确 */
.btn-blue {
  background-color: theme(colors.blue.500);
}
  • 要调整使用 theme 检索到的颜色的透明度,请使用斜杠后跟你要使用的透明度值:
.btn-blue {
  background-color: theme(colors.blue.500 / 75%);
}

screen()

screen() 复用 tailwind 提供的断点,直接在媒体查询中使用。当想要媒体查询时,不用自己去查看 tailwind 编译的断点结构,然后复制使用。

/* 自己手写 */
@media (min-width: 640px) {
  /* ... */
}

/* 直接用 tailwind 的断点修饰符 */
@media screen(sm) {
  /* ... */
}

基础案例

tailwind 默认提供了样式重置。

怎么设置属性任意值?

所有的任意值,也可以说自定义的属性值,都是用[]包裹标记。
比如想要设置背景颜色为 #123456,bg-[#123456]。并且能自动区分,如text-[2em]是文字大小,text-[#123456]是文字颜色。

若是 tailwind 没有提供的属性,则全用[]包裹。如文字阴影:[text-shadow:0_3rem_#fff]

[]中,多个属性值之间的空格用_代替。[]中其实就相当于直接写 css 属性值,所以也支持 css 的函数。如 var、calc。
text-[var(--color)]
hover:shadow-[0_0_25px_var(--color),0_0_100px_var(--color)]

hover 父元素时,怎么选中子元素添加样式?

group 标记父元素,然后 group:hover: 给子元素设置样式。如group:hover:text-red
其他的,如兄弟选择器等,看文档。

添加 animation 动画

tailwind 默认提供了 4 个动画,分别是:

  1. spin 旋转
  2. ping 放大并透明,爆开的效果
  3. pulse 脉动,呼吸灯一样的效果
  4. bounce 弹跳
<div class="animation-pulse">ikun</div>

显然这些动画是不够的,要自定义 animation 动画,则要去配置文件中配置 keyframes。并且可以在 animation 选项中像使用 css 一样声明使用 keyframes 动画。这样就可以以 animation-xxx 原子类的方式在 html 中使用动画了。

  • 注意所有的配置都是 js 对象写法。
module.exports = {
  theme: {
    extend: {
      keyframes: {
        wiggle: {
          '0%, 100%': { transform: 'rotate(-3deg)' },
          '50%': { transform: 'rotate(3deg)' },
        }
      },
      animation: {
        wiggle: 'wiggle 1s ease-in-out infinite',
      }
    }
  }
}
<div class="animation-wiggle">ikun</div>

如果不想在 animation 选项中配置出对应的动画工具类,也可以通过animation-[]在 html 中像 css 那样使用:

<span 
  style="--i: 123" 
  class="
  inline-block 
  animate-[floatDown_0.3s_calc(var(--i)*50ms)_ease] 
  group-hover:animate-[floatUp_0.3s_ease_calc(var(--i)*50ms)_forwards]"
  >
  ikun
</span>

注意:inline 元素如 span 无法应用动画,要改成 block 或者 inline-block。

配置主题

tailwind 允许在配置文件中配置主题。其实主要是两块内容:

  1. 修改或覆盖 tailwind 提供的主题。比如修改 tailwind 默认提供的断点分界线
  2. 扩展工具类,extend。

如果你想保留主题选项的默认值,但还想添加新值,请在配置文件中的 theme.extend 键下添加扩展。该键下的值将与现有的 theme 值合并,并自动成为可供你使用的新类。

例如,这里我们扩展 fontFamily 属性以添加 font-display 类,该类可以更改元素上使用的字体:

/** @type {import('tailwindcss').Config} */
module.exports = {
  theme: {
    extend: {
      fontFamily: {
        display: 'Oswald, ui-serif', // Adds a new `font-display` class
      }
    }
  }
}

将其添加到主题后,你可以像任何其他字体系列工具一样使用它:

<h1 class="font-display">
  This uses the Oswald font
</h1>

扩展屏幕断点:

/** @type {import('tailwindcss').Config} */
module.exports = {
  theme: {
    extend: {
      screens: {
        '3xl': '1600px', // Adds a new `3xl:` screen variant
      }
    }
  }
}
<blockquote class="text-base md:text-md 3xl:text-lg">
  Oh I gotta get on that internet, I'm late on everything!
</blockquote>

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

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

相关文章

Unity 数据持久化【PlayerPrefs】

1、数据持久化 文章目录 1、数据持久化PlayerPrefs基本方法1、PlayerPrefs概念2、存储相关3、读取相关4、删除数据思考 信息的存储和读取 PlayerPrefs存储位置1、PlayerPrefs存储的数据在哪个位置2、PlayerPrefs 数据唯一性思考 排行榜功能 2、Playerprefs实践1、必备知识点-反…

【SQLmap】常用命令

文章目录 实际使用案例常用命令基本命令数据库指纹识别用户信息用户权限数据库枚举数据导出密码哈希操作系统命令执行文件操作代理和网络参数指定保存恢复自动搜索注入智能模式等级设置自动注入WAF 绕过杂项帮助和支持 SQLmap 是一款开源的自动化 SQL 注入检测和利用工具&#…

一文读懂Feed流

前言&#xff1a;当前最流行的Feed流产品有微博、微信朋友圈、头条的资讯推荐、快手抖音的视频推荐等&#xff0c;还有一些变种&#xff0c;比如私信、通知等&#xff0c;这些系统都是Feed流系统。Feed流是Feed 流&#xff0c;Feed的本意是饲料&#xff0c;Feed流的本意就是有…

【python】python基于tkinter的学生成绩管理系统(源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

AI绘画-Stable Diffusion 原理介绍及使用

引言 好像很多朋友对AI绘图有兴趣&#xff0c;AI绘画背后&#xff0c;依旧是大模型的训练。但绘图类AI对计算机显卡有较高要求。建议先了解基本原理及如何使用&#xff0c;在看看如何实现自己垂直行业的绘图AI逻辑。或者作为使用者&#xff0c;调用已有的server接口。 首先需…

20240701 每日AI必读资讯

&#x1f3eb;AI真炼丹&#xff1a;整整14天&#xff0c;无需人类参与 - 英矽智能推出全球首个AI参与决策的生物学实验室&#xff0c;实现了14天内完成靶点发现和验证的全自动化闭环实验。 - 该实验室由PandaOmics平台驱动&#xff0c;集成多种预测模型和海量数据&#xff0…

springboot基础入门2(profile应用)

Profile应用 一、何为Profile二、profile配置方式1.多profile文件方式2.yml多文档方式 三、加载顺序1. file:./config/: 当前项目下的/config目录下2. file:./ &#xff1a;当前项目的根目录3. classpath:/config/:classpath的/config目录4. classpath:/ : classpath的根目录 四…

ffmpeg使用bmp编码器把bgr24编码为bmp图像

version #define LIBAVCODEC_VERSION_MAJOR 60 #define LIBAVCODEC_VERSION_MINOR 15 #define LIBAVCODEC_VERSION_MICRO 100 note 不使用AVOutputFormat code void CFfmpegOps::EncodeBGR24ToBMP(const char* infile, const char* width_str, const char* height_str…

Python数据分析-风湿关节炎生存分析

一、研究背景和意义 类风湿关节炎&#xff08;RA&#xff09;是一种慢性炎症性疾病&#xff0c;主要影响关节&#xff0c;但也可能影响身体的其他部分。RA的病因尚不完全清楚&#xff0c;但已知其涉及免疫系统的异常反应。患者的免疫系统错误地攻击自身的关节组织&#xff0c;…

机器学习中的数学底蕴与设计模式

在说机器学习设计模式之前&#xff0c;想多说几句&#xff0c;在进入软件行业最初的10年&#xff0c;那时候耳熟能详的基本就是多线程编程&#xff0c;互斥同步锁&#xff0c;设计模式&#xff0c;OOA&#xff0c;OOP&#xff0c;常规数组&#xff0c;tree&#xff0c;图的数据…

【图论】200. 岛屿问题

200. 岛屿问题 难度&#xff1a;中等 力扣地址&#xff1a;https://leetcode.cn/studyplan/top-100-liked/ 问题描述 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&…

你真的会udf提权???数据库权限到系统权限 内网学习 mysql的udf提权操作 ??msf你会用了吗???

我们在已经取得了数据库的账号密码过后&#xff0c;我们要进一步进行提取的操作&#xff0c;我们mysql有4钟提权的操作。 udf提权(最常用的)mof提权启动项提权反弹shell提权操作 怎么获取密码操作&#xff1a; 怎么获取密码&#xff0c;通过sql注入获取这个大家都应该知道了&a…

专题四:Spring源码初始化环境与BeanFactory

上文我们通过new ClassPathXmlApplicationContext("applicationContext.xml");这段代码看了下Spring是如何将Xml里面内容注入到Java对象中&#xff0c;并通过context.getBean("jmUser");方式获得了一个对象实例&#xff0c;而避开使用new 来耦合。今天我们…

Houdini速通VOP强化训练上部

Houdini 速通 VOP 强化训练上部是一门针对 Houdini 中 VOP&#xff08;Vector Operation Language&#xff09;的强化训练课程。本课程深入探讨了 Houdini 中 VOP 的核心概念和高级技术&#xff0c;通过实际案例和项目实战&#xff0c;帮助学员快速掌握 VOP 的使用技巧和编程方…

SpringBoot Task 定时任务

springboot中使用Task定时任务非常简单 springboot 中自带的都有注解不需要引入依赖 第一步&#xff1a;在启动类上添加启用定时任务注解 EnableScheduling //开启任务调度 第二步&#xff1a;创建一个springboot组件用于定时任务管理 package cn.lsy.api.Task;import cn.ls…

【Unity实战】在RHEL 9上安装UnityHub

一般来说&#xff0c;Unity编辑器的安装&#xff0c;官方已经给出了安装教程。 但是这个忽略了RHEL 9的一个特性&#xff1a;默认的加解密策略已经不支持SHA1了&#xff0c;你会在执行yum install unityhub那里出现如下报错&#xff1a; [shepherdlocalhost ~]$ sudo yum inst…

[C++][设计模式][备忘录模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件构建过程中&#xff0c;某些对象的状态转换过程中&#xff0c;可能由于某中需要&#xff0c;要求程序能够回溯到对象之前处于某个点的状态。 如果使用一些公开接口来让其他对象得到对象的状态&#xff0c;便会暴露对象…

66、基于长短期记忆 (LSTM) 网络对序列数据进行分类

1、基于长短期记忆 (LSTM) 网络对序列数据进行分类的原理及流程 基于长短期记忆&#xff08;LSTM&#xff09;网络对序列数据进行分类是一种常见的深度学习任务&#xff0c;适用于处理具有时间或序列关系的数据。下面是在Matlab中使用LSTM网络对序列数据进行分类的基本原理和流…

TomCat小型服务器安装

一、安装步骤 Tomcat官方站点&#xff1a; http://tomcat.apache.org 1、进入官方网站后获取安装包&#xff1a; &#x1f920;tar.gz文件是Linux操作系统下的安装版本 &#x1f920;zip文件是Windows系统下的压缩版本 2、解压安装 解压到自己的文件夹中 3、安装JDK 设置环…

Go源码--context包

简介 Context 是go语言比较重要的且也是比较复杂的一个结构体&#xff0c;Context主要有两种功能: 取消信号&#xff1a;包括直接取消&#xff08;涉及的结构体&#xff1a;cancelCtx ; 涉及函数&#xff1a;WithCancel&#xff09;和携带截止日期的取消&#xff08;涉及结构…