【问题标题】:CSS How to style when value of an attribute is in a defined rangeCSS如何在属性值在定义范围内时设置样式
【发布时间】:2020-09-25 11:39:20
【问题描述】:

我建立了一个日历,每一天都是一个列表项。它包含一个带有 data-count 属性的 span 元素。 此属性旨在显示资源的可用性并动态更新。 我想用跨度的背景颜色显示这种可用性。我可以单独管理每个值​​,但我想按范围管理它, 例如,如果数据计数在 [0, 999] 中,则背景为绿色,在 [1000, 9999] 中为橙色,并且 >= 10000 : 红色

有没有办法仅在 css 中进行管理(无需任何额外的 javascript 或 html 更改)? (如果是的话如何?) 是否有一个 CSS 选择器来获取数据计数在 [0, 999] 范围内的所有跨度?

风格是这样的

li { 
    list-style-type: none;
    display: inline-block;
    width: 18%;
    text-align: left;
    margin-bottom: 5px;
    background: #bbb;
    padding: 5px;
}

li span {
    display: inline-block;
    padding: 5px;
    width: 90%;
}

li span[data-count="50"] {
    background: lime;
}
li span[data-count="5001"] {
    background: orange;
}
li span[data-count="50000"] {
    background: red;
}

这里是html

<ul>
    <li><span data-count="50" >1/1/70 - free</span></li><br>
    <li><span data-count="51" >2/1/70 - free</span></li><br>
    <li><span data-count="5001">3/1/70 - hurry up</span></li><br>
    <li><span data-count="50000">4/1/70 - last chance</span></li>
</ul>

【问题讨论】:

标签: css


【解决方案1】:

一个想法是否可以用 CSS 变量替换数据值(类似于this answer

li { 
    list-style-type: none;
    display: inline-block;
    width: 18%;
    text-align: left;
    margin-bottom: 5px;
    background: #bbb;
    padding: 5px;
}

li span {
    display: inline-block;
    padding: 5px;
    width: 90%;
    background:
      /* from 10000 to infinity */
      linear-gradient(red,red)      0 /100% calc((var(--count) - 9999)*1px),
      /* from 1000 to 9999*/
      linear-gradient(orange,orange)0 /100% calc((var(--count) - 999)*1px),
      /* from 0 to 999*/
      green; 
}
<ul>
    <li><span style="--count:50" >1/1/70 - free</span></li>
    <li><span style="--count:51" >2/1/70 - free</span></li>
    <li><span style="--count:5001">3/1/70 - hurry up</span></li>
    <li><span style="--count:50000">4/1/70 - last chance</span></li>
</ul>

【讨论】:

  • 它不是很干燥,这不是data-count 属性的唯一用途。但是它是这样更新的:setAttribute('data-count', parseInt(day.getAttribute('data-count'),10)+1);,它是根据来自 websocket 的消息启动的。我必须在这附近添加一些代码来解析style 属性以保留其原始内容并仅更新计数。我将对此进行深入研究,但无法将其验证为答案,因为我必须更改 html。我认为attr() css 函数不支持数字时它会一直没有答案。
  • @Tuckbros 我根据您提供的信息回答。我不知道你在做什么,你不需要解析 Style 属性,你可以简单地做 .style.setProperty("--count", 50);.style.getPropertyValue('--count')
  • 问题是关于仅给定 html 的 css。因为我可以,所以我将使用解决方法。但这不是一个令人满意的答案,因为它需要在仅需要 css 的问题范围之外进行更改。
  • @Tuckbros 您的问题中没有任何内容表明您不允许更改您的html。 CSS only 并不意味着您不能调整 HTML,因为两者一起工作,我调整了 HTML 以适应我正在使用的 CSS 解决方案。编辑您的问题以添加更多上下文并说出您在此评论部分中所说的所有内容,以便获得准确的答案。
  • 并使用getPropertyValue 来增加它:这是我用作解决方法.style.setProperty('--data-count', parseInt(day.style.getPropertyValue('--data-count'),10)+1); 的方法,它必须初始化才能获得NaN
猜你喜欢
  • 2021-02-16
  • 2021-01-02
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
相关资源
最近更新 更多