我知道我可以通过JavaScript 设置 CSS值,例如:
document.getElementById('image_1').style.top = '100px';
但是,我可以获得当前的特定样式值吗?我已经读到了可以获取元素整个样式的地方,但是如果不需要的话,我不想解析整个字符串。
var top = document.getElementById('image_1').style.top;
,如果不是那样的话,您可能会想要像May想要改写它
我知道我可以通过JavaScript 设置 CSS值,例如:
document.getElementById('image_1').style.top = '100px';
但是,我可以获得当前的特定样式值吗?我已经读到了可以获取元素整个样式的地方,但是如果不需要的话,我不想解析整个字符串。
var top = document.getElementById('image_1').style.top;
,如果不是那样的话,您可能会想要像May想要改写它
Answers:
您可以使用getComputedStyle()
。
var element = document.getElementById('image_1'),
style = window.getComputedStyle(element),
top = style.getPropertyValue('top');
element.style属性仅让您知道在该元素中定义为内联的CSS属性(以编程方式或在元素的style属性中定义),您应该获取计算出的样式。
以跨浏览器的方式进行操作并非易事,IE通过element.currentStyle属性具有自己的方式,而其他浏览器通过document.defaultView.getComputedStyle方法实现的DOM Level 2标准方式。
两种方式有所不同,例如IE element.currentStyle属性期望您访问由camelCase中的两个或更多单词组成的CSS属性名称(例如maxHeight,fontSize,backgroundColor等),标准方法期望具有用破折号分隔的单词(例如,最大高度,字体大小,背景颜色等)。......
function getStyle(el, styleProp) {
var value, defaultView = (el.ownerDocument || document).defaultView;
// W3C standard way:
if (defaultView && defaultView.getComputedStyle) {
// sanitize property name to css notation
// (hyphen separated words eg. font-Size)
styleProp = styleProp.replace(/([A-Z])/g, "-$1").toLowerCase();
return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
} else if (el.currentStyle) { // IE
// sanitize property name to camelCase
styleProp = styleProp.replace(/\-(\w)/g, function(str, letter) {
return letter.toUpperCase();
});
value = el.currentStyle[styleProp];
// convert other units to pixels on IE
if (/^\d+(em|pt|%|ex)?$/i.test(value)) {
return (function(value) {
var oldLeft = el.style.left, oldRsLeft = el.runtimeStyle.left;
el.runtimeStyle.left = el.currentStyle.left;
el.style.left = value || 0;
value = el.style.pixelLeft + "px";
el.style.left = oldLeft;
el.runtimeStyle.left = oldRsLeft;
return value;
})(value);
}
return value;
}
}
跨浏览器解决方案,无需DOM操作即可检查CSS值:
function get_style_rule_value(selector, style)
{
for (var i = 0; i < document.styleSheets.length; i++)
{
var mysheet = document.styleSheets[i];
var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
for (var j = 0; j < myrules.length; j++)
{
if (myrules[j].selectorText && myrules[j].selectorText.toLowerCase() === selector)
{
return myrules[j].style[style];
}
}
}
};
用法:
get_style_rule_value('.chart-color', 'backgroundColor')
消毒版本(将选择器输入强制为小写,并允许使用情况时不加“。”。)
function get_style_rule_value(selector, style)
{
var selector_compare=selector.toLowerCase();
var selector_compare2= selector_compare.substr(0,1)==='.' ? selector_compare.substr(1) : '.'+selector_compare;
for (var i = 0; i < document.styleSheets.length; i++)
{
var mysheet = document.styleSheets[i];
var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
for (var j = 0; j < myrules.length; j++)
{
if (myrules[j].selectorText)
{
var check = myrules[j].selectorText.toLowerCase();
switch (check)
{
case selector_compare :
case selector_compare2 : return myrules[j].style[style];
}
}
}
}
}
如果以编程方式进行设置,则可以像变量一样调用它(即document.getElementById('image_1').style.top
)。否则,您始终可以使用jQuery:
<html>
<body>
<div id="test" style="height: 100px;">Test</div>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript">
alert($("#test").css("height"));
</script>
</body>
</html>
2020年
使用前检查
您可以使用computedStyleMap()
答案是正确的,但有时您需要检查它返回的单位,而无需返回任何单位slice()
或substring()
字符串。
var element = document.querySelector('.js-header-rep');
element.computedStyleMap().get('padding-left');
var element = document.querySelector('.jsCSS');
var con = element.computedStyleMap().get('padding-left');
console.log(con);
.jsCSS {
width: 10rem;
height: 10rem;
background-color: skyblue;
padding-left: 10px;
}
<div class="jsCSS"></div>
为了安全起见,您可能希望在尝试读取元素之前先检查该元素是否存在。如果不存在,则您的代码将引发异常,这将停止在其余JavaScript上执行,并可能向用户显示错误消息-不好。您希望能够优雅地失败。
var height, width, top, margin, item;
item = document.getElementById( "image_1" );
if( item ) {
height = item.style.height;
width = item.style.width;
top = item.style.top;
margin = item.style.margin;
} else {
// Fail gracefully here
}
上面给出的没有DOM操作的跨浏览器解决方案不起作用,因为它给出了第一个匹配规则,而不是最后一个匹配规则。最后一个匹配规则是适用的规则。这是一个工作版本:
function getStyleRuleValue(style, selector) {
let value = null;
for (let i = 0; i < document.styleSheets.length; i++) {
const mysheet = document.styleSheets[i];
const myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
for (let j = 0; j < myrules.length; j++) {
if (myrules[j].selectorText &&
myrules[j].selectorText.toLowerCase() === selector) {
value = myrules[j].style[style];
}
}
}
return value;
}
但是,这种简单的搜索在使用复杂的选择器的情况下将不起作用。