CSSを使用して空の入力ボックスを照合する


141

空の入力ボックスにスタイルを適用するにはどうすればよいですか?ユーザーが入力フィールドに何かを入力すると、スタイルは適用されなくなります。これはCSSで可能ですか?私はこれを試しました:

input[value=""]

回答:


159

唯一のフィールドである場合はrequiredあなたが行くことができますinput:valid

#foo-thing:valid + .msg { visibility: visible!important; }      
 <input type="text" id="foo-thing" required="required">
 <span class="msg" style="visibility: hidden;">Yay not empty</span>

参照してくださいjsFiddleでライブ

または使用を否定する#foo-thing:invalid(@SamGoodyへのクレジット)



6
同じものが欲しいのですが、私のフィールドは必須ではありません。そうする方法はありますか?
Zahidul Islam Ruhel 2017年

1
それは素晴らしいです:)
kriskodzi

@ZahidulIslamRuhelもちろん、この回答はトップになりません。以下の答えを参照stackoverflow.com/a/35593489/11293716を
sijanec

150

最近のブラウザーでは:placeholder-shown、空の入力をターゲットにするために使用できます(と混同しないでください::placeholder)。

input:placeholder-shown {
    border: 1px solid red; /* Red border only if the input is empty */
}

詳細とブラウザのサポート:https : //css-tricks.com/almanac/selectors/p/placeholder-shown/


4
すばらしい!非常に役立つ:)
16

1
@TricksfortheWeb inputタグにプレースホルダー属性(値付き)が存在する必要があるようです。Chromeでテスト済み-これがすべてのブラウザに当てはまるかどうかは不明です。
Berend

9
プレースホルダー属性を設定する必要があります。とにかく、プレースホルダー属性を空白として設定できます。
Barcelonczyk

2
@Amanpreetによればcaniuse.com/#search=placeholder IE 11のいずれか(またはエッジ)で、このないであろう作品。
Tim Malone

4
Microsoftブラウザーではまったくサポートされていません:caniuse.com/#feat=css-placeholder-shown
Lounge9

44

これを行うセレクターはCSSにはありません。属性セレクターは、計算値ではなく属性値と一致します。

JavaScriptを使用する必要があります。


3
後でこの答えを見つけた人のために:計算された値に関してQuentinは正しいですが、ここで使用できる:emptyセレクターがあり、合理的なサポートがあります(IE8以前を除くすべてのブラウザー:w3schools.com/cssref/sel_empty.asp
コーエン

35
:empty開口部との間に空になる終了タグを有する要素、及び常に空考え単一のタグ要素にのみ意味空要素にセレクタだけ仕事、例えば、それ以外は入力要素に使用することができないので、textarea
am05mhz

7
違います。以下のlukmoの回答を参照してください。必要な属性と:validまたは:invalid疑似セレクターを組み合わせることで、これを実現できます。
voidstate 2015

2
これは、質問されたときの正解でした。必須属性は2011年にChromeとFirefoxでのみ利用可能で、この回答は2010年からのものです。しかし、時代が変わり、これが「最良の」回答ではなくなったため、承認済みのマークを外しました。
シェールド2017

18

フィールドの値を更新してもDOMの値属性は更新されないため、セレクターは実際には空でなくても常にフィールドと一致します。

代わりに、invalid疑似クラスを使用して、次のように目的を達成します。

input:required {
  border: 1px solid green;
}
input:required:invalid {
  border: 1px solid red;
}
<input required type="text" value="">

<input required type="text" value="Value">


15

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

で動作します:

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

ただし、誰かが入力を開始してもスタイルは変わりません(そのためにはJSが必要です)。


1
value属性はフィールド編集後にDOMで変更されないため、信頼できません。ただし、これを気にしない場合の良いトリック-最新のSafari、Chrome、FF、IEで動作します...
2013年

9
前者と一致させるには、を使用できますinput[value=""], input:not([value])
Schism 14

10

サポートレガシーブラウザが必要ない場合は、の組み合わせを使用することができrequiredvalidinvalid

これを使用することの良い点は、validおよびinvalid擬似要素が入力フィールドのtype属性とうまく機能することです。例えば:

input:invalid, textarea:invalid { 
    box-shadow: 0 0 5px #d45252;
    border-color: #b03535
}

input:valid, textarea:valid {
    box-shadow: 0 0 5px #5cd053;
    border-color: #28921f;
}
<input type="email" name="email" placeholder="john_doe@example.com" required />
<input type="url" name="website" placeholder="http://johndoe.com"/>
<input type="text" name="name" placeholder="John Doe" required/>

参考までに、JSFiddleはこちら:http ://jsfiddle.net/0sf6m46j/


7
$('input#edit-keys-1').blur(function(){
    tmpval = $(this).val();
    if(tmpval == '') {
        $(this).addClass('empty');
        $(this).removeClass('not-empty');
    } else {
        $(this).addClass('not-empty');
        $(this).removeClass('empty');
    }
});

jQueryで。クラスを追加し、CSSでスタイルを設定しました。

.empty { background:none; }

6

これは私のために働きました:

HTMLの場合、required属性をinput要素に追加します

<input class="my-input-element" type="text" placeholder="" required />

CSSの場合、:invalidセレクターを使用して空の入力をターゲットにします

input.my-input-element:invalid {

}

ノート:

  • requiredからw3Schools.com:「存在する場合、それは入力フィールドがフォームを送信する前に記入しなければならないことを指定します。」

2

この質問は少し前に尋ねられた可能性がありますが、クライアント側のフォーム検証を探すためにこのトピックに最近着手し、:placeholder-shown サポートが改善されるにつれて、次のことが他の人に役立つと思いました。

使用BerendのこのCSS4擬似クラスを使用してのアイデアを、私は、ユーザーがそれを充填完了後にのみトリガーフォーム検証を作成することができました。

ここにCodePenの宣伝と説明があります:https ://codepen.io/johanmouchet/pen/PKNxKQ


1

IEまたはChromium Edgeより前のバージョンがサポートされていないことに満足している場合(これをプログレッシブ拡張に使用している場合は問題ない可能性があります)、:placeholder-shownBerendが言ったように使用できます。ChromeとSafariの場合、スペースは機能しますが、これを機能させるには実際には空でないプレースホルダーが必要です。

*,
 ::after,
 ::before {
  box-sizing: border-box;
}

label.floating-label {
  display: block;
  position: relative;
  height: 2.2em;
  margin-bottom: 1em;
}

label.floating-label input {
  font-size: 1em;
  height: 2.2em;
  padding-top: 0.7em;
  line-height: 1.5;
  color: #495057;
  background-color: #fff;
  background-clip: padding-box;
  border: 1px solid #ced4da;
  border-radius: 0.25rem;
  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}

label.floating-label input:focus {
  color: #495057;
  background-color: #fff;
  border-color: #80bdff;
  outline: 0;
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}

label.floating-label input+span {
  position: absolute;
  top: 0em;
  left: 0;
  display: block;
  width: 100%;
  font-size: 0.66em;
  line-height: 1.5;
  color: #495057;
  border: 1px solid transparent;
  border-radius: 0.25rem;
  transition: font-size 0.1s ease-in-out, top 0.1s ease-in-out;
}

label.floating-label input:placeholder-shown {
  padding-top: 0;
  font-size: 1em;
}

label.floating-label input:placeholder-shown+span {
  top: 0.3em;
  font-size: 1em;
}
<fieldset>
  <legend>
    Floating labels example (no-JS)
  </legend>
  <label class="floating-label">
    <input type="text" placeholder=" ">
    <span>Username</span>
  </label>
  <label class="floating-label">
    <input type="Password" placeholder=" ">
    <span>Password</span>
  </label>
</fieldset>
<p>
  Inspired by Bootstrap's <a href="https://getbootstrap.com/docs/4.0/examples/floating-labels/">floating labels</a>.
</p>


1

入力にクラス名を追加し、それにCSSルールを適用することは私にとってはうまくいきました:

<input type="text" name="product" class="product" />

<style>
input[value=""].product {
    display: none;
}
</style>

0

空の入力ボックスを取得するための明確な属性がある答えに不思議です。このコードを見てください。

/*empty input*/
input:empty{
    border-color: red;
}
/*input with value*/
input:not(:empty){
    border-color: black;
}

更新

input, select, textarea {
    border-color: @green;
    &:empty {
        border-color: @red;
    }
}

検証で見栄えをよくするための詳細

 input, select, textarea {
    &[aria-invalid="true"] {
        border-color: amber !important;
    }

    &[aria-invalid="false"], &.valid {
        border-color: green !important;
    }
}

7
:empty子を持たない要素にのみ適用されます。入力に子ノードを含めることはできないため、入力は常に赤い境界線で表示されます。また、このコメントを
Zhegan 2015

2
@NasserHadjlooあなたはこれをテストしましたか?を変更しvalueても、子ノードの数は変わりません。
jcuenod 2015

@jcuenod子ノードの数とはどういう意味ですか?
要点がわかり

xml構造では、ノードはネストされています(つまり<parent><child></child></parent>)。あなたが持っているだけで<input></input>あり、あなたが入力するとき、変化するのは<value>内部のノードではなく<input>値の属性です<input value='stuff you type'></input>
jcuenod

2
しかし、それはOPが達成しようとしていることではありません。
jcuenod 2015

0

これは非常に古いスレッドであることに気づきましたが、それ以来状況が少し変わっており、問題を解決するために必要なものの正しい組み合わせを見つけるのに役立ちました。だから私は自分がしたことを共有したいと思いました。

問題は、オプションの入力が満たされた場合に、それが満たされた場合に必要だったのと同じcssを適用するように求めていたことです。cssは、満たされていない場合にもオプションの入力にcssを適用する疑似クラス:validを使用しました。

これは私がそれを修正した方法です。

HTML

<input type="text" required="required">
<input type="text" placeholder="">

CSS

input:required:valid {
    ....
}
input:optional::not(:placeholder-shown){
    ....
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.