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

Mir*_*cea 161 javascript coding-style

我有以下JavaScript变量:

var fontsize = "12px"
var left= "200px"
var top= "100px"
Run Code Online (Sandbox Code Playgroud)

我知道我可以像这样迭代地将它们设置为我的元素:

document.getElementById("myElement").style.top=top
document.getElementById("myElement").style.left=left
Run Code Online (Sandbox Code Playgroud)

有可能一次将它们全部设置在一起,就像这样吗?

document.getElementById("myElement").style = allMyStyle 
Run Code Online (Sandbox Code Playgroud)

Lai*_*mis 253

使用Object.assign:

Object.assign(yourelement.style,{fontsize:"12px",left:"200px",top:"100px"});
Run Code Online (Sandbox Code Playgroud)

这也使您能够合并样式,而不是重写CSS样式.

您还可以创建快捷方式功能:

const setStylesOnElement = function(styles, element){
    Object.assign(element.style, styles);
}
Run Code Online (Sandbox Code Playgroud)

  • 遗憾的是IE11不支持这种方法http://kangax.github.io/compat-table/es6/#test-Object_static_methods_Object.assign (15认同)
  • @AndrewSilver-使用babel &&许多polyfill库之一​​在不兼容的浏览器中获得对ES6功能的支持。 (2认同)
  • 当您展开一个简单的 javascript 对象时,这就足够了 - 根本不需要分配任何东西:`Object.assign(document.querySelector('html').style, { color: 'red' });` ...只是确保样式不会在较低的元素中被覆盖。当在 `html` 元素上使用它时,这是很有可能的。 (2认同)
  • 警告!我认为这会导致多次重画。至少,在使用“Proxy”对象进行测试时,我发现“Object.assign”会导致多次调用“set”陷阱。 (2认同)

Fel*_*ing 232

如果您将CSS值作为字符串并且没有为该元素设置其他CSS(或者您不关心覆盖),请使用该cssText属性:

document.getElementById("myElement").style.cssText = "display: block; position: absolute";
Run Code Online (Sandbox Code Playgroud)

这在某种意义上是好的,因为它避免了每次更改属性时重新绘制元素(以某种方式"一次性"更改它们).

另一方面,您必须首先构建字符串.

  • document.getElementById("myElement").style.cssText + =';'+ cssString; 将返回element.style.cssText的'normalized'值 - 新字符串将使用任何新值替换现有命名属性,添加新值并保留其余值. (56认同)
  • @kennebec我进行了jsperf测试,发现在序列中应用多个css规则而不是使用cssText方法更快:jsperf.com/csstext-vs-multiple-css-rules/4 (32认同)
  • @kennebec:刚尝试过,你是对的.我不知道,我只是认为它附加到已有的文本.但它确实取代了价值...... (2认同)
  • @RohitTigga:包含CSS规则的字符串.例如`display:block; 位置:绝对;`. (2认同)
  • 以防万一你不想点击链接,我运行了 [来自@AndreiOniga 的测试](http://jsperf.com/csstext-vs-multiple-css-rules/4) 并*明确地设置(例如, `elem.style.width = '300px';`) 几乎比所有替代方案快一个数量级*。因此,替代方案的速度要慢 90%,而且它们都同样缓慢。 (2认同)

SHA*_*ANK 50

@Mircea:在单个语句中为元素设置多个样式非常容易.它不会影响现有属性,并且避免了循环或插件的复杂性.

document.getElementById("demo").setAttribute(
   "style", "font-size: 100px; font-style: italic; color:#ff0000;");
Run Code Online (Sandbox Code Playgroud)

小心:如果稍后使用此方法添加或更改样式属性,则将删除使用"setAttribute"设置的先前属性.


Gab*_*oli 36

创建一个函数来处理它,并使用您想要更改的样式传递参数.

function setStyle( objId, propertyObject )
{
 var elem = document.getElementById(objId);
 for (var property in propertyObject)
    elem.style[property] = propertyObject[property];
}
Run Code Online (Sandbox Code Playgroud)

并称之为这样

setStyle('myElement', {'fontsize':'12px', 'left':'200px'});
Run Code Online (Sandbox Code Playgroud)

对于propertyObject内属性的值,您可以使用变量..

  • 最佳解决方案,因为与 cssText 一样灵活有用,但速度更快。 (2认同)

Sim*_*ver 17

打字稿中的强类型:

这个object.assign 方法很棒,但是使用打字稿,你可以像这样获得自动完成功能:

    const newStyle: Partial<CSSStyleDeclaration> =
    { 
        placeSelf: 'centered centered',
        margin: '2em',
        border: '2px solid hotpink'
    };

    Object.assign(element.style, newStyle);
Run Code Online (Sandbox Code Playgroud)

请注意,属性名称采用驼峰命名法,不带破折号。

这甚至会告诉您它们何时被弃用。


Har*_*men 16

JavaScript库允许您轻松完成这些操作

jQuery的

$('#myElement').css({
  font-size: '12px',
  left: '200px',
  top: '100px'
});
Run Code Online (Sandbox Code Playgroud)

对象和for-in-loop

或者,更优雅的方法是基本对象和循环

var el = document.getElementById('#myElement'),
    css = {
      font-size: '12px',
      left: '200px',
      top: '100px'
    };  

for(i in css){
   el.style[i] = css[i];
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是在这个项目上我无法使用jQuery ... Thanx (2认同)

小智 14

在Javascript中设置多个css样式属性

document.getElementById("yourElement").style.cssText = cssString;
Run Code Online (Sandbox Code Playgroud)

要么

document.getElementById("yourElement").setAttribute("style",cssString);
Run Code Online (Sandbox Code Playgroud)

例:

document
.getElementById("demo")
.style
.cssText = "margin-left:100px;background-color:red";

document
.getElementById("demo")
.setAttribute("style","margin-left:100px; background-color:red");
Run Code Online (Sandbox Code Playgroud)


Thi*_*ous 13

我只是在这里偶然发现,我不明白为什么需要这么多代码来实现这一目标.

将CSS代码添加为字符串.

let styles = `
    font-size:15em;
    color:red;
    transform:rotate(20deg)`

document.querySelector('div').style = styles
Run Code Online (Sandbox Code Playgroud)
<div>a</div>
Run Code Online (Sandbox Code Playgroud)

  • 我也使用这个方法,因为如果你没有其他内联样式,它很有用,但有时它会引起问题。 (2认同)

Sac*_*hag 6

您可以在 css 文件中包含单独的类,然后将类名分配给您的元素

或者您可以循环遍历样式的属性 -

var css = { "font-size": "12px", "left": "200px", "top": "100px" };

for(var prop in css) {
  document.getElementById("myId").style[prop] = css[prop];
}
Run Code Online (Sandbox Code Playgroud)

  • @Sachin“font-size”需要采用驼峰式命名为“fontSize”。连字符样式名称不能保证跨浏览器工作,除非您使用 setAttribute。 (2认同)

小智 5

对我来说最简单的方法就是使用字符串/模板文字:

elementName.style.cssText = `
                                width:80%;
                                margin: 2vh auto;
                                background-color: rgba(5,5,5,0.9);
                                box-shadow: 15px 15px 200px black; `;
Run Code Online (Sandbox Code Playgroud)

很好的选择,因为您可以使用多个线串,让生活变得轻松。

在这里查看字符串/模板文字:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals