tailwindcss

news2024/9/23 13:26:10

什么是Tailwind CSS

Tailwind CSS 是一个可定制化的 CSS 框架,最大的特点是功能类优先,和我们知道的bootstrap,element ui,antd,veui等框架一样。将一些CSS样式封装好,用来加速我们开发的一个工具。

简单理解 TailwindCSS 就是 CSS 的 lodash, 他是一个增强工具类,你可以用原子类的方式写样式,也可以基于 PostCSS 作为工具函数做 Mixin。

核心概念

功能类优先

传统情况下,开发以下功能会先写html结构,然后编写对应的CSS样式

<div class="chat-notification">
  <div class="chat-notification-logo-wrapper">
    <img class="chat-notification-logo" src="/img/logo.svg" alt="ChitChat Logo">
  </div>
  <div class="chat-notification-content">
    <h4 class="chat-notification-title">ChitChat</h4>
    <p class="chat-notification-message">You have a new message!</p>
  </div>
</div>

<style>
  .chat-notification {
    display: flex;
    max-width: 24rem;
    margin: 0 auto;
    padding: 1.5rem;
    border-radius: 0.5rem;
    background-color: #fff;
    box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
  }
  .chat-notification-logo-wrapper {
    flex-shrink: 0;
  }
  .chat-notification-logo {
    height: 3rem;
    width: 3rem;
  }
  .chat-notification-content {
    margin-left: 1.5rem;
    padding-top: 0.25rem;
  }
  .chat-notification-title {
    color: #1a202c;
    font-size: 1.25rem;
    line-height: 1.25;
  }
  .chat-notification-message {
    color: #718096;
    font-size: 1rem;
    line-height: 1.5;
  }
</style>

使用 Tailwind,您可以通过直接在 HTML 中应用预先存在的类来设置元素的样式。

css 代码解读复制代码<div class="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-md flex items-center space-x-4">
  <div class="flex-shrink-0">
    <img class="h-12 w-12" src="/img/logo.svg" alt="ChitChat Logo">
  </div>
  <div>
    <div class="text-xl font-medium text-black">ChitChat</div>
    <p class="text-gray-500">You have a new message!</p>
  </div>
</div>

这种方法使我们无需编写自定义的 CSS 即可实现一个完全定制的组件设计,代码变的精简了很多

功能类的好处:

  • 不需要为了起类命名而浪费精力 不需要为了设置一些样式额外调价一些wrapper这样的类名,不必为了某个功能的抽象命名发愁。
  • CSS停止增长 使用传统的方法,每次添加新功能CSS文件都会变大。使用功能类,所有内容都是可重用的,因此几乎不需要编写新的CSS
  • 更改会更安全 CSS是全局性的,永远不知道在修改的时候会破坏掉什么。HTML中的类是本地的可以随意更改不用担心其他问题

响应式设计

利用断点语法实现 @media 功能,现在加个前缀就可以搞定了。 断点系统很灵活。也是目前所有CSS框架里做的最好的。比如你要实现一个媒体查询,根据不同的屏幕宽度实现图片宽度的变化

之前的写法:

css 代码解读复制代码@media only screen and (max-width:1280px) { 
    img {     
        width:196px; 
    } 
}
@media only screen and (max-width: 760px) { 
    img {     
        width:128px; 
    } 
}

但是用Tailwind CSS,一句话就能搞定:

ini

 代码解读
复制代码<img class="w-16 md:w-32 lg:w-48" src="..." />

伪类: 悬停、焦点和其它状态

支持伪类前缀标签,以及可以和响应式一起使用

ini 代码解读复制代码<button
  class="bg-orange-500 hover:bg-orange-600 sm:bg-green-500 sm:hover:bg-green-600"
>
  Hover
</button>

自定义样式

因为tailwind是最基础的框架,tailwindcss默认的utility,base,component 不足以满足所有的场景;

使用 @layer 指令,Tailwind 自动将这些样式移动到 @tailwind base, @tailwind utility,@tailwind component 的位置

less 代码解读复制代码@layer components {
  .btn-blue {
    @apply bg-blue-500 text-white font-bold py-2 px-4 rounded;
  }
  .btn-blue:hover {
    @apply bg-blue-700;
  }
}

Tailwind 语法糖

less 代码解读复制代码@tailwind base;
@tailwind components;
@tailwind utilities;

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

@layer components {
  .btn {
    @apply bg-gray-500 text-white font-bold;
    @apply py-2 px-4 rounded;
    font-family: Georgia, Cambria, "Times New Roman", Times, serif;
    background-color: theme("colors.blue-500");
  }
}

@layer utilities {
  @variants hover, focus {
    .filter-none {
      filter: none;
    }
  }
  @responsive {
    .bg-opacity-none {
      @apply opacity-0;
    }
  }
}

@screen sm {
  /* ... */
}

.btn-blue {
  background-color: theme('colors.blue.500');
}
  • @tailwind:使用 @Tailwind 指令将 Tailwind 的 base, components, utilities 插入到 CSS 中。
  • @apply:使用 @apply 将任何样式内联到您自己的自定义 CSS 中。
  • @layer:使用 @layer 指令告诉 Tailwind 属于一组自定义样式的 “块”。在 base, components, utilities 有效。
  • @variants:您可以通过在 @variants 指令中包装它们的定义来生成响应式、hover, focus, active 和其他伪类。
  • @responsive:通过将 class 的定义包装在 @responsive 指令中,您可以生成自己 class 的响应式。
  • @screen: 使用@screen指令并按名称引用断点,而不是在您自己的CSS中复制它们的值。
  • theme():使用 theme() 函数和 . 访问你的 Tailwind 配置值。

自定义配置

想要自定义配置,需要先了解tailwindcss 的默认配置

tailwind.config.js 中可以扩展自己的自定义配置项

css 代码解读复制代码// tailwind.config.js
module.exports = {
  theme: {
    screens: {
      sm: "640px",
      md: "768px",
      lg: "1024px",
      xl: "1280px",
    },
    fontFamily: {
      display: ["Gilroy", "sans-serif"],
      body: ["Graphik", "sans-serif"],
    },
    borderWidth: {
      default: "1px",
      "0": "0",
      "2": "2px",
      "4": "4px",
    },
    extend: {
      colors: {
        cyan: "#9cdbff",
      },
      spacing: {
        "96": "24rem",
        "128": "32rem",
      },
    },
  },
};

有一套专业的UI属性值

Tailwind CSS虽然没有封装任何UI,但是他默认提供的一些属性值都是很专业的。比如颜色(专业制作的开箱即用的默认调色板)

image-20240831162835134

还有各种内边距外边距,宽高,文字大小行高颜色等等。即使你不懂设计,按照他内置的属性做出来的东西,也不会太差。

和其他的CSS框架有什么区别?

CSS发展到现在,基本经历了三个阶段。

第一个阶段,原生写法

是类似于编程中面向过程的写法,需要什么样式,自己在CSS中写什么样式。对代码有洁癖的程序员会进行简单的CSS复用。但是也只是简单的复用,大多数时候还是需要什么写什么,想怎么写怎么写。

第二个阶段,CSS组件化

类似于编程中面向对象的写法,将相同视觉的UI封装成一个组件。比如一个按钮,整个项目中,这个按钮被多次使用,并且样式一致。那么就可以封装成一个按钮类。使用的时候直接使用这个类名称就OK。

这也是bootstrap,element ui,antd,veui的做法。

这种框架的优势在于,封装了大量常见的UI。比如你需要一个表单,需要一个导航,需要一个弹窗,Card卡片。有现成的class。直接拿过来用,就可以快速的完成效果。完全不需要动手写CSS。

这也是目前比较流行的方法。这几年几乎很少有项目是自己一点一点手写样式的了,多多少少都会使用到一些css框架。

对于一些需要快速交付的项目,非常适合使用这种组件化css框架

第三个阶段,CSS零件化

也叫做CSS原子化。和上面第一个阶段第二个阶段都有类似的地方。依旧是组件,只是每个组件都是一个单一功能的CSS属性。

上面第一个阶段的时候,我们讲了有些有对代码有追求的人,会开始复用CSS。

比如页面中大量的用到 float:left。那么就可以封装一个类,比如是这样

sql

 代码解读
复制代码.f-left {float:left}

然后需要使用 float:left的时候,直接使用 .f-left就可以。

但是我们自己写css的时候,仅仅是封装一些常用的简单的类,绝大多数的CSS,都需要动手去写css。比如你要写个宽度12像素。你就得老老实实的去写 width:12px,逃避不了,不过估计也没人想过逃避。

Tailwind CSS就是第三个阶段的产物,它做了什么呢?

它将所有的css属性全部封装成语义化的类,比如你想要一个float:left,它已经帮你封装好了,你直接使用一个float-left就可以。

Tailwind CSS和内联样式有什么区别?

Tailwind CSS是把所有样式写在class里面。内联样式是把所有样式写在style里面,所以会让很多人造成一个印象:Tailwind CSS和内联样式差不多,大同小异。

其实是有很大的区别,Tailwind CSS相比于内联样式,有以下几点特点:

有约束的设计

使用内联样式,每个值都是一个随便填写的数字。使用Tailwind CSS类,你要从预先定义好的设计系统中选择样式,这样你开发出来的页面,视觉上会保持一致,不会乱七八糟。

响应式设计

您不能在内联样式中使用媒体查询,但可以使用Tailwind的响应式类来轻松开发完全响应式界面。比如你可以在class里写一个sm:text-left,代表的是,在小屏幕上,文字居中的方式是居左显示。但是你在内联样式是不可能做到这些的。

修饰符

把修饰符,如各种伪类、暗黑模式、响应式设计至于前缀的设计用起来很顺手

ini

 代码解读
复制代码<div class="focus:ring-2 hover:bg-red-700 dark:bg-gray-800"></div>

Tailwind CSS的文件很大?

是的。因为它需要把所有的CSS属性全部都封装一遍,所以CSS文件巨大。所以不建议在页面内直接引入Tailwind 原生CSS文件的做法。

Tailwind 在构建生产文件时引入PurgeCSS,这个工具在构建的时候,对代码进行正则匹配,剔除没有使用过的原子类。这意味着最后打包出来的 CSS 文件是极小的,一般的项目构建出来的CSS文件, 再经过压缩甚至不会超过10K。

When removing unused styles with Tailwind, it’s very hard to end up with more than 10kb of compressed CSS.

Taillwind使用指南

通过npm安装

kotlin 代码解读复制代码// 项目支持postcss8可以下载最新版本
npm install -D tailwindcss@latest postcss@latest autoprefixer@latest
// postcss7 则可以下载兼容版本
npm install -D tailwindcss@npm:@tailwindcss/postcss7-compat @tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9

创建配置文件

接下来生成tailwind.config.jspostcss.config.js 文件:

csharp 代码解读复制代码// 生成基础配置文件
npx tailwind init -p
// 生成默认配置文件
npx tailwind init --full

CSS 中引入 Tailwind

less 代码解读复制代码/* ./src/index.css */

/*! @import */
@tailwind base;
@tailwind components;
@tailwind utilities;

由于 Chromium 中的 bug ,请确保包含 /*!@import */ 注释,以避免开发时在 Chrome DevTools 中出现的性能问题。此问题已在 Canary 中修复,但尚未发布

VSCode 补全插件

Tailwind CSS IntelliSense

image.png

其他

  • Tailwind CSS v2.0开始放弃对IE 11的支持,如果您需要支持 IE 11,我们建议继续使用 Tailwind CSS v1.9
  • Tailwind CSS v2.0 不再支持 Node.js 8或10。要建立您的 CSS,您需要确保您在本地和 CI 环境中运行 Node.js 12.13.0或更高版本。

参考资料

tailwindcss官网

如何评价CSS框架TailwindCSS

nd CSS v2.0开始放弃对IE 11的支持,如果您需要支持 IE 11,我们建议继续使用 Tailwind CSS v1.9

  • Tailwind CSS v2.0 不再支持 Node.js 8或10。要建立您的 CSS,您需要确保您在本地和 CI 环境中运行 Node.js 12.13.0或更高版本。

参考资料

tailwindcss官网

如何评价CSS框架TailwindCSS

深入浅出 tailwindcss

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

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

相关文章

精选算法编程题

一、有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10]输出&#xff1a;[0,1,9,16,100]解释&#xff1a;平方后&am…

JAVAEE初阶第二节——多线程基础(中)

系列文章目录 JAVAEE初阶第二节——多线程基础(中) 多线程基础(中) 多线程带来的的风险-线程安全 (重点)synchronized 关键字volatile 关键字wait 和 notify 文章目录 系列文章目录JAVAEE初阶第二节——多线程基础(中) 多线程基础(中)一.多线程带来的的风险-线程安全 (重点)1…

CSDN字体、颜色设置

目录标题 一、字体设置二、字体颜色设置 一、字体设置 设置文字字体的基本语法如下&#xff1a; <font face"字体名称">显示内容</font>在字体名称部分写入字体的名称&#xff0c;比如常见的&#xff1a;宋体、微软雅黑、黑体、华文行楷、方正姚体、楷…

C++奇迹之旅:深度解析list的模拟实现

文章目录 &#x1f4dd;前言&#x1f320;list节点&#x1f309;list &#x1f320;迭代器的创建&#x1f309;const迭代器 &#x1f320;代码&#x1f6a9;总结 &#x1f4dd;前言 &#x1f320;list节点 我们先建立一个列表里的节点类listnode&#xff0c;用来构造list的节…

【知识】对比Share mem/Pin mem/GPU mem之间的传输速度

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 参考代码 运行结果 参考代码 import torch import time import matplotlib.pyplot as plt# 初始化设备和张量 device torch.device(cuda) dat…

float 或 double 运算的时候会有精度丢失的风险?

《阿里巴巴 Java 开发手册》中提到&#xff1a;“浮点数之间的等值判断&#xff0c;基本数据类型不能用 来比较&#xff0c;包装数据类型不能用 equals 来判断”。“为了避免精度丢失&#xff0c;可以使用 BigDecimal 来进行浮点数的运算”。 浮点数的运算竟然还会有精度丢失…

当AI遇上制药:加速跑向未来的快车道,还是布满荆棘的征途?

01 在全球科技领域&#xff0c;AI的崛起无疑掀起了一场变革的风暴&#xff0c;其影响力已渗透至各行各业&#xff0c;促使各领域积极寻求与AI技术的深度融合&#xff0c;以提升效率、创新产品及优化服务。在医疗健康领域&#xff0c;AI与制药的结合自2007年起航&#xff0c;历…

Servlet 简介+ Cookie和session+过滤器Filter和监听器Listener

目录 1.Servlet 介绍 1.1 什么是Servlet 1.2 Servlet的使用方法 1.3 Servlet接口的继承结构 2.Servlet的生命周期 2.1 servlet生命周期中重要的方法 3.获得前端提交数据 4.中文乱码的解决方案 5.重定向和转发 5.1 重定向 5.2 转发 6. Request对象 7. Response对象…

(南京观海微电子)——半导体制程介绍

半导体的制程&#xff1a; 1. IC 设计&#xff1a; 预先规划芯片的功能&#xff0c;功能包含算术逻辑、记忆功能、 浮点运算、 数据传输&#xff0c;各功能分布在芯片上各区域&#xff0c;并制作所需的电子元件&#xff0c;工程师使用&#xff08;HDL&#xff09;设计电路图&…

opencv之几何变换

文章目录 1 前言2 线性几何变换的主要类型2.1 平移 (Translation)&#xff1a;2.1.1 定义2.1.2代码 2.2 缩放 (Scaling)&#xff1a;2.2.1 定义2.2.2 代码 2.3 旋转 (Rotation)&#xff1a;2.3.1 定义2.3.2 代码 2.4 仿射变换 (Affine Transformation)&#xff1a;2.4.1 定义2.…

Git:版本控制的强大工具与全面解析

Git&#xff0c;作为现代软件开发中不可或缺的版本控制工具&#xff0c;凭借其高效、灵活和分布式的特性&#xff0c;赢得了全球开发者的青睐。无论是个人项目还是大型企业级应用&#xff0c;Git 都能够提供强大的版本管理、分支策略、远程协作等功能。本文将从Git的创建与初始…

【电子数据取证】Android APK静态分析与动态分析

文章关键词&#xff1a;电子数据取证、手机取证、安卓取证、云取证、APK分析 当前手机用户量增长越来越快&#xff0c;尤其是中国&#xff0c;手机用户量已超10亿&#xff0c;即大约75%的中国人拥有自己的手机。正因为手机越来越智能化&#xff0c;携带也方便&#xff0c;因此…

算法day08 链表

4.链表_哔哩哔哩_bilibili 一、判断链表为回文 暴力方式&#xff1a; 从链表头开始将链表每一个元素值依次放入数组中&#xff0c;按下标比较值。 从链表尾开始将链表一半元素值放入stack栈中&#xff1b;每次弹栈比较 弹出的值和 链表值。 快慢指针&#xff1a; 假设有这样一个…

python-Flask搭建简易登录界面

使用Flask框架搭建一个简易的登录界面&#xff0c;登录成功获取token数据 1 搭建简易登录界面 代码如下 from flask import Flask, jsonify from flask import request import time, hashlibapp Flask(__name__)login_html <html> <head> <title>Log…

ROS - Turtle Nest 使用说明

系列文章目录 前言 正如乌龟巢是小乌龟的出生地一样&#xff0c;ROS 2 Turtle Nest 也是新 ROS 软件包诞生和发展的地方。 Turtle Nest 为创建新的 ROS 软件包提供了一个简单的图形用户界面&#xff0c;简化了软件包的创建过程。 一、为什么使用 Turtle Nest 而不是 “ros2 pkg…

STM32CubeMX生成freertos默认设置卡死,卡在HAL_Init不动,裸机运行程序正常跑,解决方法

1、简介 最近通过STM32CubeMX生成freertos发现任务不执行&#xff0c;卡在HAL_Init不动&#xff0c;网上找很久不好使&#xff0c;刚开始怀疑硬件问题&#xff0c;但是裸机运行程序正常跑&#xff0c;然后怀疑软件有问题&#xff0c;但是对F1,F3系列都好使&#xff0c;仅仅对F…

Git版本控制策略:Rebase还是Merge?详解优缺点与适用场景

在团队合作中&#xff0c;如何高效地管理代码版本和保持主干代码的稳定性&#xff0c;常常是开发团队关注的焦点。在使用Git管理代码的常规操作中&#xff0c;Merge是最常见的操作&#xff0c;此外Rebase也是一种很实用的操作&#xff0c;尤其是我们想要保持更干净的提交历史时…

habor仓库

1.安装docker 现在打开不了docker官网&#xff0c;本人是在清华下载站下载的 Index of /docker-ce/linux/rhel/9/x86_64/stable/Packages/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 解压docker 错误&#xff1a; 原因&#xff1a;rhel9自带podman和runc&…

车辆种类检测数据集介绍

车辆种类检测数据集 数据集概述 本数据集专为车辆种类检测任务而设计&#xff0c;包含了大量的车辆图像&#xff0c;每张图像均带有详细的车辆种类标注信息。数据集旨在帮助研究人员和开发人员训练高精度的目标检测模型&#xff0c;以应用于车辆识别、交通监控等多个领域。 数…

使用mysql保存密码

登录MySQL 这行命令告诉MySQL客户端程序用户root准备登录&#xff0c;-p表示告诉 MySQL 客户端程序提示输入密码。 mysql -u root -p创建数据库 create database wifi; use wifi;create table password(user_password CHAR(8),primary key(user_password));源码 代码编译 …