如何使用JS操纵伪元素

时间: 2017-12-18阅读: 5643标签: 伪类

css引入伪类和伪元素概念是为了格式化文档树以外的信息。也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句话中的第一个字母,或者是列表中的第一个元素。 


伪类 用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的元素时,我们可以通过:hover来描述这个元素的状态。虽然它和普通的css类相似,可以为已有的元素添加样式,但是它只有处于dom树无法描述的状态下才能为元素添加样式,所以将其称为伪类。


伪元素 譬如::before和::after伪元素,用于在css渲染中向元素的头部或尾部插入内容,它们不受文档约束,也不影响文档本身,只影响最终样式。这些添加的内容不会出现在DOM中,仅仅是在css渲染层中加入。它不存在于文档中,所以js无法直接操作它。而jQuery的选择器都是基于DOM元素的,因此也并不能直接操作伪元素。那该怎样操作伪元素的样式呢?为此总结整理一篇,以备查用。


有哪些伪元素

:first-letter:向文本的第一个字母添加特殊样式。 

 :first-line: 向文本的首行添加特殊样式。 

 :before:在元素之前添加内容。  

:after:在元素之后添加内容。  

::placeholder:匹配占位符的文本,只有元素设置了placeholder属性时,该伪元素才能生效。

::selection:css伪元素应用于文档中被用户高亮的部分(比如使用鼠标或其他选择设备选中的部分)  

::backdrop(处于试验阶段):用于改变全屏模式下的背景颜色,全屏模式的默认颜色为黑色。该伪元素只支持双冒号的形式  


获取伪元素的属性值

获取伪元素的属性值可以使用window.getComputedStyle()方法,获取伪元素的css样式声明对象。然后利用getPropertyValue方法或直接使用键值访问都可以获取对应的属性值。 

语法 window.getComputedStyle(element[, pseudoElement]) 

参数:element(Object):伪元素的所在的DOM元素;pseudoElement(String):伪元素类型。可选值有:”:after”、”:before”、”:first-line”、”:first-letter”、”:selection”、”:backdrop”;

譬如示例如下: 

// css代码
<style type="text/css">
#jadeId:before {
    content: "hello nicejade!";
    display: block;
    width: 100px;
    height: 100px;
    background: red;
}
</style>

// html代码
<div id="jadeId"></div>

// js代码
<script type="text/JavaScript">
var myIdElement = document.getElementById("jadeId"),
    beforeStyle = window.getComputedStyle(myIdElement, ":before");
console.log(beforeStyle); // [cssStyleDeclaration Object]
console.log(beforeStyle.width); // 100px
console.log(beforeStyle.getPropertyValue("width")); // 100px
console.log(beforeStyle.content); // "hello nicejade!"
</script>

对于如上还可以补充的是:  

 1.getPropertyValue()和直接使用键值访问,都可以访问cssStyleDeclaration Object。它们两者的区别有:

对于float属性,如果使用键值访问,则不能直接使用getComputedStyle(element, null).float,而应该是cssFloat与styleFloat;
直接使用键值访问,则属性的键需要使用驼峰写法,如:style.backgroundColor;
使用getPropertyValue()方法不可以驼峰书写形式(不支持驼峰写法),例如:style.getPropertyValue(“border-top-color”);
getPropertyValue()方法在IE9+和其他现代浏览器中都支持;在IE6~8中,可以使用getAttribute()方法来代替;

2.伪元素默认是”display: inline”。如果没有定义display属性,即使在CSS中显式设置了width的属性值为固定的大小如”100px”,但是最后获取的width值仍是”auto”。这是因为行内元素不能自定义设置宽高。解决办法是给伪元素修改display属性为”block”、”inline-block”或其他。


更改伪元素的样式

方法1. 更换class来实现伪元素属性值的更改:

// CSS代码
.red::before { content: "red"; color: red; }
.green::before { content: "green"; color: green; }

// html代码
<div class="red">内容内容内容内容</div>

// jQuery代码
$(".red").removeClass('red').addClass('green');


方法2. 使用CSSStyleSheet的insertRule来为伪元素修改样式:

document.styleSheets[0].addRule('.red::before','color: green'); // 支持IE

document.styleSheets[0].insertRule('.red::before { color: green }', 0); // 支持非IE的现代浏览器


方法3. 在<head>标签中插入

var style = document.createElement("style");
document.head.appendChild(style); sheet = style.sheet;
sheet.addRule('.red::before','color: green'); // 兼容IE浏览器

heet.insertRule('.red::before { color: green }', 0); // 支持非IE的现代浏览器

// 亦可以使用 JQuery:
$('<style>.red::before{color:green}</style>').appendTo('head');


修改伪元素的content的属性值


方法1. 使用CSSStyleSheet的insertRule来为伪元素修改样式

var latestContent = "新修改的内容";
document.styleSheets[0].addRule('#jadeId::before','content: "' + latestContent + '"');  // 兼容IE浏览器

document.styleSheets[0].insertRule('#jadeId::before { content: "' + latestContent + '" }', 0); // 支持非IE的现代浏览器


方法2. 使用DOM元素的 data-* 属性来更改content的值

// CSS代码
.jadeId::before {
    content: attr(data-attr);
    color: red;
}

// html代码
<div class="jadeId" data-attr="jadeId">nciejade.io</div>

// JacaScript代码
$('.jadeId').attr('data-attr', '新修改的内容');


其他小建议

伪元素的 content 属性很强大,可以写入各种字符串和部分多媒体文件。但是伪元素的内容只存在于CSS渲染树中,并不存在于真实的DOM中。所以为了seo优化,最好不要在伪元素中包含与文档相关的内容。 

修改伪元素的样式,建议使用通过更换class来修改样式的方法。因为其他两种通过插入行内CSSStyleSheet的方式是在JavaScript中插入字符代码,不利于样式与控制分离;而且字符串拼接易出错。 

修改伪元素的content属性的值,建议使用利用DOM的 data-\* 属性来更改。  


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/255

关闭

中间文字,两边横线的css3伪类的使用

CSS伪类是用来添加一些选择器的特殊效果。使用了css3的伪类,即相当于是在一个div中写入文字,然后在它前后各加了一个div,然后进行位置及宽高的调节。代码中只写一个div,然后在css样式中,对该div设置flex布局

理解:before伪类搭配vertical-align:middle实现垂直居中的原理

总所周知,Css如何实现元素垂直居中?已经是一个老生常谈的问题了,这个问题目前已经有了许多解决方案,这些方案也都有各自适用的场景以及优缺点,大致如下:

css获取除第一个之外的子元素

有时候我们需要用CSS选择非第一个子元素,例如下面这样的HTML,希望让两个span之间间隔一定的距离,但又不希望简单的给每个span设置margin-right(会导致最后一个span也有margin-right,可能影响之后元素的排版)。

css的伪类有哪些?

同一个标签,根据其不同的种状态,有不同的样式。这就叫做“伪类”。伪类用冒号来表示。CSS 伪类用于向某些选择器添加特殊的效果。

深入理解CSS伪类

伪类经常与伪元素混淆,伪元素的效果类似于通过添加一个实际的元素才能达到,而伪类的效果类似于通过添加一个实际的类来达到。实际上css3为了区分两者,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示。本文将详细介绍伪类的详细知识

css链接link_CSS :link 伪类

链接可以使用任何css属性,包括字体、颜色、背景等等、链接有四个状态,可在四个状态时设置不同的属性,当为链接的不同状态设置样式时,需要遵循a:hover 必须位于a:link 和a:visited之后,a:active 必须位于 a:hover 之后

css伪选择器使用总结——css中关于伪类和伪元素的知识总汇

CSS 伪类用于向某些选择器添加特殊的效果,而CSS引入伪类和伪元素的概念是为了实现基于文档树之外的信息的格式化。这里讲总结关于css伪类和伪元素的相关使用

CSS 的 :is()和 :where() 即将在浏览器中和大家见面

现在,Safari(技术预览版106)和Firefox(版本78)的预览版均支持新的CSS :is() 和 :where() 伪类。 Chrome的实施仍然落后。

CSS中一些利用伪类、伪元素和相邻元素选择器的技巧

一个评论框,后面的按钮有点赞或者发送评论两种状态,其中发送按钮有根据输入框中是否有字分为可点击和不可点击两种状态。

html中a标签的4个伪类样式

在CSS超链接的属性中,有四个连接方式:a:link a:hover a:visited a:acticve,之前在使用的时候一直是按照自认为的顺序中去写的,就是 L H V A的排序方式,然而有些时候却发现并不起作用了

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广