You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

TailwindCSS 卡片翻转无法按顺序执行问题求助

TailwindCSS 卡片翻转无法按顺序执行问题求助

我来帮你排查下这个问题,你遇到的核心问题是Tailwind无法识别动态生成的类名,加上3D翻转的CSS属性没配置到位,导致顺序翻转效果没生效。咱们一步步来解决:

问题分析

  • 动态类名不被编译:Tailwind是静态扫描CSS类的,你用delay-${index}这种动态拼接的类名,Tailwind不会把它们编译到最终的CSS文件里,所以这些延迟样式根本没生效。
  • 3D翻转属性缺失:要实现正确的卡片翻转动画,需要给父元素添加preserve-3d,给正面和背面元素添加backface-hidden,否则背面元素可能会提前显示或者翻转效果异常。
  • 状态与group-hover冲突:你同时用了isHovering状态和group-hover伪类,逻辑上有点冗余,而且可能导致动画触发时机混乱。

解决方案

步骤1:修复动态延迟的问题(两种可选方法)

方法A:使用style属性直接设置延迟(最推荐)

不需要依赖Tailwind的自定义delay类,直接给每个卡片元素添加style属性,计算对应的延迟时间:

import { useState } from 'react';

const LandingPage = () => {
  const tablets ={
    front: ["F","r","a","n","c","o"," ","A",".","M","a","r","c","u","z","z","i"," "],
    back: ["D","e","v","e","l","o","p","e","r"," ","B","a","c","k","e","n","d"," "],
  }

  return (
    <section id="home">
      <div className="container mx-auto flex px-10 py-20 md:flex-row flex-col bg-black">
        <div className="bg-slate-800 flex-grow w-full flex items-center justify-center flex-col group">
          <div className="grid grid-cols-9 gap-1 my-4 w-full text-center font-extrabold text-3xl lg:text-6xl sm:text-6xl md:text-4xl">
            {tablets.front.map((e, index) => (
              <div 
                className={`relative bg-red-800 transform transition-all ease-in-out duration-1000 preserve-3d group-hover:[transform:rotateY(180deg)]`} 
                key={index}
                style={{ transitionDelay: `${index * 200}ms` }}
              >
                {/* 正面元素 */}
                <div className="bg-red-800 p-2 backface-hidden">{e}</div>
                {/* 背面元素 */}
                <div className="absolute top-0 left-0 w-full h-full bg-blue-500 p-2 text-white backface-hidden transform rotate-y-180 group-hover:[transform:rotateY(0deg)]">
                  {tablets.back[index]}
                </div>
              </div>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
};

export default LandingPage;

方法B:使用Tailwind任意值(备选)

如果你想继续用Tailwind类,可以用任意值语法,Tailwind会识别这种写法:

className={`relative bg-red-800 transform transition-all ease-in-out duration-1000 preserve-3d group-hover:[transform:rotateY(180deg)] delay-[${index*200}ms]`}

步骤2:完善3D翻转的CSS属性

在Tailwind配置里添加必要的3D相关工具类:

/** @type {import('tailwindcss').Config} */
const plugin = require("tailwindcss/plugin");

module.exports = {
  // ...其他原有配置
  plugins: [
    plugin(function ({ addUtilities }) {
      addUtilities({
        ".preserve-3d": {
          transformStyle: "preserve-3d",
        },
        ".backface-hidden": {
          backfaceVisibility: "hidden",
        },
      });
    }),
    // 如果你不需要自定义delay类了,可以删掉之前的animationDelay插件
  ],
};

步骤3:简化hover触发逻辑

删掉isHovering相关的状态和事件监听,直接用group-hover伪类控制翻转,避免逻辑冲突:

// 移除以下代码:
// const [isHovering, setIsHovering] = useState(false);
// const handleMouseEnter = () => setIsHovering(true);
// const handleMouseLeave = () => setIsHovering(false);

// 同时移除容器上的onMouseEnter/onMouseLeave属性

效果说明

修改完成后,当你鼠标移入group容器时,每个卡片会按照index顺序,以200ms的间隔依次执行翻转动画,正面和背面的显示也会因为添加了3D属性而正常切换。

备注:内容来源于stack exchange,提问作者Dario Marcuzzi

火山引擎 最新活动