{"id":1776,"date":"2017-03-22T20:08:58","date_gmt":"2017-03-22T14:38:58","guid":{"rendered":"https:\/\/www.wikitechy.com\/technology\/?p=1776"},"modified":"2017-03-28T18:36:17","modified_gmt":"2017-03-28T13:06:17","slug":"selecting-manipulating-css-pseudo-elements-using-jquery","status":"publish","type":"post","link":"https:\/\/www.wikitechy.com\/technology\/selecting-manipulating-css-pseudo-elements-using-jquery\/","title":{"rendered":"[ Solved-10 Answers ] CSS &#8211; Selecting and manipulating CSS pseudo-elements such as ::before and ::after using jQuery"},"content":{"rendered":"<p><label class=\"label label-Warning\">PROBLEM :<\/label><\/p>\n<p>Is there any way to select\/manipulate CSS pseudo-elements such as ::before and ::after (and the old version with one semi-colon) using jQuery?<\/p>\n<p>For example, the stylesheet has the following rule:<\/p>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Css Code<\/span> <\/div> <pre class=\"language-css code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-css code-embed-code\">.span::after{ content:&#039;foo&#039; }<\/code><\/pre> <\/div>\n<p>How to change &#8216;foo&#8217; to &#8216;bar&#8217; using jQuery?<\/p>\n<p><label class=\"label label-info\">SOLUTION 1:<\/label><\/p>\n<p>You could also pass the content to the pseudo element with a data attribute and then use jQuery to manipulate that:<\/p>\n<h4 id=\"html\">\u00a0<span style=\"color: #ff6600;\"><strong>HTML:<\/strong><\/span><\/h4>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Html Code<\/span> <\/div> <pre class=\"language-markup code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-markup code-embed-code\">&lt;span&gt;foo&lt;\/span&gt;<\/code><\/pre> <\/div>\n<h4 id=\"jquery\"><strong><span style=\"color: #808000;\">\u00a0jQuery:<\/span><\/strong><\/h4>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Java Code<\/span> <\/div> <pre class=\"language-java code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-java code-embed-code\">$(&#039;span&#039;).hover(function(){<br\/>    $(this).attr(&#039;data-content&#039;,&#039;bar&#039;);<br\/>});<\/code><\/pre> <\/div>\n<h4 id=\"css\">\u00a0<span style=\"color: #800080;\"><strong>CSS:<\/strong><\/span><\/h4>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Css Code<\/span> <\/div> <pre class=\"language-css code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-css code-embed-code\">span:after {<br\/>    content: attr(data-content) &#039; any other text you may want&#039;;<br\/>}<\/code><\/pre> <\/div>\n<p>To prevent the &#8216;other text&#8217; from showing up, we could combine this like this:<\/p>\n<p><strong><span style=\"color: #ff6600;\">HTML:<\/span><\/strong><\/p>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Html Code<\/span> <\/div> <pre class=\"language-markup code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-markup code-embed-code\">&lt;span&gt;foo&lt;\/span&gt;<\/code><\/pre> <\/div>\n<h4 id=\"jquery-2\"><span style=\"color: #808000;\"><strong>\u00a0jQuery:<\/strong><\/span><\/h4>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Java Code<\/span> <\/div> <pre class=\"language-java code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-java code-embed-code\">$(&#039;span&#039;).hover(function(){<br\/>    $(this).addClass(&#039;change&#039;).attr(&#039;data-content&#039;,&#039;bar&#039;);<br\/>});<\/code><\/pre> <\/div>\n<h4 id=\"css-2\"><span style=\"color: #800080;\"><strong>\u00a0CSS:<\/strong><\/span><\/h4>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Css Code<\/span> <\/div> <pre class=\"language-css code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-css code-embed-code\">span.change:after {<br\/>    content: attr(data-content) &#039; any other text you may want&#039;;<br\/>}<\/code><\/pre> <\/div>\n<p><label class=\"label label-info\">SOLUTION 2:<\/label><\/p>\n<p>Add\/remove a predetermined class :<\/p>\n<p>In this approach, you&#8217;ve already created a class in your CSS with a different :after or :before style. Place this &#8220;new&#8221; class later in your stylesheet to make sure it overrides:<\/p>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Css Code<\/span> <\/div> <pre class=\"language-css code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-css code-embed-code\">p:before {<br\/>    content: &quot;foo&quot;;<br\/>}<br\/>p.special:before {<br\/>    content: &quot;bar&quot;;<br\/>}<br\/>Then you can easily add or remove this class using jQuery :<br\/><br\/>$(&#039;p&#039;).on(&#039;click&#039;, function() {<br\/>    $(this).toggleClass(&#039;special&#039;);<br\/>});<\/code><\/pre> <\/div>\n[ad type=&#8221;banner&#8221;]\n<p><label class=\"label label-info\">SOLUTION 3:<\/label><\/p>\n<p>You can&#8217;t select pseudo elements in jQuery because they are not part of DOM.<br \/>\nBut you can add an specific class to the father element and control its pseudo elements in CSS.<\/p>\n<h4 id=\"jquery-3\"><span style=\"color: #808000;\"><strong>\u00a0jQuery:<\/strong><\/span><\/h4>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Html Code<\/span> <\/div> <pre class=\"language-markup code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-markup code-embed-code\">&lt;script type=&quot;text\/javascript&quot;&gt;<br\/>    $(&#039;span&#039;).addClass(&#039;change&#039;);<br\/>&lt;\/script&gt;<\/code><\/pre> <\/div>\n<h4 id=\"css-3\"><span style=\"color: #800080;\"><strong>\u00a0CSS:<\/strong><\/span><\/h4>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Css Code<\/span> <\/div> <pre class=\"language-css code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-css code-embed-code\">span.change:after { content: &#039;bar&#039; }<\/code><\/pre> <\/div>\n<p><label class=\"label label-info\">SOLUTION 4:<\/label><\/p>\n<p>you could also do:<\/p>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Css Code<\/span> <\/div> <pre class=\"language-css code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-css code-embed-code\">$(&#039;head&#039;).append(&quot;&lt;style&gt;.span::after{ content:&#039;bar&#039; }&lt;\/style&gt;&quot;);<\/code><\/pre> <\/div>\n<p><label class=\"label label-info\">SOLUTION 5:<\/label><\/p>\n<p>Here is the way to access :after and :before style properties, defined in css:<\/p>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Css Code<\/span> <\/div> <pre class=\"language-css code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-css code-embed-code\">\/\/ Get the color value of .element:before<br\/>var color = window.getComputedStyle(<br\/>    document.querySelector(&#039;.element&#039;), &#039;:before&#039;<br\/>).getPropertyValue(&#039;color&#039;);<br\/><br\/>\/\/ Get the content value of .element:before<br\/>var content = window.getComputedStyle(<br\/>    document.querySelector(&#039;.element&#039;), &#039;:before&#039;<br\/>).getPropertyValue(&#039;content&#039;);<\/code><\/pre> <\/div>\n[ad type=&#8221;banner&#8221;]\n<p><label class=\"label label-info\">SOLUTION 6:<\/label><\/p>\n<ul>\n<li>IF you want to manipulate the ::before or ::after pseudo elements entirely through CSS, you could do it using JavaScript as shown below.<\/li>\n<\/ul>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Java Code<\/span> <\/div> <pre class=\"language-java code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-java code-embed-code\">jQuery(&#039;head&#039;).append(&#039;&lt;style id=&quot;mystyle&quot; type=&quot;text\/css&quot;&gt; \/* your styles here *\/ &lt;\/style&gt;&#039;);<\/code><\/pre> <\/div>\n<ul>\n<li>Notice how the &lt;style&gt; element has an ID, which you can use to remove it and append to it again if your style changes dynamically.<\/li>\n<li>This way, your element has its style exactly how you want it through CSS, with the help of JS.<\/li>\n<\/ul>\n<p><label class=\"label label-info\">SOLUTION 7:<\/label><\/p>\n<ul>\n<li>Add a rule to the document with the new content and reference it with a class. depending on what is needed .the class might need an unique id for each value in content.<\/li>\n<\/ul>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Css Code<\/span> <\/div> <pre class=\"language-css code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-css code-embed-code\">$(&quot;&lt;style type=&#039;text\/css&#039;&gt;span.id-after:after{content:bar;}&lt;\/style&gt;&quot;).appendTo($(&quot;head&quot;));<br\/>$(&#039;span&#039;).addClass(&#039;id-after&#039;);<\/code><\/pre> <\/div>\n<p><label class=\"label label-info\">SOLUTION 8:<\/label><\/p>\n<ul>\n<li>Why adding classes or attributes when you can just append a style to head<\/li>\n<\/ul>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Css Code<\/span> <\/div> <pre class=\"language-css code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-css code-embed-code\">$(&#039;head&#039;).append(&#039;&lt;style&gt;.span:after{ content:&#039;changed \t\t\tcontent&#039; }&lt;\/style&gt;&#039;)<\/code><\/pre> <\/div>\n<p><label class=\"label label-info\">SOLUTION 9:<\/label><\/p>\n<ul>\n<li>Write separate classes attached with psuedo element for each style and then using JavaScript or jQuery toggle between these classes as shown below.<\/li>\n<\/ul>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Css Code<\/span> <\/div> <pre class=\"language-css code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-css code-embed-code\">.green::before {<br\/>    content: &#039;green&#039;;<br\/>    color: green;<br\/>}<br\/>$(&#039;p&#039;).removeClass(&#039;red&#039;).addClass(&#039;green&#039;);<\/code><\/pre> <\/div>\n<p><label class=\"label label-info\">SOLUTION 10:<\/label><\/p>\n<ul>\n<li>Inject new styles to the existing document stylesheet directly either via JavaScript and the webpage will automatically reflect the new css.<\/li>\n<\/ul>\n<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <span class=\"code-embed-name\">Css Code<\/span> <\/div> <pre class=\"language-css code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-css code-embed-code\">document.styleSheets[0].addRule(&#039;.red::before&#039;,&#039;color: green&#039;);<br\/>document.styleSheets[0].insertRule(&#039;.red::before { color: green }&#039;, 0);<\/code><\/pre> <\/div>\n[ad type=&#8221;banner&#8221;]\n","protected":false},"excerpt":{"rendered":"<p>PROBLEM : Is there any way to select\/manipulate CSS pseudo-elements such as ::before and ::after (and the old version with one semi-colon) using jQuery? For example, the stylesheet has the following rule: How to change &#8216;foo&#8217; to &#8216;bar&#8217; using jQuery? SOLUTION 1: You could also pass the content to the pseudo element with a data [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,1208],"tags":[3814,3819,3816,3823,3820,3824,3825,3821,3822,3826,3818,3815,3817,3813,3827],"class_list":["post-1776","post","type-post","status-publish","format-standard","hentry","category-css","category-jquery","tag-access-the-css-after-selector-with-jquery","tag-changing-css-of-after-pseudoclass","tag-javascript-jquery-select-pseudo-element-after","tag-javascript-get-pseudo-element","tag-javascript-select-pseudo-element","tag-jquery-change-before-content","tag-jquery-change-pseudo-element-css","tag-jquery-css-after-content","tag-jquery-pseudo-element-click","tag-jquery-pseudo-selector","tag-manipulating-css-pseudo-elements-using-jquery","tag-modify-css-of-the-after-pseudo-element-using-jquery","tag-modify-pseudo-element-styles-with-javascript","tag-selecting-and-manipulating-css-pseudo-elements-such-as-before","tag-set-pseudo-element-properties-with-javascript"],"_links":{"self":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/posts\/1776","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/comments?post=1776"}],"version-history":[{"count":0,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/posts\/1776\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/media?parent=1776"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/categories?post=1776"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wikitechy.com\/technology\/wp-json\/wp\/v2\/tags?post=1776"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}