Is it possible to use an input value attribute as a CSS selector?

Css

Css Problem Overview


Is it possible to use a CSS selector to target an input that has a specific value?

Example: How can I target the input below based on the value="United States"

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

Css Solutions


Solution 1 - Css

Dynamic Values (oh no! D;)

As npup explains in his answer, a simple css rule will only target the attribute value which means that this doesn't cover the actual value of the html node.

JAVASCRIPT TO THE RESCUE!


Original Answer

Yes it's very possible, using css attribute selectors you can reference input's by their value in this sort of fashion:

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

• jsFiddle example

> from the reference > > - [att] Match when the element sets the "att" attribute, whatever the > value of the attribute. > > - [att=val] Match when the element's "att" > attribute value is exactly "val". > > - [att~=val] Represents an element > with the att attribute whose value is a white space-separated list of > words, one of which is exactly "val". If "val" contains white space, > it will never represent anything (since the words are separated by > spaces). If "val" is the empty string, it will never represent > anything either. > > - [att|=val] Represents an element with the att > attribute, its value either being exactly "val" or beginning with > "val" immediately followed by "-" (U+002D). This is primarily intended > to allow language subcode matches (e.g., the hreflang attribute on the > a element in HTML) as described in BCP 47 ([BCP47]) or its successor. > For lang (or xml:lang) language subcode matching, please see the :lang > pseudo-class.

Solution 2 - Css

It is possible, if you're using a browser which supports the CSS :valid pseudo-class and the pattern validation attribute on inputs -- which includes most modern browsers except IE9.

For instance, to change the text of an input from black to green when the correct answer is entered:

input {
  color: black;
}
input:valid {
  color: green;
}

<p>Which country has fifty states?</p>

<input type="text" pattern="^United States$">

Solution 3 - Css

Yes, but note: since the attribute selector (of course) targets the element's attribute, not the DOM node's value property (elem.value), it will not update while the form field is being updated.

Otherwise (with some trickery) I think it could have been used to make a CSS-only substitute for the "placeholder" attribute/functionality. Maybe that's what the OP was after? :)

Solution 4 - Css

As mentioned before, you need more than a css selector because it doesn't access the stored value of the node, so javascript is definitely needed. Heres another possible solution:

<style>
input:not([value=""]){
border:2px solid red;
}
</style>

<input type="text" onkeyup="this.setAttribute('value', this.value);"/>

Solution 5 - Css

Sure, try:

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

jsFiddle example.

Solution 6 - Css

You can use Css3 attribute selector or attribute value selector.

/This will make all input whose value is defined to red/

input[value]{
color:red;
}

/This will make conditional selection depending on input value/

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

There are other attribute selector like attribute contains value selector,

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

This will still make any input with United state as red text.

Than we attribute value starts with selector

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

Any input text starts with 'united' will have font color red

And the last one is attribute value ends with selector

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

Any input value ends with 'States' will have font color red

Solution 7 - Css

Refreshing attribute on events is a better approach than scanning value every tenth of a second...

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

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

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

Solution 8 - Css

In Chrome 72 (2019-02-09) I've discovered that the :in-range attribute is applied to empty date inputs, for some reason!

So this works for me: (I added the :not([max]):not([min]) selectors to avoid breaking date inputs that do have a range applied to them:

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

Screenshot:


enter image description here


Here's a runnable sample:

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>

Solution 9 - Css

Following the currently top voted answer, I've found using a dataset / data attribute works well.

//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>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionblacktie24View Question on Stackoverflow
Solution 1 - CssMichael ZaporozhetsView Answer on Stackoverflow
Solution 2 - CssBlazemongerView Answer on Stackoverflow
Solution 3 - CssnpupView Answer on Stackoverflow
Solution 4 - CsskylpageView Answer on Stackoverflow
Solution 5 - Cssj08691View Answer on Stackoverflow
Solution 6 - CssmaxspanView Answer on Stackoverflow
Solution 7 - Cssat0View Answer on Stackoverflow
Solution 8 - CssDaiView Answer on Stackoverflow
Solution 9 - CssAlex DesrochesView Answer on Stackoverflow