如何使用JS操纵伪元素
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[].addRule('.red::before','color: green'); // 支持IE
document.styleSheets[].insertRule('.red::before { color: green }', ); // 支持非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 }', ); // 支持非IE的现代浏览器
// 亦可以使用 JQuery:
$('<style>.red::before{color:green}</style>').appendTo('head');
修改伪元素的content的属性值
方法1. 使用CSSStyleSheet的insertRule来为伪元素修改样式
var latestContent = "新修改的内容";
document.styleSheets[].addRule('#jadeId::before','content: "' + latestContent + '"'); // 兼容IE浏览器 document.styleSheets[].insertRule('#jadeId::before { content: "' + latestContent + '" }', ); // 支持非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', '新修改的内容');
办公资源网址导航 https://www.wode007.com
其他小建议
伪元素的 content 属性很强大,可以写入各种字符串和部分多媒体文件。但是伪元素的内容只存在于CSS渲染树中,并不存在于真实的DOM中。所以为了SEO优化,最好不要在伪元素中包含与文档相关的内容。
修改伪元素的样式,建议使用通过更换class来修改样式的方法。因为其他两种通过插入行内CSSStyleSheet的方式是在JavaScript中插入字符代码,不利于样式与控制分离;而且字符串拼接易出错。
修改伪元素的content属性的值,建议使用利用DOM的 data-\* 属性来更改。
如何使用JS操纵伪元素的更多相关文章
- 使用JS控制伪元素的几种方法
一. 缘由: 本文源于在OSC社区中,有人提问如何用jq获取伪元素.我第一想法是强大的CSS Query应该可以获取伪元素吧. 然而事实上,CSS Query并不能.即我们不能通过$(":b ...
- 使用js获取伪元素的content
在测试过程中有时候会遇到反爬虫机制,一些元素会使用伪元素,这样在定位元素的时候会定位不到,这时候就要使用js来帮助定位,获取到想要的元素 下面是部分代码 //使用js获取伪元素的content Str ...
- js控制伪元素样式
//获取伪元素// CSS代码 #myId:before { content: "hello world!"; display: block; width: 100px; heig ...
- JS获取伪元素的属性
window下的getComputedStyle属性.getPropertyValue属性 // 获取 .element:before 的 color 值 var color = window.get ...
- js分析 汽_车_之_家 js生成css伪元素 hs_kw44_configUS::before
0.参考 https://developer.mozilla.org/zh-CN/docs/Web/CSS/Pseudo-elements https://developer.mozilla.org/ ...
- CSS3 动态生成内容(在Web中插入内容)====CSS的伪类或者伪元素
# css3 .类:伪类::伪元素 /* CSS3伪元素/伪类 :https://www.w3.org/TR/css3-selectors/#selectors ::selection 伪元素(F12 ...
- js如何控制css伪元素内容(before,after)
曾经遇到的问题,在对抗UC浏览器屏蔽需要把内容输出到css 伪元素中输出.有个疑问如何用js控制它.于是在segmentfault提问,如下是对问题的整理: 如何用js控制css伪类after 简单粗 ...
- 爬虫实战:汽车之家配置页面 破解伪元素和混淆JS
本篇介绍如何破解汽车之家配置页面的伪元素和混淆的JS. ** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/9242156.ht ...
- 使用原生js来控制、修改CSS伪元素的方法总汇, 例如:before和:after
在网页中,如果需要使用辅助性/装饰性的内容的时候,我们不应该直接写在HTML中,这样会影响真正的内容,这就需要使用伪元素了,这是由于css的纯粹语义化是没有意义的.在使用伪元素的时候,会发现js并不真 ...
随机推荐
- 对LinkedList源码的一些个人理解
由于转行的原因,最近打算开始好好学习,昨天看到了部分的LinkedList源码,并且看了一点数据结构的视频,现总结部分自己的心得体会,以供后期给现在的自己拍砖~ 双向链表每一个元素都有数据本身加指向前 ...
- 除了FastJson,你也应该了解一下Jackson(一)
在上月末的时候收到一条关于fastjson安全漏洞的消息,突然想到先前好像已经有好多次这样的事件了(在fastjson上面).关于安全方面,虽然中枪的机率微小,但是在这个信息越来越复杂的时代,安全性也 ...
- C#基础篇——委托
前言 在本章中,主要是借机这个C#基础篇的系列整理过去的学习笔记.归纳总结并更加理解透彻. 在.Net开发中,我们经常会遇到并使用过委托,如果能灵活的掌握并加以使用会使你在编程中游刃有余,然后对于很多 ...
- CSS3动画基础
编写页面 记事本或SublimeText或vscode编写html: <html> <div id="box"></div> <style ...
- Redis学习笔记(十八) 集群(下)
复制和故障转移 Redis集群中的节点分为主节点(master)和从节点(slave),其中主节点用于处理槽,而从节点则用于复制某个主节点,并在被复制 的主节点下线时,代替下线主节点继续处理命令请求. ...
- Python 中的类的继承
class parent(object): def override1(self): print("Parent") class child(parent): def overri ...
- 使用FFT进行频谱分析
import numpy as np import matplotlib.pyplot as plt from scipy.fftpack import fft fs=100 #采样频率 N=128 ...
- Jenkins入门教程(一):Windos下Jenkins的安装教程
Jenkins的安装教程 Jenkins安装前的准备 1.安装jenkins前首先确保你的电脑已经安装了JDK,由于jenkins是基于java开发的 JDK下载地址 2.下载jenkins的安装包 ...
- Android学习笔记菜单资源文件
创建菜单资源 menu_one.xml <?xml version="1.0" encoding="utf-8"?> <menu xmlns: ...
- 【JMeter_03】JMeter GUI操作界面介绍
JMeter主界面主要分为 标题栏.菜单栏.工具栏.测试计划树形目录.内容展示区 标题栏:主要展示JMeter的程序版本.当前脚本的名称.脚本的储存路径 菜单栏:程序基本上所有功能的所属分类目录,基本 ...