:not(:empty)CSSセレクターが機能していませんか?


92

この特定のCSSセレクターを追加:not(:empty)すると、動作しなくなってしまいました。他のセレクターのどの組み合わせでも問題なく動作するようです。

input:not(:empty):not(:focus):invalid { border-color: #A22; box-shadow: none }

:not(:empty)パーツを外しても問題なく動作します。セレクターを変更しても、input:not(:empty)テキストが入力されている入力フィールドは選択されません。これは壊れていますか:empty:not()それともセレクタ内での使用が許可されていませんか?

私が考えることができる他の唯一のことは、ブラウザにはまだ子がないので要素は空であると言っていることです。ん:emptyセレクタは、定期的な要素対の入力要素のための独立した機能を持っていませんか?ただし:empty、フィールドで使用してフィールドに何かを入力すると、代替の効果がなくなるためです(フィールドが空ではなくなるため)。

Firefox 8およびChromeでテスト済み。


関連するコードを投稿できますか?
Virendra

2
私はあなたの一部を引用することができますのAPIリファレンス:emptyセレクタ:「いくつかの他の要素を、他方では、定義によって(すなわち子を持たない)空になっている:<input><img><br>、および<hr>、たとえば。」
デビッドはモニカを

@Virendra:これは関連するコードですが、実際のCSSルールを追加しました。を削除する:not(:empty)と、フォーカスされていないが無効な入力に対して、赤い境界線が期待どおりに機能します。
アニムソン

回答:


149

ビーイング空要素<input>要素が考慮され、空のすべてのボイドの要素の内容モデルがあるため、「空」のHTML定義によって常に空です。したがって:empty、値があるかどうかに関係なく、常に疑似クラスに一致します。これが、開始タグと終了タグ内のテキストコンテンツではなく、開始タグの属性によって値が表される理由でもあります。

また、セレクター仕様から:

:empty疑似クラスは、すべての子を持たない要素を表します。ドキュメントツリーの観点からは、要素ノードとコンテンツノード(DOMテキストノード、CDATAノード、エンティティ参照など)のデータの長さがゼロ以外である場合のみ、空に影響を与えると見なす必要があります。

したがって、input:not(:empty)適切なHTML文書の何にも一致しません。(<input>テキストまたは子要素を受け入れることができる要素を定義する架空のXMLドキュメントでも機能します。)

<input>CSSだけを使用して空のフィールドに動的にスタイルを設定することはできないと思います(つまり、フィールドが空の場合は常に適用され、テキストが入力されない場合のルール)。属性が空の場合()または属性がまったくない場合()は、最初は空のフィールドを選択できますが、それはそれだけです。valueinput[value=""]input:not([value])


うーん、エフェクトをだけで消すために何をしたか覚えていませんinput:empty。たぶん、私は何か間違ったタイプを入力しました。
アニムソン

9
回答の最後の段落について、HTMLマークアップで属性をinput使用できる場合は、要素を動的に(十分に最新のブラウザーで)スタイル設定できますrequired。次に、CSSで:validand :invalidを使用して、コントロールの空でない値と空の値をテストできます。stackoverflow.com/questions/16952526/…を
Jukka K. Korpela

1
@ JukkaK.Korpela(パターン属性も使用している場合を除く)。
WORMSS 2016

2
input:not([value = ''])は、値;)を持つ入力を選択します
Chris Love

@Chris Love:初期(ページ読み込み時)の値を持つ入力。
BoltClock

43

インラインJavaScriptで可能ですonkeyup="this.setAttribute('value', this.value);"input:not([value=""]):not(:focus):invalid

デモ:http : //jsfiddle.net/mhsyfvv9/

input:not([value=""]):not(:focus):invalid{
  background-color: tomato;
}
<input 
  type="email" 
  value="" 
  placeholder="valid mail" 
  onchange="this.setAttribute('value', this.value);" />


onchangeこの場合、イベントの方がいいのでは?Right click > Cut(たとえば)入力値も編集できるため。テスト済み:正常に動作します。
Derk Jan Speelman

38

:placeholder-shown ...を使用してみてください。

input {
  padding: 10px 15px;
  font-size: 16px;
  border-radius: 5px;
  border: 2px solid lightblue;
  outline: 0;
  font-weight:bold;
  transition: border-color 200ms;
  font-family: sans-serif;
}

.validation {
  opacity: 0;
  font-size: 12px;
  font-family: sans-serif;
  color: crimson;
  transition: opacity;
}

input:required:valid {
  border-color: forestgreen;
}

input:required:invalid:not(:placeholder-shown) {
  border-color: crimson;
}

input:required:invalid:not(:placeholder-shown) + .validation {
  opacity: 1;
}

  
<input type="email" placeholder="e-mail" required>
<div class="validation">Not valid</span>

素晴らしいサポートはありません... caniuse


1
かなり良いサポートですが... caniuse
Reggie Pinkham

古き良きInternet Explorer(Y)
rorymorris89

@ rorymorris89 EDGEの最新バージョンでさえサポートしていません:-(
Mo.

12

.floating-label-input {
  position: relative;
  height:60px;
}
.floating-label-input input {
  width: 100%;
  height: 100%;
  position: relative;
  background: transparent;
  border: 0 none;
  outline: none;
  vertical-align: middle;
  font-size: 20px;
  font-weight: bold;
  padding-top: 10px;
}
.floating-label-input label {
  position: absolute;
  top: calc(50% - 5px);
  font-size: 22px;
  left: 0;
  color: #000;
  transition: all 0.3s;
}
.floating-label-input input:focus ~ label, .floating-label-input input:focus ~ label, .floating-label-input input:valid ~ label {
  top: 0;
  font-size: 15px;
  color: #33bb55;
}
.floating-label-input .line {
  position: absolute;
  height: 1px;
  width: 100%;
  bottom: 0;
  background: #000;
  left: 0;
}
.floating-label-input .line:after {
  content: "";
  display: block;
  width: 0;
  background: #33bb55;
  height: 1px;
  transition: all 0.5s;
}
.floating-label-input input:focus ~ .line:after, .floating-label-input input:focus ~ .line:after, .floating-label-input input:valid ~ .line:after {
  width: 100%;
}
<div class="floating-label-input">
      <input type="text" id="id" required/>
      <label for="id" >User ID</label>
      <span class="line"></span>
</div>


7

これは別の方法で行うことができます。:empty疑似クラスの使用を省略し、inputイベントを利用して<input>フィールドの重要な値を検出し、それに応じてスタイルを設定します。

var inputs = document.getElementsByTagName('input');

for (var i = 0; i < inputs.length; i++) {
  var input = inputs[i];
  input.addEventListener('input', function() {
    var bg = this.value ? 'green' : 'red';
    this.style.backgroundColor = bg;
  });
}
body {
  padding: 40px;
}
#inputList li {
  list-style-type: none;
  padding-bottom: 1.5em;
}
#inputList li input,
#inputList li label {
  float: left;
  width: 10em;
}
#inputList li input {
  color: white;
  background-color: red;
}
#inputList li label {
  text-align: right;
  padding-right: 1em;
}
<ul id="inputList">
  <li>
    <label for="username">Enter User Name:</label>
    <input type="text" id="username" />
  </li>
  <li>
    <label for="password">Enter Password:</label>
    <input type="password" id="password" />
  </li>
</ul>

関連した


免責事項:イベントは現在実験段階であり、おそらく広くサポートされていないことに注意してください。input


3

プレースホルダーは入力時に表示されなくなるため、以下を使用できます。

input:placeholder-shown{
    //rules for not empty input
}

2

純粋なCSSソリューション

input::-webkit-input-placeholder {
    opacity: 1;
    -webkit-transition: opacity 0s;
    transition: opacity 0s;
    text-align: right;
}
/* Chrome <=56, Safari < 10 */
input:-moz-placeholder {
    opacity: 1;
    -moz-transition: opacity 0s;
    transition: opacity 0s;
    text-align: right;
}
/* FF 4-18 */
input::-moz-placeholder {
    opacity: 1;
    -moz-transition: opacity 0s;
    transition: opacity 0s;
    text-align: right;
}
/* FF 19-51 */
input:-ms-input-placeholder {
    opacity: 1;
    -ms-transition: opacity 0s;
    transition: opacity 0s;
    text-align: right;
}
/* IE 10+ */
input::placeholder {
    opacity: 1;
    transition: opacity 0s;
    text-align: right;
}
/* Modern Browsers */

*:focus::-webkit-input-placeholder {
   opacity: 0;
   text-align: left;
}
/* Chrome <=56, Safari < 10 */
*:focus:-moz-placeholder {
    opacity: 0;
    text-align: left;
}
/* FF 4-18 */
*:focus::-moz-placeholder {
    opacity: 0;
    text-align: left;
}
/* FF 19-50 */
*:focus:-ms-input-placeholder {
    opacity: 0;
    text-align: left;
}
/* IE 10+ */
*:focus::placeholder {
    opacity: 0;
    text-align: left;
}
/* Modern Browsers */

input:focus {
    text-align: left;
}

0

別の純粋なCSSソリューション

.form{
  position:relative;
  display:inline-block;
}
.form input{
  margin-top:10px;
}
.form label{
    position:absolute;
    left:0;
    top:0;
    opacity:0;
    transition:all 1s ease;
}
input:not(:placeholder-shown) + label{
    top:-10px;
    opacity:1;
}
<div class="form">
    <input type="text" id="inputFName" placeholder="Firstname">
    <label class="label" for="inputFName">Firstname</label>
</div>
<div class="form">
    <input type="text" id="inputLName" placeholder="Lastname">
    <label class="label" for="inputLName">Lastname</label>
</div>


-1

これは最新のブラウザで動作するはずです:

input[value]:not([value=""])

value属性を持つすべての入力を選択してから、空でない値を持つ入力を選択します。


10
ただし、これは動的ではありません。として定義された属性を持つ入力要素のみを選択しますvalue=""。ボックスに何かを入力/削除しても、何も変化しません。
アニムソン

-1
input:not([value=""])

空の文字列がない場合にのみ入力を選択するため、これは機能します。


-1
input:not(:invalid){
 border: 1px red solid;
}

// or 

input:not(:focus):not(:invalid){
 border: 1px red solid;
}

1
10の既存の回答がある11年前の質問に回答を追加するときは、回答がどのように、どのように機能するかについての説明を追加し、回答の質問の新しい側面を指摘することが非常に重要です。質問が出されてから変更があったことに依存する場合は、それも指摘します。
Jason Aller
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.