是否可以使用CSS选择器来定位具有特定值的输入?
示例:如何根据value="United States"
<input type="text" value="United States" />
答案 0 :(得分:46)
正如npup在他的回答中解释的那样,一个简单的css规则只会定位属性value
,这意味着这不会涵盖html节点的实际值。
JAVASCRIPT TO RESCUE!
是的,很有可能,使用css属性选择器,你可以用这种方式引用输入值:
input[value="United States"] { color: #F90; }
来自参考
[att]当元素设置“att”属性时匹配,无论是什么 属性的值。
[att = val]匹配元素的“att” 属性值恰好是“val”。
[att~ = val]表示一个元素 使用att属性,其值是以空格分隔的空格列表 单词,其中一个正好是“val”。如果“val”包含空格, 它永远不会代表任何东西(因为这些词是由...分隔的 空格)。如果“val”是空字符串,它将永远不会代表 什么都有。
[att | = val]表示带有att的元素 属性,其值正好是“val”或以 “val”后紧跟“ - ”(U + 002D)。这主要是为了 允许语言子代码匹配(例如,hreflang属性) 如BCP 47([BCP47])或其后继者中所述的HTML中的元素。 对于lang(或xml:lang)语言子码匹配,请参阅:lang 伪类。
答案 1 :(得分:34)
,如果您使用支持CSS :valid
pseudo-class和pattern
validation attribute on inputs的浏览器 - 包括除IE9以外的大多数现代浏览器。
例如,要在输入正确答案时将输入文本从黑色更改为绿色:
input {
color: black;
}
input:valid {
color: green;
}
&#13;
<p>Which country has fifty states?</p>
<input type="text" pattern="^United States$">
&#13;
答案 2 :(得分:16)
是的,但请注意:由于属性选择器(当然)以元素的属性为目标,而不是DOM节点的 value属性(elem.value),因此它不会更新表单字段时更新。
否则(带有一些技巧)我认为它可以用来制作“仅占用”属性/功能的CSS替代品。也许那是OP之后的事情? :)
答案 3 :(得分:10)
如前所述,您需要的不仅仅是css选择器,因为它不会访问节点的存储值,因此肯定需要javascript。这是另一种可能的解决方案:
<style>
input:not([value=""]){
border:2px solid red;
}
</style>
<input type="text" onkeyup="this.setAttribute('value', this.value);"/>
答案 4 :(得分:5)
答案 5 :(得分:3)
事件刷新属性比每十分之一秒扫描一次更好...
http://jsfiddle.net/yqdcsqzz/3/
inputElement.onchange = function()
{
this.setAttribute('value', this.value);
};
inputElement.onkeyup = function()
{
this.setAttribute('value', this.value);
};
答案 6 :(得分:3)
您可以使用Css3属性选择器或属性值选择器。
/ 这将使所有输入的值定义为红色 /
input[value]{
color:red;
}
/ 这将根据输入值进行条件选择 /
input[value="United States"]{
color:red;
}
还有其他属性选择器,如属性包含值选择器,
input[value="United S"]{
color: red;
}
这仍将使用United state作为红色文本的任何输入。
我们的属性值以选择器
开头input[value^='united']{
color: red;
}
任何输入文字都以&#39; united&#39;开头。字体颜色为红色
最后一个是属性值以选择器
结束input[value$='States']{
color:red;
}
任何输入值均以&#39;状态&#39;结尾。字体颜色为红色
答案 7 :(得分:1)
在当前投票最高的答案之后,我发现使用数据集/数据属性效果很好。
//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>
答案 8 :(得分:0)
在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>