如何在JavaScript中设置多个CSS样式?

301

我有以下JavaScript变量:

var fontsize = "12px"
var left= "200px"
var top= "100px"
我知道我可以通过迭代的方式来设置元素,例如:
document.getElementById("myElement").style.top=top
document.getElementById("myElement").style.left=left

是否可能一次性将它们全部设置,像这样?

document.getElementById("myElement").style = allMyStyle 

1
在您的示例中,“allMyStyle”是什么? 在开头,您有一个单个变量列表... - Felix Kling
1
字体大小:12像素;左侧:200像素;顶部:100像素。 - Mircea
1
如果这能够工作,它将是一个包含所有要设置的CSS的字符串:document.getElementById("myElement").style = font-size:12px; left:200px; top:100px - Mircea
有趣的是,似乎按顺序应用多个CSS规则而不是使用cssText方法更快:http://jsperf.com/csstext-vs-multiple-css-rules/4 - Andrei Oniga
或许有用 - undefined
29个回答

4

使用纯JavaScript时,您无法同时设置所有样式; 您需要为每个样式使用单行。

但是,您不必一遍又一遍地重复使用document.getElementById(...).style.代码; 创建一个对象变量来引用它,您的代码将更加易读:

var obj=document.getElementById("myElement").style;
obj.top=top;
obj.left=left;

...等等。比您的示例更易读(而且说实话,与jQuery替代方案一样容易阅读)。

(如果Javascript被正确设计,您还可以使用with关键字,但最好不要用它,因为它可能会引起一些严重的命名空间问题)


1
这并不是真的,你可以通过cssText一次性设置所有样式。 - Felix Kling
3
@Felix:cssText适用于设置内联样式表的值。然而,如果您还有类,或者只想覆盖某些值而不是全部值,使用cssText可能会很困难。所以你是正确的;虽然可以这样做,但对于大多数情况,我建议不要使用它。 - Spudley
1
拥有类并不是一个论点... obj.top 或者 obj.style.color 也只是设置内联样式表的值。而且,是的,在我的回答中我说过,其中一个会覆盖另一个的值... 这取决于上下文是否有用。 - Felix Kling
1
最好将其写成 obj=document.getElementById("myElement").style; 或者设置您的属性 obj.style.top=top。 - kennebec
@kennebec - 嗯,我本来以为我已经做了那个。好吧,编辑一下。谢谢你发现了这个问题。 - Spudley

3

由于字符串支持添加,您可以在不覆盖当前样式的情况下轻松添加新样式:

document.getElementById("myElement").style.cssText += `
   font-size: 12px;
   left: 200px;
   top: 100px;
`;

2

这是一个旧帖子,所以我认为对于任何寻找现代答案的人来说,我建议使用Object.keys()函数。

var myDiv = document.getElementById("myDiv");
var css = {
    "font-size": "14px",
    "color": "#447",
    "font-family": "Arial",
    "text-decoration": "underline"
};

function applyInlineStyles(obj) {
    var result = "";
    Object.keys(obj).forEach(function (prop) {
        result += prop + ": " + obj[prop] + "; ";
    });
    return result;
}

myDiv.style = applyInlineStyles(css);

2
请参见for ... in
示例:
var myStyle = {};
myStyle.fontsize = "12px";
myStyle.left= "200px";
myStyle.top= "100px";
var elem = document.getElementById("myElement");
var elemStyle = elem.style;
for(var prop in myStyle) {
  elemStyle[prop] = myStyle[prop];
}

2

不要认为这是可能的。

但是你可以将样式定义创建为一个对象,然后遍历它们。

var allMyStyle = {
  fontsize: '12px',
  left: '200px',
  top: '100px'
};

for (i in allMyStyle)
  document.getElementById("myElement").style[i] = allMyStyle[i];

为了进一步开发,为其创建一个函数:
function setStyles(element, styles) {
  for (i in styles)
    element.style[i] = styles[i];
}

setStyles(document.getElementById("myElement"), allMyStyle);

2
您最好的选择可能是创建一个函数,自己设置样式:
var setStyle = function(p_elem, p_styles)
{
    var s;
    for (s in p_styles)
    {
        p_elem.style[s] = p_styles[s];
    }
}

setStyle(myDiv, {'color': '#F00', 'backgroundColor': '#000'});
setStyle(myDiv, {'color': mycolorvar, 'backgroundColor': mybgvar});

请注意,您仍需要使用与JavaScript兼容的属性名称(因此为backgroundColor)。

2
在样式对象的Object.entries中使用CSSStyleDeclaration.setProperty()方法。我们还可以通过此方法为CSS属性设置优先级(“important”)。我们将使用“连字符-”CSS属性名称。

const styles = {
  "font-size": "18px",
  "font-weight": "bold",
  "background-color": "lightgrey",
  color: "red",
  "padding": "10px !important",
  margin: "20px",
  width: "100px !important",
  border: "1px solid blue"
};

const elem = document.getElementById("my_div");

Object.entries(styles).forEach(([prop, val]) => {
  const [value, pri = ""] = val.split("!");
  elem.style.setProperty(prop, value, pri);
});
<div id="my_div"> Hello </div>


1

有些情况下,使用CSS和JavaScript一起解决问题可能更加合理。请看以下代码:

document.getElementById("myElement").classList.add("newStyle");
document.getElementById("myElement").classList.remove("newStyle");

这只是简单地在CSS类之间切换,解决了许多与覆盖样式相关的问题。它甚至可以使您的代码更整洁。


1

这是一个老问题,但我认为对于不想覆盖先前声明的样式的任何人来说,使用函数可能是值得的。下面的函数仍然使用Object.assign来正确地修复样式。这是我所做的。

function cssFormat(cssText){

   let cssObj = cssText.split(";");
   let css = {};
   
   cssObj.forEach( style => {

       prop = style.split(":");

       if(prop.length == 2){
           css[prop[0]].trim() = prop[1].trim();
       } 

   }) 
   
  return css;
}

现在你可以做这样的事情:
let mycssText = "background-color:red; color:white;";
let element = document.querySelector("body");

Object.assign(element.style, cssFormat(mycssText));

你可以通过将元素选择器和文本都提供给函数来简化此操作,这样你就不必每次都使用Object.assign。例如:
function cssFormat(selector, cssText){
  
   let cssObj = cssText.split(";");
   let css = {};
   
   cssObj.forEach( style => {

       prop = style.split(":");

       if(prop.length == 2){
           css[prop[0]].trim() = prop[1].trim();
       } 

   }) 

   element = document.querySelector(selector);
   
   Object.assign(element.style, css); // css, from previous code

} 

现在你可以做到:

cssFormat('body', 'background-color: red; color:white;') ;

//or same as above (another sample) 
cssFormat('body', 'backgroundColor: red; color:white;') ; 

注意:在选择文档或目标元素(例如body)之前,请确保已经加载。

1

我认为这是一种非常简单的方法,适用于以上所有解决方案:

const elm = document.getElementById("myElement")

const allMyStyle = [
  { prop: "position", value: "fixed" },
  { prop: "boxSizing", value: "border-box" },
  { prop: "opacity", value: 0.9 },
  { prop: "zIndex", value: 1000 },
];

allMyStyle.forEach(({ prop, value }) => {
  elm.style[prop] = value;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接