使用jQuery选择和操作CSS伪元素,例如:: before和:: after


943

有什么方法可以使用jQuery 选择和操作CSS伪元素,例如::before::after(以及带有分号的旧版本)?

例如,我的样式表具有以下规则:

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

如何使用jQuery将'foo'更改为'bar'?


4
我做了一些对您有用的
yckart

1
我讨厌我要写的关于stackoverflow的注释(注释者问您为什么不做一些完全相反的事情?),但是:在某个时候,人们应该意识到代码设计的问题,并用一个替换该伪元素。跨度之类的。我想你知道我的意思。
zsitro

1
接受的答案非常好。尽管如果您尝试达到以下任何一个要点,答案都将无效:1.通过JS更改:before的样式。2.用JS更改:before的内容。如果需要,请查看我的回答。
学习者2016年


@Learner现在所有这些都有一个答案:stackoverflow.com/a/49618941/8620333
Temani Afif

Answers:


694

您还可以将内容传递给具有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

95
+1 attr(),太糟糕了,我无法将其与其他属性一起使用content演示
Maksim Vi。

28
这是因为,attr()除了CSS2之外,还没有实现任何浏览器,而CSS2本身attr()仅为该content属性定义。
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],以缩短代码长度。

  • 优点:可以将任何字符串动态插入样式中
  • 缺点:原始样式没有改变,只是被覆盖;重复使用会导致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,可以将其与第二种技术结合使用:

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之后动态设置glyphicon值(即通过其十六进制值)。content:元素(例如,content:“ \ e043”;)。它似乎对我不起作用,所以我假设它对字形图标的十六进制值也不起作用?
user2101068 2015年

@ user2101068您应该将其发布为新问题。我必须查看您正在使用的所有代码。
Blazemonger,2015年

Blazemonger,感谢您的快速回复。.不幸的是,这里有很多代码,并且剪出相关代码需要花费很多精力。我已经花了12个小时以上的时间来完成这项工作,这是我最后一次喘息的努力。我需要减少损失。我希望您可以使用上面#3中描述的技术(在代码片段之前)重新验证我的假设:十六进制值。我可以在内容元素中插入十六进制字符串,但是它将显示glyphicon十六进制值的文本,而不是实际的glyphicon。没有看到所有代码的印象?
user2101068

1
@ user2101068不要使用十六进制字符串;而是将实际的Unicode字符复制并粘贴到HTML属性中。jsfiddle.net/mblase75/Lcsjkc5y
Blazemonger,2015年

关于解决方案2和3.实际上,如果您使用:document.styleSheets [0] .insertRule(rule,index),实际上可以防止样式表(过度)增长,然后使用该索引可以在不需要时删除规则:document。 styleSheets [0] .deleteRule(index)
Picard

158

尽管它们是通过浏览器通过CSS呈现的,就像它们与其他真实DOM元素一样,但伪元素本身并不属于DOM,因为顾名思义,伪元素不是真实元素,因此您不能使用jQuery(或与此相关的任何 JavaScript API,甚至不是Selectors API)直接选择和操作它们。这适用于您要通过脚本修改其样式的所有伪元素,而不仅仅是::beforeand ::after

您只能在运行时通过CSSOM(think window.getComputedStyle())直接访问伪元素样式,而jQuery之外的CSSOM 不会公开该样式.css(),该方法也不支持伪元素。

但是,您始终可以找到其他解决方法,例如:

  • 将样式应用于一个或多个任意类的伪元素,然后在类之间进行切换(有关快速示例,请参见seucolega的答案)—这是惯用的方式,因为它使用了简单的选择器(伪元素不是)区分元素和元素状态,以及它们的预期使用方式

  • 通过更改文档样式表来操纵应用于所述伪元素的样式,这更像是一种技巧


78

您无法在jQuery中选择伪元素,因为它们不是DOM的一部分。但是,您可以在父亲元素中添加特定的类,并在CSS中控制其伪元素。

在jQuery中:

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

在CSS中:

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

48

我们还可以依靠自定义属性(又称CSS变量)来操纵伪元素。我们可以在规范中看到:

自定义属性是普通属性,因此它们可以在任何元素上声明,可以使用常规继承级联 规则进行解析,可以使用@media和其他条件规则进行条件设置,可以在HTML的style属性中使用,可以读取或设置使用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)where value是默认值,也称为回退值。

从相同的规范中,我们可以看到:

可以使用var()函数将自定义属性的值替换为另一个属性的值。var()的语法为:

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

该函数的第一个参数是要替换的自定义属性的名称。该函数的第二个参数(如果提供)是一个后备值,当引用的自定义属性无效时,它将用作替换值

然后:

要将var()替换为属性值:

  1. 如果由该var()函数的第一个参数命名的自定义属性是受动画污染的,并且该var()函数正在animation属性或它的长手之一中使用,请将该自定义属性视为该算法其余部分的初始值。
  2. 如果var()函数的第一个参数指定的自定义属性的值不是初始值,则用var()相应的自定义属性的值替换该函数。
  3. 否则,如果var()函数将后备值作为其第二个参数,则用var()后备值替换该函数。如果var()回退中有任何引用,请也替换它们。
  4. 否则,包含该var()函数的属性在计算值时间无效。

如果未设置自定义属性,或者将其设置为initialOR ,或者包含无效值,则将使用后备值。采用initial可万一有帮助的,我们要重置自定义属性为默认值。

有关

如何在CSS自定义属性(又称为CSS变量)中存储继承值?

框模型的CSS自定义属性(变量)


请注意,CSS变量可能并非在您认为相关的所有浏览器中都可用(例如IE 11):https : //caniuse.com/#feat=css-variables


@akalata是的,代码需要jQuery 3.x版本..我添加了更多详细信息以及jQuery的另一种替代方法;)
Temani Afif

这在IE 11中的效果如何?
connexo

1
@connexo像任何好的现代功能一样..它不受支持,也将无法正常工作caniuse.com/#feat=css-variables
Temani Afif

Ofc我知道,由于IE 11仍然非常重要,因此我在您的答案的开头部分就错过了该信息。
connexo

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

一种有效但不是非常有效的方法是将规则添加到具有新内容的文档中,并使用类对其进行引用。根据需要的内容,类可能需要为内容中的每个值提供唯一的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";

这是我的jQuery的两行内容,它们使用的想法是添加一个额外的类来专门引用此元素,然后附加一个样式标签(带有!important标签)以更改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的不透明度不同,并通过单击somwewhere来更改;)谢谢!

   $('#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
当心:在这里,每次处理一次这些单击时,您都将一个样式标签附加到头部。我会编写一种在添加新旧代码之前删除旧旧代码的方法。
pupitetris

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元素,其中包含您的必要属性,该属性将对目标元素的after 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

这里有很多答案,但没有答案可以帮助您操纵: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>

最终,如果您想:before通过jQuery 动态更改内容,则可以实现以下目标:

<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()除外的支持content确实很少。您可以检查caniuse.com。:root和css-variables的支持更好,但是由于它的支持还很新,因此尚不那么广泛。(也可以在caniuse.com上查看对其的支持)
BananaAcid

1

我创建了一个jQuery插件来添加css-pseudo规则,例如.css()用于特定元素。

  • 插件代码和测试用例在这里
  • 用例作为简单的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

有人评论了用完整的style元素追加到head元素,如果只进行一次,但是如果您需要多次重置它,最终会产生大量style元素,这还不错。因此,为防止出现这种情况,我在头中创建了一个带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');
    });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.