input
フィールドで:after
CSS擬似要素を使用しようとしていますが、うまくいきません。 span
と一緒に使っても、うまくいきます。
<style type="text/css">
.mystyle:after {content:url(smiley.gif);}
.mystyle {color:red;}
</style>
これは動作します(「buu!」の後、「もう少し」の前にスマイリーを置きます)。
<span class="mystyle">buuu!</span>a some more
これは動作しません - それはsomeValueを赤く着色するだけですが、微笑みはありません。
<input class="mystyle" type="text" value="someValue">
何がおかしいのですか?他の擬似セレクタを使うべきですか?
注意:サードパーティのコントロールによって生成されているため、span
をinput
の周囲に追加することはできません。
:after
および:before
は、Internet Explorer 7以降、どの要素でもサポートされていません。
また、 フォーム要素 (入力)や 画像要素 のような置き換えられた要素に使用することも意図していません。
言い換えれば、純粋なCSSでは 不可能 です。
しかし jquery を使えば使えます
$(".mystyle").after("add your smiley here");
あなたのコンテンツにjavascriptを追加する。これはすべてのブラウザで機能します。
:before
および:after
はコンテナ内にレンダリングしますおよび<input>には他の要素を含めることはできません。
疑似要素は、コンテナ要素でのみ定義できます(または、サポートされているとだけ言います)。それらがレンダリングされる方法はwithinであるため、子要素としてのコンテナ自体です。 input
には他の要素を含めることができないため、サポートされていません。一方、フォーム要素でもあるbutton
は、他のサブ要素のコンテナであるため、それらをサポートします。
あなたが私に尋ねると、ブラウザが非コンテナ要素にこれらの2つの擬似要素を表示する場合、それはバグであり、非標準の適合です。仕様は要素の内容について直接話します...
仕様 を注意深く読んだ場合、実際にはそれらが含まれている要素に挿入されているinsideと書かれています:
作成者は、生成されるコンテンツのスタイルと場所を:beforeおよび:after擬似要素で指定します。名前が示すように、:beforeおよび:after擬似要素は、要素のドキュメントツリーコンテンツの前後のコンテンツの場所を指定します。 'content'プロパティは、これらの擬似要素と組み合わせて、挿入されるものを指定します。
見る? 要素のドキュメントツリーcontent。私が理解しているように、これはコンテナ内でを意味します。
奇妙なことに、それはある種の入力で動作します。少なくともChromeでは、
<input type="checkbox" />
と同じようにうまく動作します
<input type="radio" />
それは単にtype=text
と他のいくつかが動かないのです。
:before
および:after
はコンテナ内に適用されます。つまり、終了タグを持つ要素に使用できます。
自己閉鎖要素には適用されません。
ちなみに、自己閉鎖的な要素(img/hr/inputなど)は、それぞれの内容に置き換えられるため、 '置き換えられた要素'とも呼ばれます。より良い用語がないための「外部オブジェクト」もっと読む ここ
これは別のアプローチです (あなたがHTMLのコントロールを持っていると仮定します):入力の直後に空の<span></span>
を追加し、input.mystyle + span:after
を使用してCSSでそれをターゲットにします
.field_with_errors {
display: inline;
color: red;
}
.field_with_errors input+span:after {
content: "*"
}
<div class="field_with_errors">Label:</div>
<div class="field_with_errors">
<input type="text" /><span></span>
</div>
AngularJSでは、このアプローチを使用しています。これは、.ng-invalid
クラスを<input>
フォーム要素とフォームに自動的に追加しますが、<label>
には追加しないためです。
必須フィールドに赤いドットを作成するためにbackground-image
を使用しました。
input[type="text"][required] {
background-image: radial-gradient(red 15%, transparent 16%);
background-size: 1em 1em;
background-position: top right;
background-repeat: no-repeat
}
擬似要素を入力要素に入れることはできませんが、プレースホルダーのようにシャドウ要素を入れることができます。
input[type="text"] {
&::-webkit-input-placeholder {
&:before {
// your code
}
}
}
他のブラウザでも動作させるには、:-moz-placeholder
、::-moz-placeholder
、:-ms-input-placeholder
をそれぞれ異なるセレクタ で使います。ブラウザがセレクタを認識しないと文全体が無効になるため、セレクタをグループ化できません。
_ update _ :上記のコードはCSSプリプロセッサ(SASS、LESS ...)でのみ動作します。プリプロセッサは使用しません。
input[type="text"]::-webkit-input-placeholder:before { // your code }
私は同じ問題を抱えていたので、私はこの記事を見つけた、これは私のために働いた解決策でした。入力値を置き換えるのではなく、単に値を削除して絶対的に同じサイズのスパンを後ろに配置するのとは対照的に、スパンには:before
疑似クラスを任意のアイコンフォントで適用できます。
<style type="text/css">
form {position: relative; }
.mystyle:before {content:url(smiley.gif); width: 30px; height: 30px; position: absolute; }
.mystyle {color:red; width: 30px; height: 30px; z-index: 1; position: absolute; }
</style>
<form>
<input class="mystyle" type="text" value=""><span class="mystyle"></span>
</form>
純粋なCSSの実用的な解決策:
トリックはtext-fieldの後にdom要素があると仮定することです。
/*
* The trick is here:
* this selector says "take the first dom element after
* the input text (+) and set its before content to the
* value (:before).
*/
input#myTextField + *:before {
content: "????";
}
<input id="myTextField" class="mystyle" type="text" value="someValue" />
<!--
There's maybe something after a input-text
Does'nt matter what it is (*), I use it.
-->
<span></span>
(*)限定的な解決策
しかし、ほとんどの場合、私たちは自分のコードを知っているので、このソリューションは効率的で、100%CSSと0%jQueryです。
CSS 2.1仕様の note によると、この仕様は「置換前の要素と置換後の要素(HTMLのIMGなど)との相互作用を完全には定義していません。 input
は実際には置き換えられた要素ではなくなりましたが、基本的な状況は変わっていません。:before
と:after
の影響は未定義であり、通常は効果がありません。
解決策は、この方法で対処しようとしている問題に対する別のアプローチを見つけることです。生成されたコンテンツをテキスト入力コントロールに入れることは非常に誤解を招く可能性があります。ユーザーには、それはコントロールの初期値の一部であるように見えますが、変更することはできません。ただし、フォームデータの一部として送信されることはありません。
次に試してください:
label[for="userName"] {
position: relative;
}
label[for="userName"]::after {
content: '[after]';
width: 22px;
height: 22px;
display: inline-block;
position: absolute;
right: -30px;
}
<label for="userName">
Name:
<input type="text" name="userName" id="userName">
</label>
他の人が説明したように、input
name__sはちょっと置き換えられたvoid要素なので、ほとんどのブラウザでは::before
や::after
疑似要素を生成することはできません。
しかし、CSSワーキンググループは、input
name__に::before
がある場合には、::after
とappearance: none
を明示的に許可することを検討しています。
からhttps://lists.w3.org/Archives/Public/www-style/2016Mar/0190.html 、
SafariとChromeはどちらもフォーム入力に疑似要素を許可します。他のブラウザはそうではありません。これを削除することを検討しましたが、使用カウンタはそれを使用しているページの〜0.07%を記録しています。これは最大削除しきい値の20倍です。
実際に入力に疑似要素を指定するには、入力の内部構造を少なくともある程度指定する必要があります。これはまだできていません(そして*私が*できる*ことができると確信していません)。しかし、Borisは、バグスレッドの1つで、見かけ上それを可能にすることを提案しました。入力なし - 基本的には「ちょっと置き換えられた」要素ではなく単に<div>に変換するだけです。
疑似要素の前または後を使用するには、入力を囲むある種のラッパーが必要です。これは入力のラッパーdivの前にbeforeを持ち、それから入力の前にbeforeを置く - あるいは少なくともそれはそのように見えます。明らかに、これは回避策ですがピンチで効果的であり、敏感に反応するのに役立ちます。他のコンテンツを追加する必要がある場合は、これを簡単に変更することができます。
作業Fiddle
疑似要素としての入力内のドル記号:http://jsfiddle.net/kapunahele/ose4r8uj/1/ -
HTML:
<div class="test">
<input type="text"></input>
</div>
CSS:
input {
margin: 3em;
padding-left: 2em;
padding-top: 1em;
padding-bottom: 1em;
width:20%;
}
.test {
position: relative;
background-color: #dedede;
display: inline;
}
.test:before {
content: '$';
position: absolute;
top: 0;
left: 40px;
z-index: 1;
}
:beforeと:afterを使用して入力要素をスタイルしようとしているのであれば、他のspan、div、さらにはCSSスタック内の要素の影響を模倣しようとしている可能性があります。
Robert Koritnikの答えが指摘するように、:beforeと:afterはcontainer elementsにのみ適用でき、input要素はコンテナではありません。
しかし、HTML 5はコンテナであり、input [type = "submit | reset"]要素のように振る舞うbutton要素を導入しました。
<style>
.happy:after { content:url(smiley.gif); }
</style>
<form>
<!-- won't work -->
<input class="happy" type="submit" value="Submit" />
<!-- works -->
<button class="happy">Submit</button>
</form>
ここでの最大の誤解はbefore
とafter
の意味です。それらは ではなく 要素自体を参照しますが、 content 要素内では参照します。したがって、element:before
はコンテンツの前、element:after
はコンテンツの後にありますが、どちらも元の要素の内側にあります。
input
要素にはCSSビューの内容がないため、:before
または:after
疑似コンテンツはありません。これは、他の多くの無効要素または置き換えられた要素にも当てはまります。
outside 要素を参照する疑似要素はありません。
別の世界では、これらの疑似要素はこの区別をより明確にするために別の名前で呼ばれているかもしれません。そして、誰かが本当に要素の外側にある疑似要素さえ提案したかもしれません。これまでのところ、これはこの宇宙では当てはまりません。
:before
および:after
は最初のノードまたは最後のノードとして新しいノードを挿入するため、子ノードを持つことができるノードに対してのみ機能します。
まとめ
<input type="button">
では機能しませんが、<input type="checkbox">
では正常に機能します。
Fiddle : http://jsfiddle.net/gb2wY/50/
_ html _ :
<p class="submit">
<input id="submit-button" type="submit" value="Post">
<br><br>
<input id="submit-cb" type="checkbox" checked>
</p>
_ css _ :
#submit-button::before,
#submit-cb::before {
content: ' ';
background: transparent;
border: 3px solid crimson;
display: inline-block;
width: 100%;
height: 100%;
padding: 0;
margin: -3px -3px;
}
私はあなたがこれのようにそれをすることができるとわかりました:
.submit .btn input
{
padding:11px 28px 12px 14px;
background:#004990;
border:none;
color:#fff;
}
.submit .btn
{
border:none;
color:#fff;
font-family: 'Open Sans', sans-serif;
font-size:1em;
min-width:96px;
display:inline-block;
position:relative;
}
.submit .btn:after
{
content:">";
width:6px;
height:17px;
position:absolute;
right:36px;
color:#fff;
top:7px;
}
<div class="submit">
<div class="btn">
<input value="Send" type="submit" />
</div>
</div>
パディングと:afterを取るdiv親が必要です。最初の親は相対的である必要があり、2番目のdivは絶対的である必要がありますので、後の位置を設定できます。
あなたはjQueryであなたの親ブロックのafterまたはbefore要素を使うことができます。このような:
$(yourInput).parent().addClass("error-form-field");