检索或更改伪元素的 CSS 规则

2023-11-26

编辑 2015-10-07 1624 CST

这个问题已被标记为可能重复 - 我发布它的原因是其他问题的答案都没有提供我想要的所有信息,我想要一种简单而直接的方法来做到这一点。我可以负责控制样式表和规则的顺序,以便引用正确的规则。我还希望得到关于这种方法在未来突破的可行性的反馈。

请查看我在下面发布的评论,了解我不接受可能重复问题的答案的其他原因。

** 原问题如下 **

我搜索了这样的问题,发现一些问题解决了部分问题,但没有同时检索和更改伪元素的 CSS 值,例如::before and ::after.

在来这里之前我已经用谷歌搜索过网络,基本上我发现没有理想的方法来做到这一点。

我找到了一种适用于 FF 40、IE 9 和 Chrome 45.0.2454.101 m 的方法,但我想知道我是否忽略了一些可能导致我的方法在某些情况下中断的问题。

我在这里和网络上其他地方看到的关于访问或更改伪元素的 CSS 值的答案说,您无法直接访问这些项目,因为它们不是“DOM 的一部分”和“DOM 之外” ”

他们说改变它们的唯一方法是创建一个新规则并将其附加到现有规则以覆盖编码值。

这是演示该方法的片段:

function changeColor () { // Flip psedo element's background color
	var newColor,
		currentColor;
	
    // Get the current color
	currentColor= document.styleSheets[0].cssRules[0].style.backgroundColor;  
	
    // flip the color
	newColor = (currentColor== "red") ? "aqua" : "red";  					  
	
     // Change the color
    document.styleSheets[0].cssRules[0].style.backgroundColor = newColor;  	  
    
    // put color in top message
    document.getElementById("colorIs").innerHTML = newColor;
  
    // display colors  
	document.getElementById("displayColors").innerHTML = 
			"Pevious color was " + currentColor + 
            ", changed to " + newColor + ".";  
            
    // Change background of button (not needed but thought I'd throw it in)
    document.getElementById("changeButton").style.backgroundColor = newColor;                      
}
#testDiv::before {
      background-color: aqua;
	  content: "psedo element ";
  }

#changeButton {
	background-color: aqua;
}
<div id="testDiv">
  This divsion has an pseudo ::before element whose background color is
  <span id="colorIs">
		aqua
	</span>
  <br>
  <br> Click "Display and Flip Color" to display the colors
  <br> and flip the color from aqua and red and vice versa.
</div>
<br>
<form method="post">
  <input id="changeButton" name="change" type="button" value="Display and Flip Color" onclick="changeColor();">
</form>
<br>
<div id="displayColors">
</div>

我意识到这取决于我对样式表顺序和其中规则的了解,但我可以控制它。

这些似乎与我看到的答案相矛盾,这些答案说伪元素的 CSS 项不是 DOM 的一部分,因此无法通过 DOM 访问。

由于我阅读的答案发布后浏览器或 DOM 发生了更改,此方法是否可行?

这种方法将来失效的可能性有多大?

那些使用不同版本的各种浏览器的人能否尝试一下该代码片段并让我知道它是否有效?

Bob


编辑 2015-10-08 1352 CST

我修改了访问伪元素样式的方法,以便能够直接引用相关样式表,无论其定义顺序如何。

我会更改代码片段,但我没有找到为 css“样式表”提供 id 的方法。

相反,我会告诉你如何修改它。

1) 将定义正在使用的元素的 CSS 分开,并将其放在单独的文件中。

2) 代码 id= 上<link引用 CSS 文件的标记。在这种情况下我会使用 id="colorFlipFlop"

3) 更改 JavaScript 以引用或更改样式:

currentColor = document.styleSheets[0].cssRules[0].style.backgroundColor;

document.styleSheets[0].cssRules[0].style.backgroundColor = newColor;

To:

var beforeIndex = 0; // give a name to the index, in cssRules, of the rule we want to get and change.

var styleSheetObject = document.getElementById("colorFlipFlop"); // get a reference to the stylesheet object

currentColor = styleSheetObject.sheet.cssRules[beforeIndex].style.backgroundColor;   // get current pseudo element background color

styleSheetObject.sheet.cssRules[beforeIndex].style.backgroundColor = newColor; // set new background color

如果我认为有必要,我会在 CSS 和 Javascript 以及 HTML 中完整记录所有这些内容,并提供尽可能多的注释来解释我在做什么、我是如何做的以及我为什么这样做按照我现在的方式去做——我称之为评论的WHW。

我觉得这使得功能更易于管理并且更防弹。

现在,您不再需要样式表对象的索引,所有内容都与页面上的其他所有内容整齐地分开,并且它仍然提供了访问和更改伪元素样式的直接方法,而无需创建和附加新规则。

在发布此编辑之前,我将创建一个包含 CSS、JavaScript 和 HTML 的文件,以实现代码片段显示新方法的功能。我会将所有内容放在一个文件中,以便更轻松地创建站点并通过 FTP 传输到该站点。在现实世界的代码中,我会使用单独的 CSS、JavaScript 和 HTML 文件。

它将在http://thetesting.site/flipFlopColor.html

所以你怎么看?


操纵CSSRule而不是 DOM 元素是一个晦涩但完全有效的(并且标准化) 改变元素样式的方法。它之所以晦涩难懂,是因为它很困难,需要一个嵌套循环遍历所有样式表中的所有规则才能找到您想要更改的规则。它之所以晦涩难懂还因为它不是超级有价值——通常只需访问 DOM 元素即可完成同样的事情style财产。

但是,对于伪元素,没有 DOM 元素。伪元素是样式规则的产物,因此操作伪元素的唯一方法是通过样式规则。人们建议添加样式规则,因为这比查找样式规则并编辑它更容易。但查找并编辑它是完全有效的。

通过添加一次样式规则,然后保留对该规则的引用并对同一规则进行后续编辑,您可以两全其美。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检索或更改伪元素的 CSS 规则 的相关文章

  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 如何将内联 JavaScript 与 Express/Node.js 中动态生成的内容分开?

    对于具有几年 Web 开发经验但没有找到答案的人来说 这是一个有点菜鸟的问题程序员堆栈交换 or Google 我决定在这里问一下 我在用Express网络框架Node js 但这个问题并不特定于任何 Web 框架或编程语言 以下是从数据库
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 删除子元素上的 CSS 过滤器

    我的 CSS 代码有问题 正如您所看到的 我在 li 元素上有过滤器 但它覆盖了其他元素 我需要使其他两个元素没有过滤器 有没有可能这样做 main width 300px height 300px background color blu
  • 最大宽度调整以适应文本?

    不是最好的标题 但无论如何 我有一个元素max width和一些文字 如果文本长度超过一行所能容纳的长度 我会得到以下结果 My text here hello everyone 换句话说 它占据了完整的最大宽度 但由于单词向下移动 右侧有
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • CSS 类命名约定

    在网页上 有两个控件块 主要和次要 大多数人会使用什么类名 选择一 div class primary controls div
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • 如何制作没有 ng-repeat 的模板并使用 Angular-drag-and-drop-lists 将数据传递到 $scope?

    我想用角度拖放列表 https github com marceljuenemann angular drag and drop lists使用我自己的网格模板到所见即所得编辑器 如何构建我自己的 HTML 模板而不需要ng repeat因
  • 使用 CSS 使一行 div 高度相同

    我有一排必须具有相同高度的 div 但我无法提前知道该高度可能是多少 内容来自外部源 我最初尝试将 div 放置在封闭的 div 中并将它们向左浮动 然后我将它们的高度设置为 100 但这没有明显的效果 通过将封闭 div 的高度设置为固定
  • 网站的主体和元素固定在 980px 宽度上,不会缩小

    我试图在 Rails 应用程序顶部启动前端 仅 HTML CSS 页面 但在使用 320px 视口时遇到问题 有些元素不会按比例缩小 我不明白为什么 我已经完成了检查元素 为各种元素提供了max width 100 and or width
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • Javascript split 不是一个函数

    嘿朋友们 我正在使用 javascript sdk 通过 jQuery facebook 多朋友选择器在用户朋友墙上发布信息 但是我收到此错误friendId split 不是函数 这是我的代码 function recommendToFr
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 在 Shopify 商店中嵌入 Vue 组件

    在产品页面中 我尝试显示自定义 Vue 组件 为简洁起见 该组件根据给定的产品 ID 显示 Firebase 数据库中的一些信息 我最初尝试将其制作为 Shopify 应用程序 以便我可以访问他们的 API 我实现了 OAuth 并且可以检
  • Jquery - 选择选项后如何获取选项的特定数据类型?

    我将直接跳到标记 然后解释我想要做什么 HTML 选择选项

随机推荐

  • ggvis 中带有数字的热图

    我正在尝试使用 ggvis 中 ggplot2 中的数字复制热图 ggplot2版本是 library ggplot2 hec lt as data frame xtabs Freq Hair Eye HairEyeColor ggplot
  • 将第三方js文件导入到Angular TypeScript项目中

    在我使用 Angular 的经历中 我被迫使用四种不同的方式来包含第 3 方库poliglot js 对于多语言 所以能够使用new Polyglot 在我的朗课上 export class Lang constructor this po
  • iPhone/iPad 上的 PDF 超链接

    我一直在浏览谷歌和SO 但还没有找到我的问题的答案 或者至少没有找到更新的答案 我有一个包含超链接 热点的 PDF 并且想在我自己的 iPhone iPad 应用程序中显示该 PDF 文件 当用户单击超链接 热点时 我希望将用户带到链接的适
  • JPA ManyToMany,JoinTable怎么会有属性?

    我有一个关于EJB中ManyToMany设计的问题 jointable如何拥有属性 举个例子 学生和课程都是ManyToMany 每个学生有很多门课程 很多学生选择一门课程 Entity public class Student imple
  • 聚焦时更改 mat-select-arrow 和 mat-select-underline

    到目前为止 我已经尝试了很多不同的事情 例如 deep mat select focus mat select trigger mat select arrow color 63961C deep mat select focus mat
  • 平滑这个 jQuery 切换动画吗?

    所制作的动画我的 jQuery 函数不稳定 我一直在寻找不同的 SO 解决方案 例如添加 jquery easing 但没有运气 问题是每个 div 中的 iframe 吗 关于如何平滑动画有什么想法吗 我的基本切换功能是最好的方法吗 JS
  • Codeigniter 4 - 如何显示404页面?

    这是一个非常愚蠢的问题 但我无法处理它 在 Codeigniter 3 中 我只是在任何控制器中使用 show 404 函数来显示 404 页面 我怎样才能用 Codeigniter 4 做同样的事情 我刚才正在寻找同样的东西 我在这里找到
  • Angular 2. 如何在 Observable 中使用重定向处理 4xx 错误?

    我有一个调用 api 的服务 getItems itemId number Observable
  • 在实体框架 6 中调用标量值函数

    如何在实体框架 6 中调用标量函数 我尝试过以下代码 using MhEntities DContext new MhEntities var Account IdParameter Account Id HasValue new Obje
  • PHP 取消链接不起作用

    我正在尝试使用 unlink 删除 php 中的照片 我之前在其他服务器上使用过它 但这次它不起作用 我已经使用绝对路径进行测试 但仍然不起作用 我把它用作 取消链接 img1 jpg and unlink http www mysite
  • Django ORM 在注释多个聚合列时删除不需要的 Group by

    我想在 django ORM 中创建一个类似这样的查询 SELECT COUNT CASE WHEN myCondition THEN 1 ELSE NULL end as numyear FROM myTable 以下是我编写的 djan
  • Rails 设计,没有路线匹配注销

    尽管有很多类似的问题 但我已经搜索了几个小时但仍然无法解决它 环境 导轨3 0 9 红宝石 1 9 2 设计1 4 2 我使用以下方法更改了默认登录网址 5 resources users 6 devise for users path g
  • 如何在VS2015中构建OpenSSL:x86cpuid.asm是一个空文件

    我需要为使用 VS2015 32 位 的项目构建 OpenSSL 我找到的说明是http developer covenanteyes com building openssl for visual studio 据报道 更新 编辑版本使用
  • 如何在 SwiftUI 中将苹果 ColorPicker 的布局从圆形更改为方形?

    ColorPicker默认的按钮样式是圆形 如下所示 我想将圆形按钮的样式更改为矩形 但似乎没有 API 可以改变它的风格 所以我在它上面放了一个矩形 并将它的 allowedHitTesting 设置为 false 以将单击事件传输到 C
  • 如何实现 DaggerService

    我已经了解了基础知识以及课程 但是对于 dagger 甚至 dagger 2 来说是新手 我不知道应该如何使用它 这是 dagger 意图服务 https google github io dagger api latest dagger
  • 如何将表或行传递给 Postgresql 中的函数?

    这是代码 当前参数类型是数组 但我想传递一个表或行 create or replace function skyband sortedlist rest point returns setof point as declare last x
  • 如何在 C# 中高效处理大量更新对象?

    我正在使用 C 和 XNA 开发 2D 头顶射击游戏 我有一个类 我将其称为 bullet 并且需要每隔几分之一秒更新其中许多实例 我的第一个方法是拥有一个通用的项目符号列表 然后根据需要简单地删除和添加新的项目符号 但在这样做的过程中 G
  • 如何在不使用 setGridLinesVisible() 方法的情况下永久显示 GridPane 对象网格线?

    是否可以使所有GridPane的网格线永久可见而不使用setGridLinesVisible 我知道setGridLinesVisible 仅用于调试目的 我想显示网格线以方便最终用户 另外 我需要在窗格容器而不是画布上工作 我的程序能够在
  • iOS:保存为 PNG 表示数据后图像旋转 90 度

    我已经进行了足够的研究来使其正常工作 但无法修复它 从相机拍照后 只要我将图像存储为 UIImage 就可以了 但是一旦我将此图像存储为 PNG 表示形式 它就会旋转 90 度 以下是我的代码和我尝试过的所有操作 void imagePic
  • 检索或更改伪元素的 CSS 规则

    编辑 2015 10 07 1624 CST 这个问题已被标记为可能重复 我发布它的原因是其他问题的答案都没有提供我想要的所有信息 我想要一种简单而直接的方法来做到这一点 我可以负责控制样式表和规则的顺序 以便引用正确的规则 我还希望得到关