jQueryを使用した:: beforeや:: afterなどのCSS疑似要素の選択と操作


943

jQueryを使用して::beforeand ::after(および1つのセミコロンを持つ古いバージョン)などのCSS疑似要素を選択/操作する方法はありますか?

たとえば、私のスタイルシートには次のルールがあります。

.span::after{ content:'foo' }

jQueryを使用して「foo」を「bar」に変更するにはどうすればよいですか?


4
私はあなたのためにうまくいくはずのものを作りました:gist.github.com/yckart/5563717
yckart

1
私が書くつもりのスタックオーバーフローに関するコメントは嫌いです(コメンターがなぜ完全に反対の方法でそれをしないのかと尋ねるところですがスパンか何か。私が何を指しているのか知っていると思います。
zsitro 2016年

1
受け入れられた答えは素晴らしいです。次のポイントのいずれかを達成しようとしている場合でも、答えは機能しません。1. JSによって:beforeのスタイルを変更します。2.:before by JSの内容を変更します。必要に応じて、私の回答を参照してください。
学習者


@Learner今、これらのすべてのtfor答えがあります:stackoverflow.com/a/49618941/8620333
Temani Afif

回答:


695

data属性を使用して疑似要素にコンテンツを渡し、jQueryを使用してそれを操作することもできます。

HTML:

<span>foo</span>

jQueryの場合:

$('span').hover(function(){
    $(this).attr('data-content','bar');
});

CSS:

span:after {
    content: attr(data-content) ' any other text you may want';
}

「他のテキスト」が表示されないようにしたい場合は、これを次のようなseucolegaのソリューションと組み合わせることができます。

HTML:

<span>foo</span>

jQueryの場合:

$('span').hover(function(){
    $(this).addClass('change').attr('data-content','bar');
});

CSS:

span.change:after {
    content: attr(data-content) ' any other text you may want';
}

2
プロパティattrに対してその関数を使用するための仕様にリンクがありcontentますか?私はこれを聞いたことがないことに驚いています...
Kevin Peno '19

95
+1 attr()、残念、私はそれ以外のプロパティでそれを使用することができませんでしたcontentデモ
Maksim Vi。

28
attr()これは、CSS2自体attr()contentプロパティに対してのみ定義されているのに対し、CSS2を超えて実装されているブラウザはまだないためです。
BoltClock

10
属性参照の更新されたリンク:w3.org/TR/css3-values/#attr-notation


477

これは、jQueryが実行できる他のすべてのことを含めて、答えるのは簡単な質問になると思います。残念ながら、問題は技術的な問題に帰着しますcss:afterおよび:beforeルールはDOMの一部ではありません、ため jQueryのDOMメソッドを使用して変更することはできません。

JavaScriptやCSSの回避策を使用してこれらの要素を操作する方法があります。どちらを使用するかは、正確な要件によって異なります。


私は広く「最良の」アプローチと考えられているものから始めます:

1)所定のクラスを追加/削除する

このアプローチでは、CSSに別の:afterまたは:beforeスタイルのクラスをすでに作成しています。この「新しい」クラスを後でスタイルシートに配置して、オーバーライドすることを確認します。

p:before {
    content: "foo";
}
p.special:before {
    content: "bar";
}

次に、jQuery(またはバニラJavaScript)を使用して、このクラスを簡単に追加または削除できます。

$('p').on('click', function() {
    $(this).toggleClass('special');
});

  • 長所: jQueryで簡単に実装できます。複数のスタイルを一度にすばやく変更します。懸念事項の分離を強制します(CSSとJSをHTMLから分離します)
  • 短所: CSSは、コンテンツのため、事前に書き込まれなければならない:beforeか、:after完全に動的ではありません

2)新しいスタイルをドキュメントのスタイルシートに直接追加します

JavaScriptを使用して、スタイル:afterなどの:beforeスタイルをドキュメントスタイルシートに直接追加することができます。jQueryには便利なショートカットはありませんが、幸いJSはそれほど複雑ではありません。

var str = "bar";
document.styleSheets[0].addRule('p.special:before','content: "'+str+'";');

.addRule()そして、関連する.insertRule()メソッド今日かなりサポートされています。

バリエーションとして、jQueryを使用してまったく新しいスタイルシートをドキュメントに追加することもできますが、必要なコードはそれほどきれいではありません。

var str = "bar";
$('<style>p.special:before{content:"'+str+'"}</style>').appendTo('head');

値を追加するだけでなく、値を「操作する」ことについて話している場合は、別のアプローチを使用して既存のスタイル読み取る:after:beforeこともできます

var str = window.getComputedStyle(document.querySelector('p'), ':before') 
           .getPropertyValue('content');

jQueryを使用document.querySelector('p')する$('p')[0]場合は、少し短いコードで置き換えることができます。

  • 長所:任意の文字列をスタイルに動的に挿入できます
  • 短所:元のスタイルは変更されず、オーバーライドされるだけです。繰り返し(ab)使用すると、DOMが任意に大きくなる可能性があります

3)別のDOM属性を変更する

CSSで使用attr()して、特定のDOM属性を読み取ることもできます。(ブラウザがをサポートしている場合は:before、それもサポートattr()します。)これをcontent:いくつかの慎重に準備されたCSSで組み合わせることにより、およびのコンテンツを動的に変更できます(マージンや色などの他のプロパティは変更できません)。:before:after

p:before {
    content: attr(data-before);
    color: red;
    cursor: pointer;
}

JS:

$('p').on('click', function () {
    $(this).attr('data-before','bar');
});

CSSを事前に準備できない場合は、これを2番目の手法と組み合わせることができます。

var str = "bar";

document.styleSheets[0].addRule('p:before', 'content: attr(data-before);');

$('p').on('click', function () {
    $(this).attr('data-before', str);
});

  • 長所:無限の余分なスタイルを作成しない
  • 短所: attr CSSでは、URLやRGBカラーではなく、コンテンツ文字列にのみ適用できます

2
私はグリセコン値を動的に(つまり、16進値を介して)::後のpsedoに設定しようとしています。content:要素(例:content: "\ e043";)。それは私にはうまくいかないようですので、グリフィコンの16進値でもうまくいかないと思いますか?
user2101068

@ user2101068新しい質問として投稿してください。あなたが使用しているすべてのコードを確認する必要があります。
Blazemonger 2015年

Blazemonger、迅速な返信に感謝します。残念ながら、かなりのコードがあり、関連するコードを取り除くにはかなりの労力が必要です。私はすでにこの作業を行うために12時間以上費やしており、これが動作させるための最後のあえぎ努力でした。損失を減らす必要があります。上記の#3で説明した手法(コードスニペットの前)を使用するときに、私の仮定re:16進値を確認できることを願っています。16進文字列をコンテンツ要素に挿入できますが、実際のグリフィコンではなくグリフィコン16進値のテキストが表示されます。すべてのコードを見ずに印象?
user2101068

1
@ user2101068 16進文字列を使用しないでください。代わりに、実際のUnicode文字をコピーしてHTML属性に貼り付けます。jsfiddle.net/mblase75/Lcsjkc5y
Blazemonger

ソリューション2と3に関して:document.styleSheets [0] .insertRule(rule、index)を使用すると、スタイルシートが(過剰に)成長するのを防ぐことができます。このインデックスを使用すると、不要な場合にルールを削除できます:document。 styleSheets [0] .deleteRule(index)
Picard

158

それらは他の実際のDOM要素と同じようにCSSを介してブラウザーによってレンダリングされますが、疑似要素自体はDOMの一部ではありません。名前が示すように、疑似要素は実際の要素ではないため、選択してjQueryを使ってそれらを直接操作する(または任意のそのことについてはJavaScriptのAPIはなく、さらにセレクターAPI)。これは、およびだけ::beforeでなく、スクリプトでスタイルを変更しようとしているすべての疑似要素に適用されます::after

CSSOM(think window.getComputedStyle())を介して実行時に疑似要素のスタイルに直接アクセスできるのは.css()、疑似要素をサポートしないメソッドであるjQuery beyondによって公開されていないためです。

ただし、他の方法でいつでも見つけることができます。たとえば、次のようにします。

  • 1つまたは複数の任意のクラスの疑似要素にスタイルを適用し、クラス間で切り替えます(簡単な例については、seucolegaの回答を参照してください)—これは、(疑似要素ではない)単純なセレクターを使用する慣用的な方法です。要素と要素の状態、それらが使用されることを意図した方法を区別する

  • ドキュメントのスタイルシートを変更することにより、疑似要素に適用されているスタイルを操作します。


78

擬似要素はDOMの一部ではないため、jQueryで擬似要素を選択することはできません。しかし、特定のクラスを親要素に追加して、CSSでその擬似要素を制御できます。

jQueryの場合:

<script type="text/javascript">
    $('span').addClass('change');
</script>

CSS:

span.change:after { content: 'bar' }

48

擬似要素を操作するために、カスタムプロパティ(別名CSS変数)を利用することもできます。仕様では次のことが読み取れます。

カスタムプロパティは通常のプロパティであるため、任意の要素で宣言でき、通常の継承カスケード ルールで解決でき、@ mediaやその他の条件付きルールで条件付きにでき、HTMLのスタイル属性で使用でき、読み取りまたは設定できますCSSOMの使用など

これを考慮して、アイデアは要素内でカスタムプロパティを定義することであり、疑似要素は単にそれを継承します。したがって、簡単に変更できます。

1)インラインスタイルの使用

.box:before {
  content:var(--content,"I am a before element");
  color:var(--color, red);
  font-size:25px;
}
<div class="box"></div>
<div class="box" style="--color:blue;--content:'I am a blue element'"></div>
<div class="box" style="--color:black"></div>
<div class="box" style="--color:#f0f;--content:'another element'"></div>

2)CSSとクラスの使用

.box:before {
  content:var(--content,"I am a before element");
  color:var(--color, red);
  font-size:25px;
}

.blue {
  --color:blue;
  --content:'I am a blue element';
}
.black {
  --color:black;
}
<div class="box"></div>
<div class="box black" ></div>
<div class="box blue"></div>

3)JavaScriptの使用

document.querySelectorAll('.box')[0].style.setProperty("--color", "blue");
document.querySelectorAll('.box')[1].style.setProperty("--content", "'I am another element'");
.box:before {
  content:var(--content,"I am a before element");
  color:var(--color, red);
  font-size:25px;
}
<div class="box"></div>
<div class="box"></div>

4)jQueryの使用

$('.box').eq(0).css("--color", "blue");
/* the css() function with custom properties works only with a jQuery vesion >= 3.x
   with older version we can use style attribute to set the value. Simply pay
   attention if you already have inline style defined! 
*/
$('.box').eq(1).attr("style","--color:#f0f");
.box:before {
  content:"I am a before element";
  color:var(--color, red);
  font-size:25px;
}
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>


複雑な値でも使用できます。

.box {
  --c:"content";
  --b:linear-gradient(red,blue);
  --s:20px;
  --p:0 15px;
}

.box:before {
  content: var(--c);
  background:var(--b);
  color:#fff;
  font-size: calc(2 * var(--s) + 5px);
  padding:var(--p);
}
<div class="box"></div>

var(--c,value)ここvalueで、はデフォルト値であり、フォールバック値とも呼ばれる構文を検討しています。

同じ仕様から、次のように読むことができます。

カスタムプロパティの値は、var()関数を使用して別のプロパティの値に置き換えることができます。var()の構文は次のとおりです。

var() = var( <custom-property-name> [, <declaration-value> ]? )

関数の最初の引数は、置換されるカスタムプロパティの名前です。関数の2番目の引数が指定されている場合、それはフォールバック値であり、参照されるカスタムプロパティが無効な場合に代替値として使用されます。

以降:

プロパティの値をvar()に置き換えるには:

  1. var()関数の最初の引数で指定されたカスタムプロパティがアニメーションで汚染var()されていて、アニメーションプロパティまたはその片手で関数が使用されている場合、カスタムプロパティをこのアルゴリズムの残りの部分の初期値として扱う。
  2. var()関数の最初の引数で指定されたカスタムプロパティの値が初期値以外var()の場合は、対応するカスタムプロパティの値で関数を置き換えます。
  3. それ以外の場合、var()関数の2番目の引数としてフォールバック値がある場合は、関数をフォールバック値に置き換えvar()ます。ある場合var()フォールバックに参照、それらも置き換えます。
  4. それ以外の場合、var()関数を含むプロパティは計算値の時点では無効です。

カスタムプロパティを設定しない場合、initialまたはそれをORに設定する場合、または無効な値を含む場合は、フォールバック値が使用されます。の使用はinitial、カスタムプロパティをデフォルト値にリセットする場合に役立ちます。

関連した

CSSカスタムプロパティ(別名CSS変数)内に継承値を格納する方法は?

ボックスモデルのCSSカスタムプロパティ(変数)


CSS変数は、関連性があると考えるすべてのブラウザー(IE 11など)で使用できない場合があることに注意してください:https : //caniuse.com/#feat=css-variables


@akalataはい、コードにはjQueryバージョン3.xが必要です.. jQueryを使用して詳細と別の代替手段を追加しました;)
Temani Afif

これはIE 11でどのように機能しますか?
connexo 2018

1
@connexoは、優れた最新の機能と同様に、サポートされておらず、機能しませんcaniuse.com/#feat=css-variables
Temani Afif

多くの場合、私はそれを知っていて、IE 11はまだ非常に関連性があるため、回答の導入部分でその情報を逃しました。
connexo 2018

1
この回答は、CSS変数を使用してJavaScriptで疑似要素を関連付け、変更する詳細なチュートリアルです。時間を割いていただき、この非常に貴重な手法を共有していただき、誠にありがとうございます。
LebCit

37

クリスチャンが示唆していることのように、次のこともできます。

$('head').append("<style>.span::after{ content:'bar' }</style>");

2
ここにid属性を追加して、新しい要素を追加する前に要素を選択して削除できるようにする必要があります。そうでなければ、多くの不必要なスタイルノードが出てくる可能性があります。
KS

24

CSSで定義された:afterおよび:beforeスタイルプロパティにアクセスする方法は次のとおりです。

// Get the color value of .element:before
var color = window.getComputedStyle(
    document.querySelector('.element'), ':before'
).getPropertyValue('color');

// Get the content value of .element:before
var content = window.getComputedStyle(
    document.querySelector('.element'), ':before'
).getPropertyValue('content');

11

CSSを通じて完全に:: beforeまたは:: after sudo要素を操作する場合は、JSを使用できます。下記参照;

jQuery('head').append('<style id="mystyle" type="text/css"> /* your styles here */ </style>');

どのように <style>要素にIDがあることにください。IDを使用すると、スタイルを動的に変更した場合に、それを削除して再度追加できます。

このように、JSの助けを借りて、CSSを介して要素のスタイルを正確に設定します。


6

機能しているがあまり効率的ではない方法の1つは、新しいコンテンツを含むドキュメントにルールを追加し、それをクラスで参照することです。必要なものに応じて、クラスはコンテンツの各値に一意のIDを必要とする場合があります。

$("<style type='text/css'>span.id-after:after{content:bar;}</style>").appendTo($("head"));
$('span').addClass('id-after');

5

HTMLは次のとおりです。

<div class="icon">
  <span class="play">
    ::before
  </span>
</div>

以前の計算スタイルは content: "VERIFY TO WATCH";

次の2行のjQueryは、特別なクラスを追加してこの要素を具体的に参照し、スタイルタグ(!importantタグ付き)を追加して、sudo要素のコンテンツ値のCSSを変更するというアイデアを使用しています。

$("span.play:eq(0)").addClass('G');

$('body').append("<style>.G:before{content:'NewText' !important}</style>");


5

皆さん、ありがとうございました!私は何とかやりたかった:D http://jsfiddle.net/Tfc9j/42/ ここを見てください

外側のdivの不透明度を内部のdivの不透明度とは異なるものにしたかったので、クリックするとソフトウェアの場所が変わります;)ありがとうございます。

   $('#ena').on('click', function () {
        $('head').append("<style>#ena:before { opacity:0.3; }</style>");
    });

$('#duop').on('click', function (e) {

        $('head').append("<style>#ena:before { opacity:0.8; }</style>");

     e.stopPropagation(); 
    });

#ena{
    width:300px;
    height:300px;
    border:1px black solid;
    position:relative;
}
#duo{
    opacity:1;
    position:absolute;
    top:50px;
  width:300px;
    height:100px;
      background-color:white;
}
#ena:before {
    content: attr(data-before);
    color: white;
    cursor: pointer;
    position: absolute;
    background-color:red;
    opacity:0.9;
    width:100%;
    height:100%;
}


<div id="ena">
    <div id="duo">
        <p>ena p</p>
        <p id="duop">duoyyyyyyyyyyyyyy p</p>

    </div>   


</div>

試さないでくださいappend。使用htmlは最善の予防策です
KingRider

1
注意:ここでは、これらのクリックのいずれかが処理されるたびにスタイルタグをヘッドに追加しています。新しいものを追加する前に古いものを削除する方法をコーディングします。
プピトリス

3

偽のプロパティを作成するか、既存のプロパティを使用して、疑似要素のスタイルシートに継承することができます。

var switched = false;

// Enable color switching
setInterval(function () {
    var color = switched ? 'red' : 'darkred';
    var element = document.getElementById('arrow');
    element.style.backgroundColor = color;
    
    // Managing pseudo-element's css
    // using inheritance.
    element.style.borderLeftColor = color;
    
    switched = !switched;
}, 1000);
.arrow {
    /* SET FICTIONAL PROPERTY */
    border-left-color:red;
    
    background-color:red;
    width:1em;
    height:1em;
    display:inline-block;
    position:relative;
}
.arrow:after {
    border-top:1em solid transparent;
    border-right:1em solid transparent;
    border-bottom:1em solid transparent;
    border-left:1em solid transparent;
    
    /* INHERIT PROPERTY */
    border-left-color:inherit;
    
    content:"";
    width:0;
    height:0;
    position:absolute;
    left:100%;
    top:-50%;
}
<span id="arrow" class="arrow"></span>

「コンテンツ」プロパティでは機能しないようです:(


3

これは実際に使用できるように記述していないため、実用的ではありません。達成できることの例を示すためです。

css = {
before: function(elem,attr){ 

if($("#cust_style") !== undefined){ 
$("body").append("<style> " + elem + ":before {"  + attr +  "} </style>"); 
} else {
 $("#cust_style").remove();
$("body").append("<style> " + elem + ":before {"  + attr +  "} </style>"); 
}

}, after: function(elem,attr){
if($("#cust_style") !== undefined){ 
$("body").append("<style> " + elem + ":after {"  + attr +  "} </style>"); 

} else { $("#cust_style").remove();
$("body").append("<style> " + elem + ":after {"  + attr +  "} </style>"); 
}
}
}

現在、これは/を追加するか、必要な属性を含むStyle要素を追加します。これは、ターゲット要素の後のPseudo要素に影響します。

これは次のように使用できます

css.after("someElement"," content: 'Test'; position: 'absolute'; ") // editing / adding styles to :after

そして

css.before( ... ); // to affect the before pseudo element.

後:および前:DOMを介して疑似要素に直接アクセスすることはできません。現在のところ、CSSの特定の値を自由に編集することはできません。

私の方法は単なる例であり、実践には適していません。独自のトリックをいくつか試して、実際の使用に合わせて修正することができます。

だから、これや他の人とあなた自身の実験をしてください!

よろしく-Adarsh Hegde。


3

このようなutils関数を常に追加しています。

function setPseudoElContent(selector, value) {    
    document.styleSheets[0].addRule(selector, 'content: "' + value + '";');
}

setPseudoElContent('.class::after', 'Hello World!');

またはES6の機能を利用する:

const setPseudoElContent = (selector, value) => {    
    document.styleSheets[0].addRule(selector, `content: "${value}";`);
}

setPseudoElContent('.class::after', 'Hello World!');

2

style頭にを追加できるだけなのに、クラスや属性を追加する理由

$('head').append('<style>.span:after{ content:'changed content' }</style>')

2

ここには多くの答えがありますが、受け入れられたものでさえ、:beforeまたはのCSSを操作するのに役立つ答えは:afterありません。

ここに私がそれをすることを提案する方法があります。HTMLが次のようであるとしましょう:

<div id="something">Test</div>

そして、CSSで:beforeを設定し、次のように設計します。

#something:before{
   content:"1st";
   font-size:20px;
   color:red;
}
#something{
  content:'1st';
}

content後で簡単に取り出せるように、要素自体にも属性を設定しています。今ありますbuttonクリックできます::beforeの色を緑に変更し、フォントサイズを30pxに変更します。あなたは次のようにそれを達成することができます:

いくつかのクラスで必要なスタイルでCSSを定義します.activeS

.activeS:before{
   color:green !important;
   font-size:30px !important;
 }

これで、次のように:before要素にクラスを追加して、:beforeスタイルを変更できます。

<button id="changeBefore">Change</button>
<script>
    $('#changeBefore').click(function(){
        $('#something').addClass('activeS');
    });
</script>

のコンテンツを取得するだけの場合は:before、次のように実行できます。

<button id="getContent">Get Content</button>
<script>
    $('#getContent').click(function(){
        console.log($('#something').css('content'));//will print '1st'
    });
</script>

最終的には、:beforejQueryによってコンテンツを動的に変更する場合、次のようにしてそれを実現できます。

<button id="changeBefore">Change</button>
<script>
    var newValue = '22';//coming from somewhere
    var add = '<style>#something:before{content:"'+newValue+'"!important;}</style>';
    $('#changeBefore').click(function(){
        $('body').append(add);
    });
</script>

上の「changeBefore」ボタンをクリックすると、:before内容が#something動的な値である「22」に変わります。

それが役に立てば幸い


1

:root内部で定義された変数を使用しCSS:after(同じことが:before疑似要素を変更しました。特に、JavaScriptを使用してランダムな色を生成する次のデモで、によって定義されbackground-colorたスタイルの値と別の()の値を変更しました/ jQuery:anchor.sliding-middle-out:hover:aftercontentanchor#reference

HTML

<a href="#" id="changeColor" class="sliding-middle-out" title="Generate a random color">Change link color</a>
<span id="log"></span>
<h6>
  <a href="https://stackoverflow.com/a/52360188/2149425" id="reference" class="sliding-middle-out" target="_blank" title="Stack Overflow topic">Reference</a>
</h6>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.rawgit.com/davidmerfield/randomColor/master/randomColor.js"></script>

CSS

:root {
    --anchorsFg: #0DAFA4;
}
a, a:visited, a:focus, a:active {
    text-decoration: none;
    color: var(--anchorsFg);
    outline: 0;
    font-style: italic;

    -webkit-transition: color 250ms ease-in-out;
    -moz-transition: color 250ms ease-in-out;
    -ms-transition: color 250ms ease-in-out;
    -o-transition: color 250ms ease-in-out;
    transition: color 250ms ease-in-out;
}
.sliding-middle-out {
    display: inline-block;
    position: relative;
    padding-bottom: 1px;
}
.sliding-middle-out:after {
    content: '';
    display: block;
    margin: auto;
    height: 1px;
    width: 0px;
    background-color: transparent;

    -webkit-transition: width 250ms ease-in-out, background-color 250ms ease-in-out;
    -moz-transition: width 250ms ease-in-out, background-color 250ms ease-in-out;
    -ms-transition: width 250ms ease-in-out, background-color 250ms ease-in-out;
    -o-transition: width 250ms ease-in-out, background-color 250ms ease-in-out;
    transition: width 250ms ease-in-out, background-color 250ms ease-in-out;
}
.sliding-middle-out:hover:after {
    width: 100%;
    background-color: var(--anchorsFg);
    outline: 0;
}
#reference {
  margin-top: 20px;
}
.sliding-middle-out:before {
  content: attr(data-content);
  display: attr(data-display);
}

JS / jQuery

var anchorsFg = randomColor();
$( ".sliding-middle-out" ).hover(function(){
    $( ":root" ).css({"--anchorsFg" : anchorsFg});
});

$( "#reference" ).hover(
 function(){
    $(this).attr("data-content", "Hello World!").attr("data-display", "block").html("");
 },
 function(){
    $(this).attr("data-content", "Reference").attr("data-display", "inline").html("");
 }
);

でのattr()exceptのサポートcontentは本当に不足しています。caniuse.comで確認してください。:rootcss-variablesのサポートは優れていますが、サポートがかなり新しいため、まだそれほど普及していません。(caniuse.comでもサポートを確認してください)
BananaAcid

1

.css()特定の要素に使用するようなcss-pseudoルールを追加するjQueryプラグインを作成しました。

  • プラグインコードとテストケースはこちら
  • シンプルなCSS画像ポップアップとしてのユースケースはこちら

使用法:

$('body')
  .css({
    backgroundColor: 'white'
  })
  .cssPseudo('after', {
    content: 'attr(title) ", you should try to hover the picture, then click it."',
    position: 'absolute',
    top: 20, left: 20  
  })
  .cssPseudo('hover:after', {
    content: '"Now hover the picture, then click it!"'
  });

0

 $('.span').attr('data-txt', 'foo');
        $('.span').click(function () {
         $(this).attr('data-txt',"any other text");
        })
.span{
}
.span:after{ 
  content: attr(data-txt);
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class='span'></div>


0

この目的で私のプラグインを使用できます。

jQuery:

(function() {
  $.pseudoElements = {
    length: 0
  };

  var setPseudoElement = function(parameters) {
    if (typeof parameters.argument === 'object' || (parameters.argument !== undefined && parameters.property !== undefined)) {
      for (var element of parameters.elements.get()) {
        if (!element.pseudoElements) element.pseudoElements = {
          styleSheet: null,
          before: {
            index: null,
            properties: null
          },
          after: {
            index: null,
            properties: null
          },
          id: null
        };

        var selector = (function() {
          if (element.pseudoElements.id !== null) {
            if (Number(element.getAttribute('data-pe--id')) !== element.pseudoElements.id) element.setAttribute('data-pe--id', element.pseudoElements.id);
            return '[data-pe--id="' + element.pseudoElements.id + '"]::' + parameters.pseudoElement;
          } else {
            var id = $.pseudoElements.length;
            $.pseudoElements.length++

              element.pseudoElements.id = id;
            element.setAttribute('data-pe--id', id);

            return '[data-pe--id="' + id + '"]::' + parameters.pseudoElement;
          };
        })();

        if (!element.pseudoElements.styleSheet) {
          if (document.styleSheets[0]) {
            element.pseudoElements.styleSheet = document.styleSheets[0];
          } else {
            var styleSheet = document.createElement('style');

            document.head.appendChild(styleSheet);
            element.pseudoElements.styleSheet = styleSheet.sheet;
          };
        };

        if (element.pseudoElements[parameters.pseudoElement].properties && element.pseudoElements[parameters.pseudoElement].index) {
          element.pseudoElements.styleSheet.deleteRule(element.pseudoElements[parameters.pseudoElement].index);
        };

        if (typeof parameters.argument === 'object') {
          parameters.argument = $.extend({}, parameters.argument);

          if (!element.pseudoElements[parameters.pseudoElement].properties && !element.pseudoElements[parameters.pseudoElement].index) {
            var newIndex = element.pseudoElements.styleSheet.rules.length || element.pseudoElements.styleSheet.cssRules.length || element.pseudoElements.styleSheet.length;

            element.pseudoElements[parameters.pseudoElement].index = newIndex;
            element.pseudoElements[parameters.pseudoElement].properties = parameters.argument;
          };

          var properties = '';

          for (var property in parameters.argument) {
            if (typeof parameters.argument[property] === 'function')
              element.pseudoElements[parameters.pseudoElement].properties[property] = parameters.argument[property]();
            else
              element.pseudoElements[parameters.pseudoElement].properties[property] = parameters.argument[property];
          };

          for (var property in element.pseudoElements[parameters.pseudoElement].properties) {
            properties += property + ': ' + element.pseudoElements[parameters.pseudoElement].properties[property] + ' !important; ';
          };

          element.pseudoElements.styleSheet.addRule(selector, properties, element.pseudoElements[parameters.pseudoElement].index);
        } else if (parameters.argument !== undefined && parameters.property !== undefined) {
          if (!element.pseudoElements[parameters.pseudoElement].properties && !element.pseudoElements[parameters.pseudoElement].index) {
            var newIndex = element.pseudoElements.styleSheet.rules.length || element.pseudoElements.styleSheet.cssRules.length || element.pseudoElements.styleSheet.length;

            element.pseudoElements[parameters.pseudoElement].index = newIndex;
            element.pseudoElements[parameters.pseudoElement].properties = {};
          };

          if (typeof parameters.property === 'function')
            element.pseudoElements[parameters.pseudoElement].properties[parameters.argument] = parameters.property();
          else
            element.pseudoElements[parameters.pseudoElement].properties[parameters.argument] = parameters.property;

          var properties = '';

          for (var property in element.pseudoElements[parameters.pseudoElement].properties) {
            properties += property + ': ' + element.pseudoElements[parameters.pseudoElement].properties[property] + ' !important; ';
          };

          element.pseudoElements.styleSheet.addRule(selector, properties, element.pseudoElements[parameters.pseudoElement].index);
        };
      };

      return $(parameters.elements);
    } else if (parameters.argument !== undefined && parameters.property === undefined) {
      var element = $(parameters.elements).get(0);

      var windowStyle = window.getComputedStyle(
        element, '::' + parameters.pseudoElement
      ).getPropertyValue(parameters.argument);

      if (element.pseudoElements) {
        return $(parameters.elements).get(0).pseudoElements[parameters.pseudoElement].properties[parameters.argument] || windowStyle;
      } else {
        return windowStyle || null;
      };
    } else {
      console.error('Invalid values!');
      return false;
    };
  };

  $.fn.cssBefore = function(argument, property) {
    return setPseudoElement({
      elements: this,
      pseudoElement: 'before',
      argument: argument,
      property: property
    });
  };
  $.fn.cssAfter = function(argument, property) {
    return setPseudoElement({
      elements: this,
      pseudoElement: 'after',
      argument: argument,
      property: property
    });
  };
})();

$(function() {
  $('.element').cssBefore('content', '"New before!"');
});
.element {
  width: 480px;
  margin: 0 auto;
  border: 2px solid red;
}

.element::before {
  content: 'Old before!';
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<div class="element"></div>

jQuery.cssの通常の関数のように、値を指定する必要があります

さらに、jQuery.cssの通常の関数のように、疑似要素パラメーターの値を取得することもできます。

console.log( $(element).cssBefore(parameter) );

JS:


GitHub:https : //github.com/yuri-spivak/managing-the-properties-of-pseudo-elements/


0

完全なスタイル要素を使用してヘッド要素に追加することについて他の誰かがコメントしましたが、一度だけ実行する場合は問題ありませんが、それを複数回リセットする必要がある場合は、大量のスタイル要素になります。だから、私は頭に空白のスタイル要素をIDで作成し、そのinnerHTMLを次のように置き換えます:

<style id="pseudo"></style>

次に、JavaScriptは次のようになります。

var pseudo = document.getElementById("pseudo");

function setHeight() {
    let height = document.getElementById("container").clientHeight;
    pseudo.innerHTML = `.class:before { height: ${height}px; }`
}

setHeight()

今私の場合、これはbefore要素の高さを別の要素の高さに基づいて設定するためにこれが必要であり、サイズ変更時に変更されますので、これを使用するとsetHeight()、ウィンドウのサイズが変更されるたびに実行でき、<style>適切に置き換えられます。

同じことをしようとして立ち往生していた誰かを助けることを願っています。


-1

簡単で効果的な別のものが用意されています。

    <style> 
    .case-after:after { // set your properties here like eg: 
        color:#3fd309 !important; 
     } 
     .case-before:before { // set your properties here like eg: 
        color:#151715 !important; 
     }
 </style>
  // case for after
    $('#button-id').on('click', function() {
        $(".target-div").toggleClass('case-after');
    });

     // case for before
    $('#button-id').on('click', function() {
        $(".target-div").toggleClass('case-before');
    });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.