使用 JavaScript 获取元素的自定义 css 属性 (-mystyle)

IT技术 javascript css
2021-02-22 20:03:36

在某些元素具有自定义 CSS 属性的应用程序中,有没有办法通过 JavaScript 检索这样的值?

例如

<div id="myDiv" style="color:#f00;-my-custom-property:upsidedown;" />

我可以通过这两种方法访问颜色属性:

document.getElementById('myDiv').style.getPropertyValue("color")
document.getElementById('myDiv').style.color

但这些不适用于自定义属性。这完全支持吗?

6个回答

浏览器无法理解的 CSS 值将被丢弃,这解释了为什么-my-custom-property通过.style.

过去,您将不得不依赖于使用数据属性存储数据并通过 JavaScript 自己处理继承。

然而,“自定义属性”,又名“CSS 变量”,已被引入标准并由浏览器实现,截至 2019 年 5 月 9日,全球支持率约为 92%乍一看,Edge 似乎是最后一个实现的主要浏览器,版本 16 于 2017 年 10 月 16 日发布。

本质上,您需要--my-custom-property: 'foobar';在元素上设置自定义属性(例如,),并且可以使用类似getComputedStyle(your_el).getPropertyValue("--my-custom-property")返回的内容'foobar'(带有前导空格)来访问请注意前导空格和引号。它将完全按照提供的值返回值。

例子:

console.log(getComputedStyle(document.getElementById("a")).getPropertyValue("--my-custom-property-1"))
console.log(getComputedStyle(document.getElementById("b")).getPropertyValue("--my-custom-property-2"))
#b-div { --my-custom-property-2: 'world' }
<div style="--my-custom-property-1: 'hello'"><h1 id="a">#a 'hello'</h1></div>
<div id="b-div"><h1 id="b">#b 'world'</h1></div>

以下是使用一两个前导连字符、继承和不同方法检索值的一些测试:

function log(computed, selector, prop, value) {
  let method = computed ? "getComputedStyle(el)" : "el.style"
  let method_id = computed ? "computed" : "raw"

  // Build first level of list (tag name)
  let first = document.querySelector("#" + selector)
  if (!first) {
    first = document.createElement("li")
    first.appendChild(document.createTextNode(selector))
    first.setAttribute("id", selector)
    first.appendChild(document.createElement("ul"))
    document.querySelector("ul").appendChild(first)
  }

  // Build second level of list (method of style retrieval)
  let second = document.querySelector("#" + selector + "-" + method_id)
  if (!second) {
    second = document.createElement("li")
    second.appendChild(document.createTextNode(method))
    second.setAttribute("id", selector + "-" + method_id)
    second.appendChild(document.createElement("ul"))
    first.querySelector("ul").appendChild(second)
  }

  // Build third level of list (property accessed)
  let third = document.querySelector("#" + selector + "-prop" + prop)
  if (!third) {
    third = document.createElement("li")
    third.appendChild(document.createTextNode(prop + ": `" + value + "`"))
    third.setAttribute("id", "prop" + prop)
    second.querySelector("ul").appendChild(third)
    if (value === "") {
      third.classList.add("bad")
    } else {
      third.classList.add("good")
    }
  }
}

// Uses .style
function getStyleAttr(selector, prop) {
  let value = document.querySelector(selector).style.getPropertyValue(prop)
  log(false, selector, prop, value)
}

// Uses getComputedStyle()
function getStyleComputed(selector, prop) {
  let value = getComputedStyle(document.querySelector(selector)).getPropertyValue(prop)
  log(true, selector, prop, value)
}

// Loop through each property for each element and output the value
let selectors = ["article", "h1", "p"]
let props = ["--my-custom-property", "-my-custom-property"]
selectors.forEach(function(selector) {
  props.forEach(function(prop) {
    getStyleAttr(selector, prop)
    getStyleComputed(selector, prop)
  })
})
code {
  background: #eee;
  padding: .2em;
}

.bad {
  color: #800;
}

.good {
  color: #080;
}
<article class="custom-prop-inheritance" style="--my-custom-property: 'foobar'; -my-custom-property: 'foobar'">
  <h1>Title</h1>
  <p>Custom properties require two leading hyphens (<code>-my-custom-property</code> <em>never</em> works). Using <code>el.style</code> does not support inheritance. To support both inheritance and custom properties, you must use <code>getComputedStyle(<b>el</b>)</code> along with two leading hyphens on the custom property (eg, <code>--my-custom-property</code>).</p>
</article>
<ul></ul>

“最好“借用”一个有效的 CSS 属性,它可以采用任何值并具有可继承的行为” - 例如?
2021-04-22 20:03:36
如果您希望允许通过样式表修改自定义元素,这将非常有用。getComputedStyle(your_el)["defined-property"]如果您想获得 CSS 定义的样式,例如“颜色”和“字体”,则效果很好。但是,很高兴知道可以使用以下方式访问自定义属性:getComputedStyle(your_el).getPropertyValue("--my-custom-property")
2021-04-25 20:03:36
这不提供级联,这是重点。最好“借用”一个有效的 CSS 属性,它可以采用任何值并具有可继承的行为。
2021-05-12 20:03:36
“内容”可以解决问题。它不应用任何样式,它级联并接受任何值。
2021-05-16 20:03:36

CSS:

:root {
    --custom-property: #000000;
}

Javascript:

var custom_property = window.getComputedStyle(document.body).getPropertyValue('--custom-property').trim()
这绝对是正确的答案,因为大多数替代方案都需要更改文档(而不仅仅是 CSS)。然而,似乎值得一提的是 (a) 自定义属性名称必须以连字符开头;(b) 这些值是继承的,这就是为什么您的示例可以从 body 获取根属性的原因。
2021-05-03 20:03:36
杰出的。不知道通过 JS 访问这些的 window.getComputedStyle 方法!感谢磨坊
2021-05-06 20:03:36

将无法识别的 CSS 属性放在style属性中或属性中时将被忽略style.cssText

如果你想在特定元素上定义一个属性,我推荐data-attributes :
HTML:

<div id="myDiv" style="color:#f00;" data-custom-property="upsidedown" />

JavaScript:

//jQuery's method to retrieve value:
$("#myDiv").data("custom-property");
//jQuery, without parsing:
$("#myDiv").attr("data-custom-property");

// Modern browsers, native JS:
document.getElementById("myDiv").dataset["custom-property"];
// Older browsers, native JS:
document.getElementById("myDiv").getAttribute("data-custom-property");

这实际上现在对于通过 CSScontent标签使用专门的 CSS hack 的所有浏览器都是可能的这篇文章解释了如何做到这一点:

http://www.yearofmoo.com/2015/04/cross-browser-custom-css-properties.html

有趣,但由于这是一个(复杂的,对某些人来说)hack 而不是每个规范,我仍然相信“正确”的答案是不要将 CSS 用于自定义属性,而是使用 data 属性。小费+1 - 学习新的技巧总是好的!:)
2021-05-09 20:03:36
function getCustomCssProperty(elementID, propertyName){
  var style = document.getElementById(elementID).getAttribute("style");
  var entries = style.split(";");

 for (var i=0; i<entries.length; i++){
  var entry = entries[i].split(":");
  if(entry[0] == propertyName){
   return entry[1];
  }
 }  

 return null;

}
这很好,但如果分号包含在样式属性的引号内(例如作为 url 的一部分),则很容易出错。
2021-05-04 20:03:36