前情

Tailwind CSS 是一个原子类 CSS 框架,它将基础的 CSS 全部拆分为原子级别,能达到最小化项目CSS。它的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何模板中的 CSS 类名,然后生成相应的样式代码并写入到一个静态 CSS 文件中。Tailwind CSS 快速、灵活、可靠,没有运行时负担。自从接触了Tailwind CSS后,目前已经是我项目的标配了。我最近接手的uni-app项目就被我引入了Tailwind CSS,大大提高了书写样式的开发体验和效率。

问题:

原子化CSS都把样式都打平在同级了,样式优化级只跟出现的先后顺序有关,如果是纯使用Tailwind CSS开发的项目是问题不大的,但是很多时候都是在原有项目上增加Tailwind CSS,我目前手上项目就是我接手后才引入Tailwind CSS的,开发中总是会遇到因为样式优先级不够导致样式冲突不生效的问题,特别是修改原有项目样式的时候被优先级问题困扰。

解决方案1:

通过修改Tailwind.config.js配置让所有原子化CSS都增加!important后辍来全局提高Tailwind CSS生成的样式的优先级

const path = require("path");

const resolve = (p) => {
return path.resolve(__dirname, p);
};
/** @type {import('tailwindcss').Config} */
module.exports = {
// 增加此配置让所有Tailwind CSS样式增加!important后辍达到提高样式优先级
important: true,
content: [
"./index.html",
"./pages/**/*.{html,js,ts,jsx,tsx,vue}",
"./components/**/*.{html,js,ts,jsx,tsx,vue}"
].map(resolve),
// ...
corePlugins: {
// 跨多端可以 h5 开启,小程序关闭
preflight: false,
}
};

问题:此方案全局提高所有原子化样式优先级有点太过头,真正项目并不是所有样式都会有样式冲突的,所以不需要所有的样式都增加!important,导致过多的无用后辍。

解决方案2:

通过修改Tailwind.config.js配置,增加样式层级来提高提高Tailwind CSS生成的样式的优先级

const path = require("path");

const resolve = (p) => {
return path.resolve(__dirname, p);
};
/** @type {import('tailwindcss').Config} */
module.exports = {
// 增加此配置让生成的原子化CSS都会在此样式层级下,以增加原子化CSS的层级来提高样式优先级
important: 'my-app',
content: [
"./index.html",
"./pages/**/*.{html,js,ts,jsx,tsx,vue}",
"./components/**/*.{html,js,ts,jsx,tsx,vue}"
].map(resolve),
// ...
corePlugins: {
// 跨多端可以 h5 开启,小程序关闭
preflight: false,
}
};

问题:此方案虽然能提高样式优先级,但是提高的权重有限,可能并不适合所有场景。

解决方案3(推荐):

单独为特定原子化CSS增加!important后辍来提高样式优先级,也是我一直在使用的方案,我最近接手的一个项目发现前一开发在全局对图片标签宽高做了重置了,我不得不在设置图片宽高的时候增加!前辍以让它生成的原子化CSS添加!important后辍

<image
src="../static/wen.webp"
mode="aspectFill"
class="!zhs-w-[44rpx] !zhs-h-[44rpx]"
/>

最终生成的原子化CSS如下:

.izhs-w-_44rpx_ {
width: 22px !important;
}
.izhs-h-_44rpx_ {
height: 22px !important;
}

总结

方案1和方案3的原理是!important可以让样式权重提高到最高来达到解决样式冲突的问题,而方案2的方式是通过样式层级来提高样式优先级。

方案3是我个人觉得最优化的解决方案,即能解决样式优先级问题,也能保证修改的范围最小化。

此文章虽然是以我手上的uni-app项目作为演示示例,一些写法跟平时的web项目有一些区别,但web项目也是一样支持的。

如果你有更好的提高Tailwind CSS样式优先级的方案,欢迎留言,一起讨论学习进步吧。

友情提示

uni-app项目一般使用的IDE是官方自带的HBuilder x,为了更好的开发体验安装如下插件,即可实现样式名提示了,插件地址:Tailwind CSS语言服务 - DCloud 插件市场

安装插件开发者工具会有莫名的报错,可以忽略,从最近一二周的使用体验上来说是没有什么问题的。

Tailwind CSS样式优先级控制的更多相关文章

  1. Tailwind CSS in Action

    Tailwind CSS in Action Tailwind CSS是一个高度可定制的低级CSS框架,它为您提供了构建定制设计所需的所有构造块,而无需烦恼要覆盖的烦人的自以为是的样式 https:/ ...

  2. css样式让input垂直居中

    css样式让input垂直居中 css代码: .div1{ border: 1px solid #CCC; width:1120px; height:40px; margin:auto; displa ...

  3. 深度理解CSS样式表,内有彩蛋....

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. js设置css样式.

    在js设置css样式做法 var obj = document.getElementById('div'); obj.style.width = '100px'; obj.style.height = ...

  5. CSS样式表

    CSS样式及属性 样式标的基本概念 样式表的分类 1.内联样式表 和html联合显示,控制精确,但可重用性差,冗余多. 例:<p style="font-size:14px;" ...

  6. 脚本工具(获取某个文件夹下的所有图片属性批量生成css样式)

    问题描述: 由于有一次工作原因,就是将某个文件夹下的所有图片,通过CSS描述他们的属性,用的时候就可以直接引用.但是我觉得那个文件夹下的图片太多,而且CSS文件的格式又有一定的规律,所有想通过脚本来生 ...

  7. jQuery所支持的css样式

    jQuery所支持的css样式 backgroundPosition borderWidth borderBottomWidth borderLeftWidth borderRightWidth bo ...

  8. Yii2 assets注册的css样式文件没有加载

    准备引入layui.css文件的,在LayuiAssets类中已经配置了资源属性 <?php namespace frontend\assets; use yii\web\AssetBundle ...

  9. 获取元素计算后的css样式封装

    获取元素计算后的css样式封装: function getCss(obj,attribute) { if(obj.currentStyle) { return obj.currentStyle[att ...

  10. JS实战 · 仿css样式选择器

    代码如下: <html> <head>     <meta http-equiv="Content-Type" content="text/ ...

随机推荐

  1. Figma 学习笔记 – Scroll and Position Fixed

    Scroll Scroll 属于 prototype 的一部分. 当一个 Frame 的内容超出 Frame 的高度或宽度时, Frame 就具备了 scroll 的能力. 通过 uncheck cl ...

  2. MySQL服务无法启动 服务没有报告任何错误

    安装MYSQL后 启动服务 出现错误 在启动MySQL服务时 出现该报错 解决方法: 将原本在MySQL根目录下的my.ini文件移动到bin目录下(my.ini文件参考:这里)    删除根目录下的 ...

  3. MyBatis——案例——添加

    添加   1.编写接口方法:Mapper接口     参数:除了 id 之外的所有数据     结果:void /** * 添加 */ void add(Brand brand);   2.编写SQL ...

  4. 如何创建免费版本的ABP分离模块?

    如何创建免费版本的ABP分离模块? 由于ABP最近官方大改革,我们打开ABP.IO 官方会发现通过Cli创建模板的时候不能创建Trered类型的了 就是创建一个分层的解决方案,其中Web和Http A ...

  5. Java日期时间API系列34-----Jdk8中java.time包中的新的日期时间API类应用,使用Period一行代码计算生日。

    通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别中得知,Period可以比较2个日期相差的年月日.年龄计算是2个日 ...

  6. 2024年7月中国数据库排行榜:PolarDB独领云风骚,达梦跨越新巅峰

    在7月发布的中国数据库流行度排行榜中,各大国产数据库厂商在不同领域表现势如破竹,PolarDB以800分刷新记录,并在SIGMOD 2024上获得"最佳论文奖":OceanBase ...

  7. Android复习(一)基础知识

    1. 现在可以使用 Kotlin.Java 和 C++ 语言编写 Android 应用 2.Android四大组件依然坚挺,这是基础并且没有改变的迹象 Activity 服务 广播接收器 内容提供程序 ...

  8. NetCore项目发布对前端项目进行打包合并发布

    在某个小项目中, api使用asp.net core 3.x 编写, UI页面则使用Vuejs. 正常情况下, 项目右键的发布只会发布api项目,而不会管Vuejs的项目. 所以通过简单的改造,在发布 ...

  9. 云原生周刊:CNCF 宣布 Cilium 毕业 | 2023.10.16

    开源项目推荐 Reloader Reloader 是一个 Kubernetes 控制器,用于监控 ConfigMap 和 Secrets 中的变化,并对 Pod 及其相关部署.StatefulSet. ...

  10. mongodb副本集群使用总结

    一.该文档仅为了总结经验,方便下次部署时跳过踩过的坑.其中MongoDB的复制原理.特点等参照的菜鸟教程,附地址:https://www.runoob.com/mongodb/mongodb-repl ...