JQuery का उपयोग करने के बाद सीएसएस छद्म तत्वों जैसे :: पहले और बाद में चयन और हेरफेर


943

वहाँ का चयन / हेरफेर जैसे CSS छद्म तत्वों के लिए कोई तरीका है ::beforeऔर ::after(और एक सेमी-कोलन के साथ पुराने संस्करण) jQuery का उपयोग कर?

उदाहरण के लिए, मेरी स्टाइलशीट में निम्नलिखित नियम हैं:

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

मैं jQuery का उपयोग करके 'फू' को 'बार' में कैसे बदल सकता हूं?


4
मैंने कुछ ऐसा किया जो आपके लिए काम करे: gist.github.com/yckart/5563717
रात 12'13

1
मुझे स्टैकओवरफ़्लो पर ऐसी टिप्पणियों से नफरत है जो मैं लिखने जा रहा हूं (जहां टिप्पणीकार पूछता है कि आप इसे कुछ पूर्ण विपरीत तरीके से क्यों नहीं करते हैं? ), लेकिन: कुछ बिंदु पर किसी को कोड-डिज़ाइन मुद्दे का एहसास होना चाहिए और उस छद्म तत्व को एक के साथ बदलना चाहिए अवधि या कुछ और। मुझे लगता है कि आप जानते हैं कि मैं क्या इंगित कर रहा हूं।
zsitro

1
स्वीकृत उत्तर उत्कृष्ट है। हालांकि यदि आप निम्नलिखित में से किसी भी बिंदु को प्राप्त करने की कोशिश कर रहे हैं, तो उत्तर नहीं मिलेगा: 1. जेएस द्वारा पहले: की शैली बदलें। 2. परिवर्तन की सामग्री: जेएस द्वारा इससे पहले कि आप की जरूरत है, तो इसके लिए मेरा जवाब देखें।
शिक्षार्थी


@ लर्नर अब इन सभी का जवाब देने के लिए तैयार है: stackoverflow.com/a/49618941/8620333
तैमनी Afif

जवाबों:


694

आप डेटा विशेषता के साथ छद्म तत्व के लिए सामग्री भी पास कर सकते हैं और फिर उस हेरफेर के लिए jQuery का उपयोग कर सकते हैं:

HTML में:

<span>foo</span>

JQuery में:

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

सीएसएस में:

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

यदि आप 'अन्य पाठ' को दिखाने से रोकना चाहते हैं, तो आप इसे इस तरह से सिकोलेगा के समाधान के साथ जोड़ सकते हैं:

HTML में:

<span>foo</span>

JQuery में:

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

सीएसएस में:

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

2
क्या आपके पास संपत्ति के attrखिलाफ उस फ़ंक्शन का उपयोग करने की कल्पना में एक लिंक है content? मुझे आश्चर्य है कि मैंने इसके बारे में कभी नहीं सुना ...
केविन पेनो

95
+1 के लिए attr(), बहुत बुरा मैं अन्य गुणों के साथ इसका उपयोग करने में सक्षम नहीं था contentडेमो
मक्सिम वी।

28
ऐसा इसलिए है क्योंकि अस्तित्व में कोई भी ब्राउज़र attr()अभी तक CSS2 से परे लागू नहीं हुआ है, जबकि CSS2 attr()में केवल contentसंपत्ति के लिए परिभाषित किया गया है।
BoltClock



477

आपको लगता है कि यह जवाब देने के लिए एक सरल सवाल होगा, बाकी सब कुछ जो jQuery कर सकता है। दुर्भाग्य से, समस्या एक तकनीकी समस्या के लिए नीचे आती है: सीएसएस: के बाद और: नियमों से पहले डोम का हिस्सा नहीं हैं, और इसलिए jQuery के डोम तरीकों का उपयोग करके बदला नहीं जा सकता है।

वहाँ रहे हैं इन JavaScript और / या सीएसएस समाधान का उपयोग कर तत्वों में हेरफेर करने के तरीके; जो आप उपयोग करते हैं वह आपकी सटीक आवश्यकताओं पर निर्भर करता है।


मैं उस चीज़ से शुरू करने जा रहा हूँ जिसे व्यापक रूप से "सर्वश्रेष्ठ" दृष्टिकोण माना जाता है:

1) एक पूर्व निर्धारित वर्ग को जोड़ें / निकालें

इस दृष्टिकोण में, आपने पहले ही अपने सीएसएस में एक अलग :afterया :beforeशैली के साथ एक वर्ग बनाया है । इस "नए" वर्ग को बाद में अपनी स्टाइलशीट में रखें यह सुनिश्चित करने के लिए कि यह ओवरराइड करता है:

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

फिर आप इस वर्ग को jQuery (या वेनिला जावास्क्रिप्ट) का उपयोग करके आसानी से जोड़ या हटा सकते हैं:

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

  • पेशेवरों: jQuery के साथ लागू करने के लिए आसान; जल्दी से एक बार में कई शैलियों को बदल देता है; चिंताओं को अलग करने में मदद करता है (अपने HTML से अपने CSS और JS को अलग करना)
  • विपक्ष: सीएसएस पूर्व लिखा होना चाहिए, की सामग्री तो :beforeया :afterपूरी तरह से गतिशील नहीं है

2) दस्तावेज़ की स्टाइलशीट में सीधे नई शैली जोड़ें

दस्तावेज़ स्टाइलशीट, शैलियों :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');

हम जगह ले सकता है document.querySelector('p')के साथ $('p')[0]जब jQuery का उपयोग कर, थोड़ा कम कोड के लिए।

  • पेशेवरों: किसी भी स्ट्रिंग को शैली में गतिशील रूप से डाला जा सकता है
  • विपक्ष: मूल शैलियों में परिवर्तन नहीं किया गया है, बस ओवरराइड किया गया है; दोहराया (ab) उपयोग DOM को मनमाने ढंग से बड़ा कर सकता है

3) एक अलग डोम विशेषता को बदल दें

आप किसी विशेष DOM विशेषता को पढ़ने के लिए अपने CSS में भी उपयोगattr() कर सकते हैं । ( यदि कोई ब्राउज़र समर्थन करता है :before, तो यह भी समर्थन करता है attr() ) content:कुछ सावधानी से तैयार किए गए CSS में इसे जोड़कर , हम और गतिशील रूप से सामग्री को बदल सकते हैं (लेकिन अन्य गुण नहीं, जैसे मार्जिन या रंग)।:before:after

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

जे एस:

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

इसे दूसरी तकनीक के साथ जोड़ा जा सकता है यदि सीएसएस समय से पहले तैयार नहीं किया जा सकता है:

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
मैं डायनामिकली सेट करने की कोशिश कर रहा हूं ग्लाइकोनिक वैल्यूज़ (यानी, उनके हेक्स वैल्यूज़ के माध्यम से) :: Psedo के बाद। सामग्री: तत्व (जैसे, सामग्री: "\ e043";)। यह मेरे लिए काम करने के लिए प्रतीत नहीं होता है इसलिए मैं मान रहा हूँ कि यह ग्लाइफ़िकॉन के लिए हेक्स मानों के लिए भी काम नहीं करता है?
user2101068

@ user2101068 आपको एक नए प्रश्न के रूप में पोस्ट करना चाहिए। मुझे आपके द्वारा उपयोग किए जा रहे सभी कोड देखने होंगे।
ब्लेज़मॉन्गर

Blazemonger, त्वरित उत्तर के लिए धन्यवाद .. दुर्भाग्य से कोड का एक बहुत है और यह प्रासंगिक कोड को बाहर निकालने के लिए काफी प्रयास लगेगा। मैंने इस काम को पाने के लिए पहले से ही 12+ घंटे बिताए हैं और यह काम करने के लिए मेरा आखिरी हांफने का प्रयास था। मुझे अपने नुकसान में कटौती करने की जरूरत है। मैं उम्मीद कर रहा था कि जब आप ऊपर # 3 कोड में (कोड स्निपेट से पहले) वर्णित तकनीक का उपयोग कर रहे हैं तो आप मेरी धारणा को फिर से सत्यापित कर सकते हैं: हेक्स मान। मैं सामग्री तत्व में हेक्स स्ट्रिंग सम्मिलित कर सकता हूं लेकिन यह वास्तविक ग्लिफ़िकॉन के बजाय ग्लिफ़िकॉन हेक्स मान के लिए पाठ प्रदर्शित करता है। सभी कोड देखे बिना इंप्रेशन?
user2101068

1
@ user2101068 हेक्स स्ट्रिंग का उपयोग न करें; इसके बजाय, HTML विशेषता में वास्तविक यूनिकोड चरित्र को कॉपी और पेस्ट करें। jsfiddle.net/mblase75/Lcsjkc5y
ब्लेज़मॉन्गर

समाधान के बारे में 2. और 3. वास्तव में आप स्टाइलशीट को (ओवर) बढ़ने से रोक सकते हैं यदि आप उपयोग करते हैं: document.styleSheets [0] .insertRule (नियम, सूचकांक), तो इस इंडेक्स का उपयोग करके आप नियमों को हटा सकते हैं जब आवश्यक नहीं: दस्तावेज़। स्टाइलशीट [0] .डेलीट्रील (इंडेक्स)
पिकार्ड

158

यद्यपि वे सीएसएस के माध्यम से ब्राउज़रों द्वारा प्रदान किए जाते हैं जैसे कि वे अन्य वास्तविक डोम तत्वों की तरह थे, छद्म तत्व स्वयं डोम का हिस्सा नहीं हैं, क्योंकि छद्म तत्व, जैसा कि नाम से पता चलता है, वास्तविक तत्व नहीं हैं, और इसलिए आप नहीं कर सकते हैं jQuery (या उस मामले के लिए कोई जावास्क्रिप्ट एपीआई, यहां तक ​​कि चयनकर्ता एपीआई भी नहीं ) के साथ उन्हें सीधे चुनें और हेरफेर करें । यह उन सभी छद्म तत्वों पर लागू होता है जिनकी शैलियाँ आप स्क्रिप्ट के साथ संशोधित करने का प्रयास कर रहे हैं, और सिर्फ ::beforeऔर सिर्फ ::after

आप केवल CSSOM (थिंक window.getComputedStyle()) के माध्यम से सीधे छद्म-तत्व शैलियों का उपयोग कर सकते हैं , जो कि jQuery द्वारा उजागर नहीं किया गया है .css(), एक विधि जो छद्म तत्वों का समर्थन नहीं करती है।

आप हमेशा इसके चारों ओर अन्य तरीके खोज सकते हैं, हालांकि, उदाहरण के लिए:

  • एक या एक से अधिक मनमानी वर्गों के छद्म तत्वों के लिए शैलियों को लागू करना, फिर कक्षाओं के बीच टॉगल करना ( एक त्वरित उदाहरण के लिए सेउकोलेगा का जवाब देखें ) - यह मुहावरेदार तरीका है क्योंकि यह सरल चयनकर्ताओं का उपयोग करता है (जो छद्म तत्व नहीं हैं) तत्वों और तत्व राज्यों के बीच अंतर, जिस तरह से उनका उपयोग करने का इरादा है

  • दस्तावेज़ स्टाइलशीट को बदलकर, छद्म तत्वों को लागू की जा रही शैलियों में हेरफेर करना, जो एक हैक के बहुत अधिक है


78

आप jQuery में छद्म तत्वों का चयन नहीं कर सकते क्योंकि वे DOM का हिस्सा नहीं हैं। लेकिन आप पिता तत्व में एक विशिष्ट वर्ग जोड़ सकते हैं और CSS में इसके छद्म तत्वों को नियंत्रित कर सकते हैं।

उदाहरण

JQuery में:

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

सीएसएस में:

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

48

छद्म तत्व में हेरफेर करने के लिए हम कस्टम गुणों (उर्फ सीएसएस चर) पर भी भरोसा कर सकते हैं । हम इस विनिर्देश में पढ़ सकते हैं कि:

कस्टम गुण सामान्य गुण हैं, इसलिए उन्हें किसी भी तत्व पर घोषित किया जा सकता है, सामान्य विरासत और कैस्केड नियमों के साथ हल किया जाता है , @मीडिया और अन्य सशर्त नियमों के साथ सशर्त बनाया जा सकता है, 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 और classes का उपयोग करना

.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) जावास्क्रिप्ट का उपयोग करना

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( <custom-property-name> [, <declaration-value> ]? )

फ़ंक्शन के लिए पहला तर्क कस्टम संपत्ति का नाम प्रतिस्थापित किया जाना है। फ़ंक्शन के लिए दूसरा तर्क, यदि प्रदान किया गया है, एक फॉलबैक मूल्य है, जिसका उपयोग संदर्भित मूल्य के अवैध होने पर प्रतिस्थापन मूल्य के रूप में किया जाता है।

और बादमें:

एक संपत्ति के मूल्य में एक var () को बदलने के लिए:

  1. यदि var()फ़ंक्शन के पहले तर्क द्वारा नामित कस्टम संपत्ति एनीमेशन-दागी है, और var()फ़ंक्शन का उपयोग एनीमेशन संपत्ति या उसके एक longhands में किया जा रहा है, तो इस एल्गोरिथम के बाकी हिस्सों के लिए प्रारंभिक मूल्य होने के रूप में कस्टम संपत्ति का इलाज करें।
  2. यदि var()फ़ंक्शन के पहले तर्क द्वारा नामित कस्टम संपत्ति का मूल्य कुछ भी है, लेकिन प्रारंभिक मूल्य है, तो var()फ़ंक्शन को संबंधित कस्टम संपत्ति के मूल्य से बदलें ।
  3. अन्यथा, यदि var()फ़ंक्शन के दूसरे तर्क के रूप में फ़ॉलबैक मान है , तो फ़ंक्शन को फ़ॉलबैक मान var()द्वारा प्रतिस्थापित करें । यदि कोई var()गिरावट में संदर्भ हैं , तो उन्हें भी प्रतिस्थापित करें।
  4. अन्यथा, var()फ़ंक्शन वाली संपत्ति गणना-मूल्य समय पर अमान्य है।

अगर हम कस्टम प्रॉपर्टी सेट नहीं करते हैं या हम इसे initialओआर सेट करते हैं या इसमें एक अमान्य मूल्य है तो फ़ॉलबैक मूल्य का उपयोग किया जाएगा। initialयदि हम कस्टम प्रॉपर्टी को उसके डिफ़ॉल्ट मान पर रीसेट करना चाहते हैं, तो उसका उपयोग मददगार हो सकता है।

सम्बंधित

सीएसएस कस्टम संपत्ति (उर्फ सीएसएस चर) के अंदर इनहेरिट वैल्यू कैसे स्टोर करें?

बॉक्स मॉडल के लिए सीएसएस कस्टम गुण (चर)


कृपया ध्यान दें कि सीएसएस चर उन सभी ब्राउज़रों में उपलब्ध नहीं हो सकता है जिन्हें आप प्रासंगिक मानते हैं (जैसे IE 11): https://caniuse.com/#feat=css-variables


@akalata हाँ, कोड को एक jQuery संस्करण 3.x की आवश्यकता होती है .. मैंने अधिक विवरण और jQuery के साथ एक और विकल्प जोड़ा;)
Temani Afif

IE 11 में यह कैसा प्रदर्शन करेगा?
21

1
@connexo किसी भी अच्छे और आधुनिक फीचर की तरह .. यह समर्थित नहीं है और यह caniuse.com/#feat=css-variables
Temani Afif

Ofc मुझे पता था कि और चूंकि IE 11 अभी भी बहुत प्रासंगिक है, इसलिए मैंने आपके उत्तर के परिचयात्मक भाग में सूचना के उस टुकड़े को सही तरीके से याद किया।
कोनपेक्सो

1
यह उत्तर CSS वेरिएबल्स का उपयोग करके जावास्क्रिप्ट के साथ छद्म तत्वों को संबंधित और संशोधित करने का एक गहन ट्यूटोरियल है। आपके समय के लिए और इस अत्यंत मूल्यवान तकनीक को साझा करने के लिए आपका बहुत-बहुत धन्यवाद।
LebCit

37

ईसाई क्या सुझाते हैं, इस पंक्ति में आप भी कर सकते हैं:

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

2
यहां एक आईडी-विशेषता जोड़ी जानी चाहिए, इसलिए नए जोड़े जाने से पहले तत्व को चुना और हटाया जा सकता है। यदि नहीं, तो बहुत सारे अनावश्यक स्टाइल-नोड्स आ सकते हैं।
केएस

24

यहां पहुंचने का तरीका है: शैली के गुणों से पहले और बाद में, सीएसएस में परिभाषित:

// 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 तत्वों के बाद :: पहले या :: में हेरफेर करना चाहते हैं, तो आप इसे JS कर सकते हैं। निचे देखो;

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

ध्यान दें कि <style>तत्व में एक आईडी कैसे है , जिसे आप इसे हटाने के लिए उपयोग कर सकते हैं और इसे फिर से जोड़ सकते हैं यदि आपकी शैली गतिशील रूप से बदलती है।

इस तरह, आपका तत्व बिल्कुल उसी तरह है जैसे आप इसे सीएसएस के माध्यम से जेएस की मदद से चाहते हैं।


6

एक काम कर रहा है लेकिन बहुत कुशल तरीका नहीं है कि नई सामग्री के साथ दस्तावेज़ में एक नियम जोड़ें और इसे कक्षा के साथ संदर्भित करें। इस बात पर निर्भर करता है कि वर्ग को सामग्री में प्रत्येक मूल्य के लिए एक विशिष्ट आईडी की आवश्यकता हो सकती है।

$("<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";

यहाँ jQuery की मेरी दो पंक्तियाँ हैं, जो इस तत्व को विशेष रूप से संदर्भित करने के लिए एक अतिरिक्त वर्ग जोड़ने के विचार का उपयोग करते हैं और फिर एक स्टाइल टैग (एक महत्वपूर्ण टैग के साथ) को sudo-element की सामग्री मान के 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>

कोशिश appendhtml
मत

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

यह वर्तमान में एक / a जोड़ देता है या एक स्टाइल तत्व जोड़ देता है जिसमें आपकी आवश्यक विशेषता होती है जो कि छद्म तत्व के बाद लक्ष्य तत्व पर प्रभाव डालेगी।

इस रूप में इस्तेमाल किया जा सकता है

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

तथा

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

के बाद के रूप में: और पहले: छद्म तत्व सीधे डोम के माध्यम से सुलभ नहीं हैं वर्तमान में सीएसएस के विशिष्ट मूल्यों को स्वतंत्र रूप से संपादित करना संभव नहीं है।

मेरा तरीका सिर्फ एक उदाहरण था और यह अभ्यास के लिए अच्छा नहीं है, आप इसे संशोधित कर सकते हैं अपने खुद के कुछ ट्रिक्स और इसे वास्तविक दुनिया के उपयोग के लिए सही बना सकते हैं।

तो इस और दूसरों के साथ अपने खुद के प्रयोग करते हैं!

सादर - आदर्श हेगड़े


3

मैं हमेशा अपने स्वयं के बर्तन फ़ंक्शन जोड़ रहा हूं, जो इस तरह दिखता है।

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या :afterनहीं की सीएसएस में हेरफेर करने में मदद करता है ।

यहाँ है कि मैं इसे करने का प्रस्ताव कैसे देता हूं। मान लीजिए कि आपका HTML ऐसा है:

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

और फिर आप इसे सेट कर रहे हैं: सीएसएस में पहले और इसे डिजाइन करना जैसे:

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

कृपया ध्यान दें कि मैंने contentतत्व को भी विशेषता में सेट किया है ताकि आप इसे बाद में आसानी से निकाल सकें। अब एक buttonक्लिक है जिस पर, आप का रंग बदलना चाहते हैं: हरे रंग से पहले और इसका फ़ॉन्ट-आकार 30px तक। आप इसे निम्न प्रकार से प्राप्त कर सकते हैं:

कुछ वर्ग पर अपनी आवश्यक शैली के साथ एक सीएसएस को परिभाषित करें .activeS:

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

अब आप बदल सकते हैं: शैली को वर्ग में जोड़कर अपने से पहले: तत्व से पहले निम्नानुसार है:

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

ऊपर "चेंजबियर" बटन पर क्लिक करने से '22' :beforeकी सामग्री बदल जाएगी #somethingजो एक गतिशील मूल्य है।

मुझे उम्मीद है यह मदद करेगा


1

मैं में निर्धारित वेरिएबल का इस्तेमाल किया :rootअंदर CSSसंशोधित करने के लिए :after(एक ही लागू होता है :before) छद्म तत्व , विशेष रूप से बदलने के लिए background-colorएक स्टाइल के लिए मूल्य anchorद्वारा परिभाषित किया गया .sliding-middle-out:hover:afterऔर contentकिसी अन्य के लिए मूल्य anchor( #referenceनिम्नलिखित में) डेमो कि जावास्क्रिप्ट का उपयोग करके यादृच्छिक रंग उत्पन्न करता है / jQuery:

एचटीएमएल

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

सीएसएस

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

जे एस / 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()में छोड़कर के लिए समर्थन content, वास्तव में दुर्लभ है। आप इसके लिए caniuse.com की जाँच कर सकते हैं। :rootऔर सीएसएस-चर समर्थन बेहतर है, लेकिन अभी भी इतना व्यापक प्रसार नहीं हुआ है क्योंकि इसके लिए समर्थन बहुत नया है। (caniuse.com पर इसके समर्थन की भी जाँच करें)
BananaAcid

1

मैंने .css()विशिष्ट तत्वों के लिए उपयोग करने की तरह सीएसएस-छद्म नियमों को जोड़ने के लिए एक jQuery प्लगइन बनाया है ।

  • प्लगइन कोड और परीक्षण मामला यहाँ है
  • केस को सिंपल सीएसएस इमेज पॉपअप के रूप में उपयोग करें

उपयोग:

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

आप इस उद्देश्य के लिए मेरे प्लगइन का उपयोग कर सकते हैं।

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

जे एस:


गीथहब: https://github.com/yuri-spivak/managing-the-properties-of-pseudo-elements/


0

किसी और ने एक पूर्ण शैली तत्व के साथ प्रमुख तत्व को अपील करने पर टिप्पणी की और यह बुरा नहीं है यदि आप इसे केवल एक बार कर रहे हैं, लेकिन यदि आपको इसे एक बार से अधिक रीसेट करने की आवश्यकता है तो आप एक टन शैली तत्वों के साथ समाप्त हो जाएंगे। इसलिए यह रोकने के लिए कि मैंने एक आईडी के साथ सिर में एक खाली शैली तत्व बनाया है और इसके आंतरिक HTML को इस तरह बदलें:

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

तब जावास्क्रिप्ट इस तरह दिखेगा:

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

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

setHeight()

अब मेरे मामले में मुझे दूसरे की ऊंचाई के आधार पर पहले के तत्व की ऊंचाई निर्धारित करने के लिए इसकी आवश्यकता थी और यह आकार परिवर्तन पर बदल जाएगा इसलिए इसका उपयोग करके मैं 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');
    });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.