JQuery kullandıktan sonra :: before ve :: gibi CSS sözde öğelerini seçme ve değiştirme


943

JQuery kullanarak ::beforeve ::after(ve eski noktalı virgül içeren eski sürüm) gibi CSS sözde öğelerini seçmenin / değiştirmenin herhangi bir yolu var mı ?

Örneğin, stil sayfam aşağıdaki kurala sahiptir:

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

JQuery kullanarak 'foo'yu' bar 'olarak nasıl değiştirebilirim?


4
Senin için işe yarayacak bir şey yaptım: gist.github.com/yckart/5563717
yckart

1
Stackoverflow bu tür yorum yazmaktan nefret ediyorum (burada yorumcu neden tam tersini yapmıyorsun diye sorar ? ), Ama: bir noktada kod tasarım sorunu gerçekleştirmeli ve sözde öğeyi bir açıklık falan. Sanırım neye işaret ettiğimi biliyorsun.
zsitro

1
Kabul edilen cevap mükemmel. Aşağıdaki noktalardan herhangi birini elde etmeye çalışıyorsanız da, cevap işe yaramaz: 1. stilini değiştirmek: önce JS tarafından. 2. içeriğini değiştir: before by JS İhtiyacınız olursa lütfen cevabımı görün.
Öğrenci


@ Öğrenen Şimdi tüm bunlara bir cevap var: stackoverflow.com/a/49618941/8620333
Temani Afif

Yanıtlar:


694

Ayrıca, içeriği bir veri özniteliğiyle sözde öğeye iletebilir ve ardından bunu işlemek için jQuery kullanabilirsiniz:

HTML'de:

<span>foo</span>

JQuery'de:

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

CSS'de:

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

'Diğer metnin' görünmesini önlemek istiyorsanız, bunu seucolega'nın çözümü ile birleştirebilirsiniz:

HTML'de:

<span>foo</span>

JQuery'de:

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

CSS'de:

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

2
Spesifikasyonda bu attrişlevi contentözelliğe karşı kullanmak için bir bağlantınız var mı? Bunu hiç duymadığım için şaşırdım ...
Kevin Peno

95
+1 için attr(), çok kötü ben başka özellikleri ile kullanmak mümkün değildi content. Demo
Maksim Vi.

28
Çünkü mevcut hiçbir tarayıcı attr()henüz CSS2'nin ötesinde uygulanmadı , oysa CSS2'de attr()sadece contentmülk için tanımlandı .
BoltClock

10
Özellik Referansları için güncellenmiş bağlantı: w3.org/TR/css3-values/#attr-notation


477

Bunun, jQuery'nin yapabileceği diğer her şeyle birlikte, cevaplanması basit bir soru olacağını düşünürdünüz. Ne yazık ki, sorun teknik bir sorunla ilgilidir: css: after ve: önce kurallar DOM'un bir parçası değildir ve bu nedenle jQuery'nin DOM yöntemleri kullanılarak değiştirilemez.

Orada olan JavaScript ve / veya CSS geçici çözümleri kullanarak bu öğeleri işlemek için yollar; hangisini kullandığınız kesin gereksinimlerinize bağlıdır.


Ben yaygın olarak "en iyi" yaklaşım olarak kabul ile başlayacağım:

1) Önceden belirlenmiş bir sınıf ekleme / kaldırma

Bu yaklaşımda, CSS'nizde farklı :afterveya :beforestile sahip bir sınıf oluşturdunuz . Geçersiz kıldığından emin olmak için bu "yeni" sınıfı daha sonra stil sayfanıza yerleştirin:

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

Daha sonra jQuery (veya vanilya JavaScript) kullanarak bu sınıfı kolayca ekleyebilir veya kaldırabilirsiniz:

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

  • Artıları: jQuery ile uygulanması kolaydır; aynı anda birden fazla stili hızla değiştirir; endişelerin ayrılmasını zorunlu kılar (CSS ve JS'nizi HTML'nizden ayırma)
  • Eksileri: CSS önceden yazılmış olmalıdır, bu yüzden içeriği dinamik :beforeveya :aftertamamen dinamik değil

2) Yeni stilleri doğrudan belgenin stil sayfasına ekleyin

JavaScript'i, stilleri :afterve :beforestiller de dahil olmak üzere doğrudan belge stil sayfasına eklemek için kullanmak mümkündür . jQuery uygun bir kısayol sağlamaz, ancak Neyse ki JS o kadar karmaşık değildir:

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

.addRule()ve ilgili .insertRule()yöntemler bugün oldukça iyi desteklenmektedir.

Varyasyon olarak, jQuery'yi belgeye tamamen yeni bir stil sayfası eklemek için de kullanabilirsiniz, ancak gerekli kod daha temiz değildir:

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

Değerleri yalnızca "eklemekten" değil, yalnızca onlara eklemekten bahsediyorsak , var olan veya stilleri farklı bir yaklaşım kullanarak da okuyabiliriz:after:before :

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

Biz yerini alabilir document.querySelector('p')ile $('p')[0]biraz daha kısa kod, jQuery kullanırken.

  • Artıları: herhangi bir dize stile dinamik olarak eklenebilir
  • Eksileri: orijinal stiller değiştirilmez, sadece geçersiz kılınır; tekrarlanan (ab) kullanım DOM'nin gelişigüzel büyümesini sağlayabilir

3) Farklı bir DOM özelliğini değiştirme

Belirli bir DOM özelliğini okumak için CSS'nizde de kullanabilirsinizattr() . ( Bir tarayıcı destekliyorsa :beforeda destekliyor attr(). ) Bunu content:dikkatle hazırlanmış bir CSS ile birleştirerek , dinamik olarak :beforeve içeriğini (( kenar boşluğu veya renk gibi diğer özellikleri değiştiremeyiz) değiştirebiliriz :after:

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

JS:

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

CSS önceden hazırlanamazsa, bu ikinci teknikle birleştirilebilir:

var str = "bar";

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

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

  • Artıları: Sonsuz ekstra stil oluşturmaz
  • Eksileri: attr CSS'de URL'lere veya RGB renklerine değil, yalnızca içerik dizelerine uygulanabilir

2
Dinamik olarak :: sonra psedo glifik değerleri (yani, onaltılık değerleri aracılığıyla) ayarlamak için çalışıyorum. içerik: öğe (ör. içerik: "\ e043";). benim için işe yaramıyor gibi glificons için hex değerleri için işe yaramazsa varsayıyorum?
user2101068

@ user2101068 Bunu yeni bir soru olarak göndermelisiniz. Kullandığınız tüm kodu görmek zorundayım.
Blazemonger

Blazemonger, hızlı cevap için teşekkürler ... ne yazık ki biraz kod var ve ilgili kodu kesmek için biraz çaba alacaktı. Zaten bu işi almak için 12 + saat geçirdim ve bu işe almak için son nefes nefese çaba oldu. Kayıplarımı azaltmam gerekiyor. Yukarıda (# 3 kod parçacığı önce) açıklanan teknik kullanırken sadece benim varsayım re: hex değerleri doğrulamak mümkün olabileceğini umuyordu. İçerik öğesine hex dizesi ekleyebilirim, ancak gerçek glificon yerine glificon hex değeri için metin görüntüler. Tüm kodu görmeden izlenim?
user2101068

1
@ user2101068 Onaltılı dizeyi kullanmayın; bunun yerine, gerçek Unicode karakterini kopyalayıp HTML özelliğine yapıştırın. jsfiddle.net/mblase75/Lcsjkc5y
Blazemonger

çözüm 2. ve 3. ile ilgili olarak aslında şu stil kullanırsanız stil sayfasının büyümesini (aşırı) önleyebilirsiniz: document.styleSheets [0] .insertRule (kural, dizin), daha sonra bu dizini kullanarak gerekli olmadığında kuralları kaldırabilirsiniz: belge. styleSheets [0] .deleteRule (dizin)
Picard

158

Her ne kadar tarayıcılar tarafından CSS aracılığıyla diğer gerçek DOM öğeleri gibi görünseler de, sözde öğelerin kendileri DOM'un bir parçası değildir, çünkü adından da anlaşılacağı gibi sözde öğeler gerçek öğeler değildir ve bu nedenle bunları doğrudan jQuery (veya bu konuyla ilgili herhangi bir JavaScript API'siyle ( Seçiciler API'siyle bile değil ) doğrudan seçin ve değiştirin . Bu, stillerini sadece ::beforeve değil, komut dosyasıyla değiştirmeye çalıştığınız tüm sahte öğeler için geçerlidir ::after.

Yalancı öğe stillerine yalnızca çalışma zamanında doğrudan, sahte öğeleri desteklemeyen bir yöntem window.getComputedStyle()olan jQuery'nin ötesinde olmayan CSSOM (düşün ) aracılığıyla erişebilirsiniz .css().

Bununla birlikte, çevresinde her zaman başka yollar bulabilirsiniz, örneğin:

  • Stilleri bir veya daha fazla keyfi sınıfın sözde öğelerine uygulama, sonra sınıflar arasında geçiş yapma ( hızlı bir örnek için seucolega'nın cevabına bakın ) - bu, basit seçicilerden (sözde öğeler değil) yararlandığı için deyimsel bir yoldur elementleri ve element durumlarını, kullanım amaçlarını ayırt etmek

  • Bahsedilen sözde öğelere uygulanan stilleri değiştirmek, bir kesmek daha çok olan belge stil sayfasını değiştirerek


78

DOM'un bir parçası olmadıkları için jQuery'de sözde öğeleri seçemezsiniz. Ancak, baba öğesine belirli bir sınıf ekleyebilir ve sözde öğelerini CSS'de kontrol edebilirsiniz.

MİSAL

JQuery'de:

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

CSS'de:

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

48

Ayrıca, sözde öğeyi değiştirmek için özel özelliklere (CSS değişkenleri olarak da bilinir) güvenebiliriz . Spesifikasyonda şunları okuyabiliriz :

Özel özellikler sıradan özelliklerdir, bu nedenle herhangi bir öğe üzerinde bildirilebilir, normal miras ve basamaklı kurallarla çözülür , @media ve diğer koşullu kurallarla koşullu yapılabilir, HTML'nin stil özelliğinde kullanılabilir , okunabilir veya ayarlanabilir CSSOM vb. kullanarak

Bunu göz önünde bulundurarak fikir, öğe içindeki özel özelliği tanımlamaktır ve sözde öğe onu devralır; böylece kolayca değiştirebiliriz.

1) satır içi stilini kullanarak :

.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 ve sınıfları kullanma

.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 kullanma

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 kullanma

$('.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>


Karmaşık değerlerle de kullanılabilir:

.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>

Ne sözdizimi düşünüyorum fark edebilirsiniz varsayılan değerdir ve aynı zamanda geri dönüş değeri denir.var(--c,value)value

Aynı spesifikasyondan şunları okuyabiliriz:

Özel bir özelliğin değeri, var () işleviyle başka bir özelliğin değerine değiştirilebilir. Var () sözdizimi:

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

İşlevin ilk argümanı, değiştirilecek özel özelliğin adıdır. İşlevin ikinci bağımsız değişkeni, sağlandıysa, başvurulan özel özellik geçersiz olduğunda değiştirme değeri olarak kullanılan bir geri dönüş değeridir .

Ve sonra:

Bir mülkün değerindeki bir var () yerine:

  1. var()İşlevin ilk bağımsız değişkeniyle adlandırılan özel özellik animasyonla renklendirilmişse ve var()işlev, animasyon özelliğinde veya uzun ellerinden birinde kullanılıyorsa, özel özelliğe bu algoritmanın geri kalanı için başlangıç ​​değerine sahip olarak davranın.
  2. İşleve ilk argüman tarafından adlandırılan özel özelliğin var()değeri, başlangıç ​​değerinden başka bir şeyse, var()işlevi ilgili özel özelliğin değeriyle değiştirin .
  3. Aksi takdirde, var()işlevin ikinci bağımsız değişkeni olarak bir geri dönüş değeri varsa, işlevi geri dönüş değeriyle değiştirin var(). var()Yedekte herhangi bir referans varsa , bunları da değiştirin.
  4. Aksi takdirde, var()işlevi içeren özellik hesaplanan değer zamanında geçersizdir.

Özel özelliği ayarlamazsak initialVEYA geçersiz olarak bir değer içerdiğinde VEYA olarak ayarlarsak yedek değer kullanılır. Kullanımı initialbiz varsayılan değerine özel bir özellik sıfırlamak istediğiniz durumda yararlı olabilir.

İlişkili

Devralma değeri bir CSS özel özelliğinde (CSS değişkenleri olarak da bilinir) nasıl saklanır?

Kutu modeli için CSS özel özellikleri (değişkenler)


CSS değişkenlerinin alakalı olduğunu düşündüğünüz tüm tarayıcılarda bulunmayabileceğini lütfen unutmayın (örn. IE 11): https://caniuse.com/#feat=css-variables


@akalata evet, kod bir jQuery sürüm 3.x gerektirir. jQuery ile daha fazla ayrıntı ve başka bir alternatif
ekledim

Bu IE 11'de nasıl bir performans sergiler?
connexo

1
@connexo herhangi bir iyi ve modern özellik gibi .. desteklenmez ve çalışmaz caniuse.com/#feat=css-variables
Temani Afif

Ofc'in biliyordum ve IE 11 hala çok alakalı olduğundan, cevabınızın giriş kısmında bu bilgiyi kaçırdım.
connexo

1
Bu cevap, CSS Değişkenlerini kullanarak sözde öğeleri JavaScript ile ilişkilendirme ve değiştirme konusunda derinlemesine bir öğreticidir. Zaman ayırdığınız ve bu son derece değerli teknikleri paylaştığınız için çok teşekkür ederiz.
LebCit

37

Christian'ın önerileri doğrultusunda şunları da yapabilirsiniz:

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

2
Buraya bir id niteliği eklenmelidir, böylece yeni bir tane eklenmeden önce öğe seçilebilir ve silinebilir. Değilse, birçok gereksiz stil düğümü ortaya çıkabilir.
KS

24

Css'de tanımlanan stil özelliklerinden önce: after ve: öğelerine erişmenin yolu:

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

Sudo öğelerini tamamen CSS aracılığıyla :: before veya :: after değiştirmek istiyorsanız, bunu JS ile yapabilirsiniz. Aşağıya bakınız;

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

<style>Öğenin, kimliğinizi kaldırmak ve stiliniz dinamik olarak değişirse tekrar eklemek için kullanabileceğiniz bir kimliğe sahip olduğuna dikkat edin .

Bu şekilde, öğeniz JS yardımıyla tam olarak nasıl istediğinizi CSS ile şekillendirir.


6

çalışan ancak çok etkili olmayan bir yol, yeni içeriğe sahip belgeye bir kural eklemek ve ona bir sınıfla başvurmaktır. neye ihtiyaç duyulduğuna bağlı olarak sınıf, içerikteki her değer için benzersiz bir kimliğe ihtiyaç duyabilir.

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

5

İşte HTML:

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

'Önce' üzerinde hesaplanan stil content: "VERIFY TO WATCH";

İşte bu öğeye özel olarak başvurmak için fazladan bir sınıf ekleme ve daha sonra sudo-elementinin içerik değerinin CSS'sini değiştirmek için bir stil etiketi (! Önemli etiketi ile) ekleme fikrini kullanan iki jQuery satırım:

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

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


5

Hepinize teşekkür ederim! istediğimi yapmayı başardım: D http://jsfiddle.net/Tfc9j/42/ burada bir göz atın

i dış div opaklığı iç div opaklığından farklı olmak istedim ve bu bir yerde bir tıklama ile değişim;) Teşekkürler!

   $('#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>

Değil deneyin appendkullanımı htmlen iyisi önlemek
KingRider

1
Dikkat edin: burada, bu tıklamalardan biri her kullanıldığında bir stil etiketi ekliyorsunuz. Yeni bir tane eklemeden önce eskisini kaldırmanın bir yolunu kodlarım.
pupitetris

3

Sahte bir özellik oluşturabilir veya mevcut bir özelliği kullanabilir ve sözde öğenin stil sayfasında devralınabilirsiniz .

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>

Görünüşe göre "içerik" mülkü için çalışmıyor :(


3

Bu gerçek dünya kullanımları için yazmadım, sadece size ne elde edilebilir bir örnek vermek için pratik değil.

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

şu anda bu eklenti a / veya hedef öğenin Pseudo öğesinden sonra geçerli olacak gerekli özniteliklerinizi içeren bir Stil öğesi ekler.

bu şu şekilde kullanılabilir

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

ve

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

after: ve before: pseudo öğelerine DOM aracılığıyla doğrudan erişilemez şu anda css'in spesifik değerlerini serbestçe düzenlemek mümkün değildir.

benim yolum sadece bir örnekti ve pratik için iyi değil, kendi hilelerinizden bazılarını deneyebilir ve gerçek dünya kullanımı için doğru yapabilirsiniz.

öyleyse kendi deneyimleriniz bu ve diğerleriyle!

Saygılarımızla - Adarsh ​​Hegde.


3

Ben her zaman kendi utils fonksiyonumu ekliyorum, bu böyle görünüyor.

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

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

veya ES6 Özelliklerinden yararlanabilirsiniz:

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

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

2

Neden yalnızca stylebaşa a ekleyebileceğiniz sınıfları veya nitelikleri eklemelisiniz?

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

2

Orada burada birçok cevaplar ama cevap css işlemek için yardımcı olur :beforeveya :afterdeğil, hatta kabul tane.

Bunu nasıl öneriyorum. Diyelim ki HTML'niz şöyle:

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

Ve sonra onun: daha önce CSS'de ayarlıyor ve şöyle tasarlıyorsunuz:

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

Daha contentsonra kolayca alabilmeniz için öğenin kendisinde de öznitelik ayarladığımı lütfen unutmayın. Şimdi button, rengini değiştirmek istediğiniz bir tıklama var : önce yeşile ve yazı tipi boyutunu 30 piksel. Bunu aşağıdaki gibi başarabilirsiniz:

Bir sınıfta istediğiniz stille bir css tanımlayın .activeS:

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

Şimdi: class öğenizi: before öğenize aşağıdaki gibi ekleyerek: style'den önce değiştirebilirsiniz:

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

Sadece içerik almak istiyorsanız :before, şu şekilde yapılabilir:

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

Sonuçta :beforeiçeriği jQuery ile dinamik olarak değiştirmek istiyorsanız , bunu aşağıdaki gibi yapabilirsiniz:

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

Yukarıdaki "changeBefore" düğmesine tıklandığında, :beforeiçeriği #somethingdinamik bir değer olan '22' olarak değiştirilir .

Umut ediyorum bu yardım eder


1

İçinde tanımlanan değişkenin kullanımı gerçekleştirildiğinde :rootCSSdeğiştirme :after(aynı için de geçerlidir :before) sözde eleman , özellikle değiştirmek için background-colorbir stilindeki değeri anchorile tanımlanır .sliding-middle-out:hover:afterve contentbir değer için anchor( #referenceaşağıda) demo JavaScript kullanarak rastgele renkler üretir / jQuery:

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()Dışında destek content, gerçekten azdır. Bunun için caniuse.com adresini kontrol edebilirsiniz. :rootve css değişkenleri desteği daha iyidir, ancak destek çok yeni olduğu için henüz çok geniş değildir. (caniuse.com adresinden destek için de kontrol edin)
BananaAcid

1

.css()Belirli öğeler için kullanmak gibi css-sözde kuralları eklemek için bir jQuery eklentisi oluşturduk .

kullanımı:

$('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

Eklentimi bu amaçla kullanabilirsiniz.

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>

Değerler, jQuery.css normal işlevinde olduğu gibi belirtilmelidir

Ayrıca, jQuery.css normal işlevinde olduğu gibi sözde öğe parametresinin değerini de alabilirsiniz:

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

JS:


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


0

Başka biri tam stil öğesiyle head öğesine ekleme hakkında yorum yaptı ve sadece bir kez yapıyorsanız kötü değil, ancak bir kereden fazla sıfırlamanız gerekiyorsa bir ton stil öğesi ile sonuçlanacaksınız. Bu yüzden kafamda bir kimliğe sahip boş bir stil öğesi oluşturmamı ve bunun innerHTML'sini şöyle değiştirmem:

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

Sonra JavaScript şöyle görünecektir:

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

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

setHeight()

Şimdi benim durumumda bir başkasının yüksekliğine göre bir önceki elemanın yüksekliğini ayarlamak için buna ihtiyacım vardı ve yeniden boyutlandırma üzerinde değişecek, böylece bunu kullanarak setHeight()her pencere yeniden boyutlandırıldığında <style>çalışabilir ve düzgün bir şekilde yerini alacak .

Umarım aynı şeyi yapmaya çalışırken sıkışmış birine yardım eder.


-1

Senin için kolay ve etkili olan farklı şeylerim var.

    <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');
    });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.