【问题标题】:Style html elements dynamically based on id根据 id 动态设置 html 元素样式
【发布时间】:2021-11-25 14:20:29
【问题描述】:

我想根据自己的 id 为不同的元素着色。如果他们的 id 在我提供的 id 列表中,则将其设为一种颜色,否则,将其设为另一种颜色。

在下面的示例中,有 4 个 div,每个都有不同的颜色。如何在不为每个 div 定义 css 规则的情况下根据他的 id 为每个 div 着色?

const Main = () => {
return (
    <React.Fragment>
    <div id='1' style={{background: 'red'}}>1</div>
    <div id='2' style={{background: 'blue'}}>2</div>
    <div id='3' style={{background: 'green'}}>3</div>
    <div id='4' style={{background: 'cyan'}}>4</div>
  </React.Fragment>
    )
}

https://jsfiddle.net/9debt3cL/19/

如果问题不是很清楚,请告诉我。

更新:上下文:我有一个 svg 蓝图,分为多个部分,每个部分都有一个唯一的编号。我必须获取一些包含蓝图编号的某些部分的数据,并根据这些编号填充蓝图路径。

【问题讨论】:

    标签: javascript html css reactjs


    【解决方案1】:

    这是您尝试的更新 jsfiddle:https://jsfiddle.net/fyLab6zr/21/

    不确定这是否正是您想要的,但颜色是在 css 中指定的,因此应该给出特定颜色的 id 列表,以及所有不匹配的默认颜色:

    .background {
      background: red;
    }
    
    .background-1, .background-2 {
      background: blue;
    }
    
    .background-3, .background-4 {
      background: green;
    }
    

    然后你有一个 ids 列表,你可以遍历它来填充特定的 ids 行。 传入background-${id}中的id,设置className等于对应的id。如果存在,它将被设置样式,或者使用后备“背景”类

    const Main = () => {
    const ids= [1,1,3,2,1,3,4,5, 6, 1]
    return (
        <React.Fragment>
        {ids.map((id) => {
            return <div id={id} className={`background background-${id}`}>{id}</div>  
        })}
      </React.Fragment>
        )
    }
    
    ReactDOM.render(<Main />, document.querySelector("#app"))
    

    编辑:

    这种方法会创建您预定义的 id 列表,在本例中是两个列表,导致两种不同的颜色。如果没有匹配,它仍然默认返回backgroundgetColor 函数根据 id 给出正确的 className。您还可以根据需要预定义任意数量的元素。

    const color1 = [1,2]
    const color2 = [3,4]
    
    const getColor = (id) => {
       return color1.includes(id) ? 1 : color2.includes(id) ? 2 : -1
    }
    
    return (
        <React.Fragment>
            <div id="1" className={`background background-${getColor(1)}`}>1</div>
            <div id="2" className={`background background-${getColor(2)}`}>2</div> 
            <div id="3" className={`background background-${getColor(3)}`}>3</div>   
            <div id="4" className={`background background-${getColor(4)}`}>4</div> 
            <div id="5" className={`background background-${getColor(5)}`}>5</div> 
        </React.Fragment>
        )
    }
    
    ReactDOM.render(<Main />, document.querySelector("#app"))
    

    【讨论】:

    • 这种方法强制你创建的 div 等于 id 中元素的数量。我想定义一些具有预定义 id 的 div,并根据 id 列表为那些已经定义的 div 着色。如果列表中只有一个 id 或每个 div 等等,则可能只为其中一个 div 着色...
    • 我根据您的评论更新了我的答案。仍然不确定我是否理解正确。
    • 没有。我理解你的方法,但这不是我想的。你和@Neeko 一样。如果你这样做,你需要手动将每个 id 传递给 getColor 函数。如果它可以自动获取元素的 id 这样您就不必指定它 2 次,那就太好了。如果您已经知道将在列表中出现的 id,则此方法可以正常工作。
    • 问题是,您无法在该位置获取元素的 id。如果您通过id={someIdParameter} 从某个外部源传递元素的id,您也可以在getColor() 中传递该元素的id,尽管它不会有太大变化。如果不查看整个代码库,很难给出准确的答案。
    • 好吧,我不能给出内部隐私政策的代码库原因。我可以说我想用它做什么:我有一个 svg 蓝图,分为多个部分,每个部分都有一个唯一的编号。我必须获取一些包含蓝图编号的某些部分的数据,并根据这些编号填充蓝图路径。
    【解决方案2】:

    你可以这样:

    const Main = () => {
      const coloredIds = ['1', '4'];
    
      const getBackgroundColor = (id) => {
         return coloredIds.includes(id) ? 'cyan' : 'red';
      }
    
      return (
        <React.Fragment>
          <div id='1' style={{background: getBackgroundColor('1')}}>1</div>
          <div id='2' style={{background: getBackgroundColor('2')}}>2</div>
          <div id='3' style={{background: getBackgroundColor('3')}}>3</div>
          <div id='4' style={{background: getBackgroundColor('4')}}>4</div>
        </React.Fragment>
      );
    }
    

    或者如果你有多种颜色

    const getBackgroundColor = (id) => {
      switch (id) {
        case '1':
          return 'red';
        case '2':
          return 'blue;
        case '3':
          return 'green';
        case '4':
        default:
          return 'cyan';
      }
    }
    

    【讨论】:

    • 如果我不必在 getBackgroundColor 中手动传递 id,而是以某种方式从标签中获取它,那就太好了。我不认为这是可能的。
    • @Ghost,确实,使用这种方法可能无法访问元素的 id 标签。
    【解决方案3】:

    我认为 Wanz 有正确的方法,您可以创建具有所需属性的 css 类。然后将这个类添加到 dom 元素,如果它对应于 switch case。 像这样:

      var element = document.getElementById("myDIV");
      switch (expr) {
      case 'id1':
      element.classList.add("styleId1");
      break;
      case 'id2':
      element.classList.add("styleId2");
    
      case 'id3':
      element.classList.add("styleId3");
    
      break;
      default:
        console.log(`no matching id`);
    }
    

    【讨论】:

      【解决方案4】:

      不完全确定它是否会起作用,但您可以随时尝试,使用 javascript 查看开关盒。设置表达式,根据值等有不同的情况。在这个例子中可以是 Id,根据情况有不同的结果。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 2018-04-04
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 2018-11-29
      相关资源
      最近更新 更多