CSSを使用して入力にテキストが含まれているかどうかを検出します—私がアクセスしているページで、制御していないのですか?


187

CSSを介して入力にテキストがあるかどうかを検出する方法はありますか?私は:empty疑似クラスを使用しようとしましたが[value=""]、どちらも機能しませんでした。これに対する単一の解決策を見つけることができないようです。

私は、我々が擬似クラスを持って考えると、これが可能でなければならない想像し:checked、そして:indeterminate種類同じようなことをしているどちらも、。

注:これは、 JavaScriptを利用できない「スタイリッシュ」スタイルのために行っています。

また、Stylishは、クライアント側で、ユーザーが制御しないページで使用されることに注意してください。


CSSでそれを実行する方法がわかりません(とにかくオンザフライで更新されません)。ただし、これはJavaScriptを使用すると簡単です。
ralph.m 2013

JavaScriptは使えないと思います。私は「スタイリッシュな」スタイルに取り組んでいます。CSSで完全に実行する必要があることを確認してください。ユーザーがテキストを入力しても更新されない場合、これは時間の無駄のようなものだと思います。それについて考えていませんでした。うーん。少なくともこれはスタイルにとって重要ではありません。それは私が追加したいと思っていた素晴らしいものにすぎません。
JacobTheDev 2013

回答:


66

CSSがこれを実行できないため、Stylishはこれを実行できません。 CSSには<input>値の(疑似)セレクターがありません。見る:

:emptyセレクタは、唯一の子ノードではなく、入力値を指します。
[value=""] 動作します。ただし、初期状態のみ。これは、ノードのvalue 属性(CSSが認識する)がノードの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";
}

そのuserscriptのことを調べます。ありがとう。
JacobTheDev 2013

@ MartinGottweis、OPの場合ではありません。これは[スタイリッシュな]質問です。
Brock Adams、

1
@ BrockAdams、opはjavascriptを使用できないと言っているので、:validオプションを使用する方法です。私は何かを逃していますか?
Martin Gottweis、2016年

1
@MartinGottweis、:validオプションではページを書き換える必要があります-これはOPがStylishで行うことができないものであり、他の回答はブラウジングコンテキストではまったく表示さません。ユーザーは、アクセスしているページを制御できません。
ブロックアダムス

265

通常の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のみワーキングドラフトレベルのCSS文書で定義されていますが、サポートはIEのことを除いて、ブラウザではかなり普及しているが、それはIE 10に付属しています。

「空」にスペースのみで構成される値を含める場合は、属性を追加できますpattern=.*\S.*

入力コントロールに空でない値があるかどうかを直接検出するためのCSSセレクターは(現在のところ)存在しないため、上記のように間接的に行う必要があります。

一般に、CSSセレクターは、ユーザーアクションではなく、スクリプト(クライアント側JavaScript)で設定された要素のプロパティをマークアップまたは場合によっては参照します。たとえば:empty、マークアップ内の空のコンテンツを持つ要素に一致します。inputこの意味で、すべての要素は不可避です。セレクター[value=""]は、要素valueにマークアップの属性があり、値として空の文字列があるかどうかをテストします。そして:checked:indeterminate似たようなものです。実際のユーザー入力による影響は受けません。


7
すべての入力が必要な場合にのみ、これは優れたソリューションです。必要でない場合は、無効なスタイルの影響を受けない空の有効な入力フィールドがある状況に遭遇します。JSはおそらくこのソリューションの勝者でしょう
AdamSchuldは

7
これは汚いですが驚くほど賢いです。質問に対する解決策ではありませんが、確かに私にとってはうまくいきました
Jan

1
汚れたソリューション。これに基づいてラベル表示ロジックを追加しようとした場合、または入力が実際に必要なく、フォームがこれに基づいた検証を持っている場合、これによりChromeのオートコンプリートで問題が発生する可能性があることに注意してください
Artjom Kurapov

1
意味的にこれは間違っています。前のコメントで述べたように、一部の入力はオプションである可能性があり、このrequired属性はフォームの送信を防ぐことができます。
zhenming

1
要素にnovalidate属性を追加して<form>、フィールドが1回入力された後にフィールドが空になっても赤い表示が発生する心配がないように:<form ... novalidate> <input ... required /> </form>
Alcalyn

228

: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=" " />


10
残念ながら、これはIEやFirefoxではまったくサポートされていません。出典:caniuse.com/#feat=css-placeholder-shown
Sean Dawson

2
素晴らしい答え。ブラウザのサポートは悪いですが、ポリフィルが出てきた場合:placeholder-shown、これは受け入れられる答えになるはずです。このrequired方法では、周辺のケースは考慮されません。スペースをプレースホルダーに渡すことができ、このメソッドは引き続き機能することに注意してください。称賛。
corysimmons 2016

5
これのもう1つの欠点は、実際にプレースホルダーを用意する必要があるように見えることです。つまり、値がなくてもinput:not(:placeholder-shown)常に一致し<input/>ます。
redbmk 2016年

5
私にとっては、Chrome、Firefox、Safariで動作します。IE11にはありません。
J0ANMM 2017

1
@redbmkとcorysimmonsが述べたように、プレースホルダーにスペースを渡すことができ、このメソッドは引き続き機能することに注意してください。
Naeem Baghi

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

そして

input[value=""]

動作します :-)

編集:http : //jsfiddle.net/XwZR2/


24
それはCSSですか?それはHTMLとJavascriptのように見えます(しかし、私は間違っている可能性があります)。
jww 2014年

Brook Adamsは次のように書いています:[value = ""]は機能します。ただし、初期状態のみ。これは、ノードの値属性(CSSが認識する)がノードの値プロパティと同じではないためです(ユーザーまたはDOM JavaScriptによって変更され、フォームデータとして送信されます)。->マジックは、変更時に値属性を更新することです:jsfiddle.net/XwZR2
Tom D.

2
@JánosWeiszいいえ、ありません。このハンドラーは、スクリプトがその要素を操作する前に設定され、addEventListenerで追加されたハンドラーに沿って動作します。
ディノボフ2015年

1
明らかに、onkeyupはキーボード入力のみを処理します。ただし、マウスを使用してテキストを入力ボックスに貼り付けることができることを忘れないでください。試してみましょう:テキストをクリップボードにコピーし、入力を右クリックして[貼り付け]をクリックします。CSSが機能していないことに注意してください。マウスでテキストを入力ボックスにドラッグアンドドロップするのと同じです。
beluga

4
input[value]:not([value=""])- 優れている。ありがとうございます。codepen.io/iegik/pen/ObZpqo
iegik 16

30

基本的に誰もが探しているのは:

もっと少なく:

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;}

1
あなたは明らかに実用的なソリューションを使用しただけで、投票数WaTが0ですか?
ProNOOB 2017

5
素晴らしい答え。ただし、:placeholder-shown疑似クラスはIEまたはEdgeでは機能しないため、完全なソリューションではありません。けれどもそれは間近に控えめで、それをサポートしないためにEdgeを殺したくなります。IE私は受け入れることができますが、エッジ?おいおいマイクロソフト!
アーロンマーティンコルビー

2
"required"をhtmlに追加する必要がある場合、それは純粋なcssソリューションではありません
user1566694

ありがとうございます。私の意見では、これはほとんどの人が本当に望んでいることなので、これが高くなることを心から願っています。
sivi911

19

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;
}

コードペン:https : //codepen.io/arlevi/pen/LBgXjZ


1
このアプローチは、私のユースケースにぴったりでした。とにかくプレースホルダーを持つ検索フィルターがあり、値が存在するときに入力ボックスの境界線を強調表示したいのですが。
Stephen Tuttlebee

9

単純なcss:

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

このコードは、入力がいっぱいの場合、ページの読み込み時に指定されたcssを適用します。


9
これはページの読み込み時にのみ機能します。値を動的に入力しない。
ベンラシコット

この回答では、ページ読み込みの問題を明示的に指摘する必要があります。
ブライススナイダー

6

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;
}

例:http : //fiddlesalad.com/scss/input-placeholder-css


ちなみに、これは確実にプレースホルダーをフォーマットしますが、プレースホルダー自体のみです。これにより、テキストの色が変わったように見えますが、それはすでに当てはまります。デフォルトでは、グレーと黒だけです。
John Weisz

CSSはすべて安価な幻想であり、実際のコンテンツに影響を与えずに外観を変更するだけです:-)
vbraun

これはまさに私が必要としたものです。プレースホルダーのデザインが入力スタイルと異なるため、テキストにテキストがある場合、スタイルを変更するために入力を要求しました。パーフェクト!
クリストファーマーシャル

これは背景では機能しますが、境界では機能しません。私は国境を変えるために深く掘り下げなかった。
majinnaibu

5

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

   



3

プレースホルダーを利用して以下を使用できます。

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

1

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;
    }

1

次のようにHTML部分で実行します。

<input type="text" name="Example" placeholder="Example" required/>

必須パラメーターを有効にするには、入力フィールドにテキストが必要です。


これは、CSSを使用して入力にテキストが含まれているかどうかを検出するのに役立ちません。これは問題でした。
Jukka K. Korpela 2013

申し訳ありませんが、実際に役立ちます...私の回答で説明されているように、疑似クラスを使用することができます。
Jukka K. Korpela 2013

1
これはスタイリッシュな質問です。つまり、OPはターゲットページを制御または変更できません。彼はクライアント側のみを表示します。
ブロックアダムス

3
これは非常に役に立ちました、Xedretが話していることの例です:codepen.io/tolmark12/pen/LsBvf
tolmark

****** <input required> && input:valid {...} ******
FremyCompany

0

はい!値セレクターを持つ単純な基本属性でそれを行うことができます。

空白の値で属性セレクターを使用してプロパティを適用する input[value='']

input[value=''] {
    background: red;
}

-6

これはcssでは不可能です。これを実装するには、JavaScript(例:)を使用する必要があります$("#input").val() == ""


2
私はそれを行う方法を知っています。CSSでそれを行う必要があります。元の投稿のコメントを読んでください。私の知る限り、JavaScriptを利用できない「スタイリッシュ」なスタイルを構築しています。
JacobTheDev 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.