You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用CSS Modules结合三元运算符实现多条件元素样式设置?

问题解决:CSS Modules结合多条件三元运算符设置样式

首先,你的需求完全可行,只是原代码存在语法和逻辑细节问题,以下是具体修正方案:

1. 修正核心语法错误

原代码的className写法有三处问题:

  • 模板字符串内多余了大括号,三元运算符嵌套语法混乱
  • style.box未用${}包裹,无法正确解析CSS Modules生成的类名
  • return后直接换行导致组件返回undefined,JSX需用括号包裹

2. 匹配场景的样式逻辑修正

根据你描述的三种状态,正确逻辑应为:

  • 当前容器被hover → 应用大尺寸类style.hoveredBox
  • 当前容器未被hover,但存在其他hover容器 → 应用中等尺寸类(原代码里的smallBox属于命名错误,需改为mediumBox)
  • 无任何容器被hover → 应用默认小尺寸类style.smallBox

单个容器的修正代码:

import style from './styles.module.sass'
import { useState } from 'react'

const Slider = () => {
  const [isHovered, setIsHovered] = useState(false);
  const [anyCardHovered, setAnyCardHovered] = useState(false)

  return (
    <div 
      className={isHovered ? style.hoveredBox : anyCardHovered ? style.mediumBox : style.smallBox}
      onMouseEnter={() => {
        setIsHovered(true)
        setAnyCardHovered(true)
      }}
      onMouseLeave={() => {
        setIsHovered(false)
        // 实际多容器场景需判断是否还有其他hover容器,此处为简化示例
        setAnyCardHovered(false)
      }}
    >
      {/* 容器内容 */}
    </div>
  )
}

3. 多容器场景的状态优化

如果是多个容器,建议用数组维护每个容器的hover状态,通过计算属性判断全局hover状态:

import style from './styles.module.sass'
import { useState } from 'react'

const Slider = () => {
  const boxCount = 3;
  // 数组存储每个容器的hover状态
  const [boxHovers, setBoxHovers] = useState(Array(boxCount).fill(false));
  // 计算是否有任意容器被hover
  const anyCardHovered = boxHovers.some(hover => hover);

  const handleBoxEnter = (index) => {
    const newHovers = [...boxHovers];
    newHovers[index] = true;
    setBoxHovers(newHovers);
  }

  const handleBoxLeave = (index) => {
    const newHovers = [...boxHovers];
    newHovers[index] = false;
    setBoxHovers(newHovers);
  }

  return (
    <div className={style.sliderContainer}>
      {boxHovers.map((isHovered, index) => (
        <div 
          key={index}
          className={isHovered ? style.hoveredBox : anyCardHovered ? style.mediumBox : style.smallBox}
          onMouseEnter={() => handleBoxEnter(index)}
          onMouseLeave={() => handleBoxLeave(index)}
        >
          容器 {index + 1}
        </div>
      ))}
    </div>
  )
}

内容的提问来源于stack exchange,提问作者Fateme Hemmati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:01:06