CSSを介して入力にテキストがあるかどうかを検出する方法はありますか?私は:empty
疑似クラスを使ってみました、そして私は[value=""]
を使ってみました、どちらもうまくいきませんでした。これに対する単一の解決策を見つけることができないようです。
私たちは:checked
と:indeterminate
のための疑似クラスを持っていることを考えれば、これは可能でなければならないと思います。
注意してください:私はこれを "スタイリッシュな"スタイルのためにやっています、JavaScriptを利用することはできません。
また、ユーザーが制御できないページでは、スタイリッシュがクライアント側で使用されます。
CSSができないのでスタイリッシュはできません。 CSSには<input>
の値に対する(疑似)セレクタはありません。参照:
:empty
セレクターは子ノードのみを参照し、入力値は参照しません。[value=""]
は動作します。ただし、初期状態のみです。これは、(CSSが認識する)ノードのvalue
属性が、ノードのvalue
プロパティと同じではないためです(ユーザーまたはDOM javascriptによって変更されます)およびフォームデータとして送信されます。
あなたが初期状態だけを気にしない限り、あなたはユーザスクリプトかGreasemonkeyスクリプトを使わなければならない幸い、これは難しいことではありません。次のスクリプトは、Chrome、GreasemonkeyまたはScriptishがインストールされたFirefox、またはユーザースクリプトをサポートするブラウザ(IE以外のほとんどのブラウザ)で動作します。
このjsBinページ にあるCSSの制限とJavaScriptソリューションのデモを参照してください。
// ==UserScript==
// @name _Dynamically style inputs based on whether they are blank.
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
introduced in GM 1.0. It restores the sandbox.
*/
var inpsToMonitor = document.querySelectorAll (
"form[name='JustCSS'] input[name^='inp']"
);
for (var J = inpsToMonitor.length - 1; J >= 0; --J) {
inpsToMonitor[J].addEventListener ("change", adjustStyling, false);
inpsToMonitor[J].addEventListener ("keyup", adjustStyling, false);
inpsToMonitor[J].addEventListener ("focus", adjustStyling, false);
inpsToMonitor[J].addEventListener ("blur", adjustStyling, false);
inpsToMonitor[J].addEventListener ("mousedown", adjustStyling, false);
//-- Initial update. note that IE support is NOT needed.
var evt = document.createEvent ("HTMLEvents");
evt.initEvent ("change", false, true);
inpsToMonitor[J].dispatchEvent (evt);
}
function adjustStyling (zEvent) {
var inpVal = zEvent.target.value;
if (inpVal && inpVal.replace (/^\s+|\s+$/g, "") )
zEvent.target.style.background = "Lime";
else
zEvent.target.style.background = "inherit";
}
通常のCSSの注意点と、HTMLコードを変更できる場合は可能です。要素にrequired
属性を追加すると、コントロールの値が空かどうかに応じて、要素は:invalid
または:valid
と一致します。要素にvalue
属性がない(またはvalue=""
がある)場合、コントロールの値は最初は空になり、任意の文字(スペースを含む)が入力されると空になりません。
例:
<style>
#foo { background: yellow; }
#foo:valid { outline: solid blue 2px; }
#foo:invalid { outline: solid red 2px; }
</style>
<input id=foo required>
疑似クラスの :valid
と :invalid
はWorking DraftレベルのCSS文書でのみ定義されていますが、IEではIE 10。
「空」にスペースのみで構成される値を含めたい場合は、属性pattern=.*\S.*
を追加できます。
入力コントロールに空でない値があるかどうかを直接検出するためのCSSセレクターは(現在)ありません。そのため、上記のように間接的に行う必要があります。
一般に、CSSセレクターは、ユーザーアクションではなく、マークアップ、または場合によってはスクリプトで設定された要素プロパティ(クライアント側のJavaScript)を参照します。たとえば、:empty
は、マークアップ内の空のコンテンツを持つ要素と一致します。この意味で、すべてのinput
要素は避けられないほど空です。セレクタ[value=""]
は、要素がマークアップにvalue
属性を持ち、値として空の文字列を持つかどうかをテストします。そして:checked
と:indeterminate
は似たようなものです。実際のユーザー入力による影響は受けません。
:placeholder-shown
疑似クラスを使用できます。技術的にはプレースホルダーが必要ですが、代わりにスペースを使用することができます。
input:not(:placeholder-shown) {
border-color: green;
}
input:placeholder-shown {
border-color: red;
}
<input placeholder="Text is required" />
<input placeholder=" " value="This one is valid" />
<input placeholder=" " />
<input onkeyup="this.setAttribute('value', this.value);" />
そして
input[value=""]
働くでしょう :-)
基本的にみんなが探しているのは、
もっと少なく:
input:focus:required{
&:invalid{ color: red; border-color: red; box-shadow: 0 0 6px red;}
&:valid,
&:placeholder-shown{ border-color: green; box-shadow: 0 0 8px green;}
}
純粋なCSS:
input:focus:required:invalid{ color: red; border-color: red; box-shadow: 0 0 6px red;}
input:focus:required:valid,
input:focus:required:placeholder-shown{ border-color: green; box-shadow: 0 0 8px green;}
シンプルなCSS:
input[value]:not([value=""])
このコードは、入力がいっぱいになった場合に、指定されたCSSを適用します。
placeholder
フィールドなしで上記のようにrequired
トリックを使用できます。
required
の問題は、あなたが何かを書いてそれを削除したとき - 入力はHTML5仕様の一部として常に赤になる - それを修正/上書きするためには上記のCSSが必要になることです。
required
を使わずに簡単なことができます
<input type="text" placeholder="filter here" id="mytest" />
CSS
#mytest:placeholder-shown {
/* if placeholder is shown - meaning - no value in input */
border: black 1px solid;
color: black;
}
#mytest {
/* placeholder isn't shown - we have a value in input */
border: red 1px solid;
color: red;
}
JSとCSSを使う:擬似クラスではない
input {
font-size: 13px;
padding: 5px;
width: 100px;
}
input[value=""] {
border: 2px solid #fa0000;
}
input:not([value=""]) {
border: 2px solid #fafa00;
}
<input type="text" onkeyup="this.setAttribute('value', this.value);" value="" />
入力にテキストが含まれているかどうかに応じて、プレースホルダをスタイルすることでinput[type=text]
を異なるスタイルにすることができます。これは現時点では公式の標準ではありませんが、さまざまな接頭辞がありますが、幅広いブラウザをサポートしています。
input[type=text] {
color: red;
}
input[type=text]:-moz-placeholder {
color: green;
}
input[type=text]::-moz-placeholder {
color: green;
}
input[type=text]:-ms-input-placeholder {
color: green;
}
input[type=text]::-webkit-input-placeholder {
color: green;
}
有効なセレクタ がうまくいくでしょう。
<input type="text" class="myText" required="required" />
.myText {
//default style of input
}
.myText:valid {
//style when input has text
}
はい!あなたは値セレクターを持つ単純な基本的な属性でそれをすることができます。
空白の値を持つ属性セレクタを使用してプロパティを適用する
input[value='']
input[value=''] {
background: red;
}
このようにHTML部分でそれをします:
<input type="text" name="Example" placeholder="Example" required/>
Requiredパラメータは、有効にするために入力フィールドにテキストを含めることを要求します。
JQueryとCSSを使った簡単なトリック
JQuery:
$('input[value=""]').addClass('empty');
$('input').keyup(function(){
if( $(this).val() == ""){
$(this).addClass("empty");
}else{
$(this).removeClass("empty");
}
});
CSS:
input.empty:valid{
box-shadow: none;
background-image: none;
border: 1px solid #000;
}
input:invalid,
input:required {
box-shadow: 3px 1px 5px rgba(200, 0, 0, 0.85);
border: 1px solid rgb(200,0,0);
}
input:valid{
box-shadow: none;
border: 1px solid #0f0;
}