opacity过渡仅支持整体线性淡入淡出,无法实现分区域透明渐变;真·透明度渐变需用mask或背景渐变叠加,推荐组合bg-gradient-to-r与-webkit-mask/standard mask,并通过transition控制mask-position实现hover动画。
很多人以为给 opacity 加上 transition 就能做出从透明到不透明的“渐变”,其实这只是线性淡入/淡出——它没有空间上的过渡层次,比如左半边透明、右半边不透明这种视觉渐变。真正的透明度“渐变”需要的是蒙版(mask)或背景渐变叠加,opacity 本身作用于整个元素,无法分区域控制。
Tailwind 不直接提供透明度渐变工具类,但可以组合 bg-gradient-to-r 和 CSS mask(或 -webkit-mask)达成类似效果。关键点是:用渐变色遮罩内容,让颜色深浅映射为可见度高低。
常见写法示例:
<div class="relative w-64 h-32 bg-blue-500"> <div class="absolute inset-0 bg-black bg-opacity-0 mask mask-gradient mask-right-20" style="-webkit-mask: linear-gradient(to right, transparent 0%, black 100%);"></div></div>
说明:
立即学习“前端免费学习笔记(深入)”;
mask-right-20 是自定义类(需在 tailwind.config.js 中扩展),实际生效的是内联 -webkit-mask
to right 对应从左显、向右隐bg-opacity-0 防止遮罩层自身带颜色干扰-webkit-mask,Firefox 支持原生 mask,Chrome 112+ 已支持标准语法想让鼠标悬停时出现“从透明到可见”的渐变动画?直接写 hover:opacity-0 hover:opacity-100 transition-opacity 只会闪一下,因为 opacity 切换是瞬时的,且不支持渐变路径。真正可行的方式是:
transition 控制 -webkit-mask-position 或 background-position,配合渐变背景模拟“扫过式”显现opacity,否则子元素继承后 mask 会失效mask 属性本身加 transition —— 它不支持平滑过渡,只能过渡其相关属性如 mask-position 或 background-position
z-index 和 pointer-events: none 设置正确,否则会拦截鼠标事件如果目标是让文字/图标在模糊背景上“边缘渐隐”,backdrop-filter + mask 组合更可控。例如顶部导航栏文字随滚动淡出:
.fade-out-top { -webkit-mask: linear-gradient(to bottom, transparent 0%, black 30%); mask: linear-gradient(to bottom, transparent 0%, black 30%);}
注意:
backdrop-filter: blur(4px) 必须和 mask 同时存在才体现层次感backdrop-filter 实验性支持(部分版本默认关闭)opacity 动画能替代 mask 渐变——它们解决的是完全不同的问题域最易被忽略的一点:mask 渐变的起止位置单位用百分比最安全,用 px 或 rem 在响应式场景下极易错位。