Jest to możliwe, z typowymi zastrzeżeniami CSS i możliwością modyfikacji kodu HTML. Jeśli dodasz requiredatrybut do elementu, element będzie pasował :invalidlub w :validzależności od tego, czy wartość kontrolki jest pusta, czy nie. Jeśli element nie ma valueatrybutu (lub ma value=""), wartość kontrolki jest początkowo pusta i staje się niepusty po wprowadzeniu dowolnego znaku (nawet spacji).
Przykład:
<style>
#foo { background: yellow; }
#foo:valid { outline: solid blue 2px; }
#foo:invalid { outline: solid red 2px; }
</style>
<input id=foo required>
Pseudo-klasyfikowane :validi :invalidsą zdefiniowane tylko w dokumentach CSS na poziomie Working Draft, ale obsługa jest dość powszechna w przeglądarkach, z wyjątkiem tego, że w IE jest dostarczana z IE 10.
Jeśli chcesz, aby „puste” zawierały wartości zawierające tylko spacje, możesz dodać atrybut pattern=.*\S.*.
Nie ma (obecnie) selektora CSS do bezpośredniego wykrywania, czy kontrolka wejściowa ma niepustą wartość, więc musimy to zrobić pośrednio, jak opisano powyżej.
Ogólnie rzecz biorąc, selektory CSS odnoszą się do znaczników lub, w niektórych przypadkach, do właściwości elementu ustawionych za pomocą skryptów (JavaScript po stronie klienta), a nie do działań użytkownika. Na przykład :emptydopasowuje element do pustej treści w znaczniku; inputw tym sensie wszystkie elementy są nieuchronnie puste. Selektor [value=""]sprawdza, czy element ma valueatrybut w znaczniku i ma pusty ciąg jako wartość. A :checkedi :indeterminatesą podobne rzeczy. Nie ma na nie wpływu faktyczne działanie użytkownika.