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


189

我有以下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 2010年

1
font-size:12px; 左:200px; 上:100px
Mircea 2010年

1
如果可行,它将是一个包含所有要设置的CSS的字符串:document.getElementById(“ myElement”)。style = font-size:12px; 左:200px; 顶部:100像素
Mircea,2010年

@Mircea:看看我的答案。...可以使用cssText
Felix Kling 2010年

@Felix Kling,这就是我想要的。不进行大量重排和重涂。我不确定它是否可以与我的代码一起使用,但是应该是这样!Thanx
Mircea 2010年

Answers:


275

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

document.getElementById("myElement").style.cssText = "display: block; position: absolute";

从某种意义上说,这是很好的,因为它避免了每次更改属性时都重新绘制元素(以某种方式“一次”更改所有元素)。

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


64
document.getElementById(“ myElement”)。style.cssText + =';'+ cssString; 将为element.style.cssText返回一个“归一化”的值-新字符串将用任何新值替换现有的命名属性,添加新的并将其余的保留。
肯纳贝克

2
@kennebec:尝试过,您是对的。我不知道,我只是认为它会附加到已经存在的文本中。但这确实取代了价值观……
Felix Kling 2010年

1
我希望有人能得到并使用它-我从未见过有记载。好的,顺便说一句。
肯纳贝克

33
@kennebec我进行了jsperf测试,发现在序列中应用多个css规则比使用cssText方法更快:jsperf.com/csstext-vs-multiple-css-rules/4
Andrei Oniga

2
@RohitTigga:包含CSS规则的字符串。例如display: block; position: absolute;
菲利克斯·克林

279

使用Object.assign

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

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

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

const setStylesOnElement = function(styles, element){
    Object.assign(element.style, styles);
}


2
@AndrewSilver-使用babel &&许多polyfill库之一​​在不兼容的浏览器中获得对ES6功能的支持。
Periata Breatta '16

1
使用babel时,这是可以使用的方法!完善!
nirazul

1
@Nirazul如何使用?我尝试了,document.querySelector('html').style = Object.assign({}, document.querySelector('html').style, { color: 'red'})但没有任何反应。
乔纳森·迪翁

1
当您扩展一个简单的javascript对象时,这就足够了-根本不需要分配任何内容:Object.assign(document.querySelector('html').style, { color: 'red' });...只要确保样式不被下部元素覆盖即可。在html元素上使用它的可能性很高。
nirazul

51

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

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

注意:如果以后使用此方法添加或更改样式属性,则使用'setAttribute'设置的先前属性将被删除。


removeAttribute对于那些可能想使用setAttribute重置样式的人来说可能会派上用场
che-azeh 18/02/23

40

制作一个函数来处理它,并以您想要更改的样式传递参数。

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

并这样称呼它

setStyle('myElement', {'fontsize':'12px', 'left':'200px'});

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


我每次都单独使用.style属性,以便在更改样式时不覆盖它,但是效果更好,更简洁。
Dragonore 2014年

1
最佳解决方案,因为它与cssText一样灵活且有用,但速度更快。
西蒙·斯坦伯格2015年

17

JavaScript库可让您轻松完成这些操作

jQuery的

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

对象和循环中

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

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

for(i in css){
   el.style[i] = css[i];
}

2
是的,但是在这个项目上我不能使用jQuery ... Thanx
Mircea 2010年

需要写fontsize作为fontSize吗?
2013年

1
是。即使使用字符串符号,属性也区分大小写。它应该是fontSize:12px。
MyNameIsKo 2013年

我会说font-size;)
mikus 2015年

14

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

document.getElementById("yourElement").style.cssText = cssString;

要么

document.getElementById("yourElement").setAttribute("style",cssString);

例:

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

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

13

我只是在这里偶然发现,而我不明白为什么要实现这一目标需要大量代码。

将您的CSS代码添加为字符串。

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

document.querySelector('*').style = styles
a


1
我也使用此方法,因为如果您没有其他内联样式,该方法很有用,但有时会引起问题。
Любопытный

如果出现问题,则仅是由于错误的实施。这完全取决于将其应用于代码的方式,时间和位置。
Thielicious

3

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

或者您可以通过以下方式遍历样式的属性:

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

for(var prop in css) {
  document.getElementById("myId").style[prop] = css[prop];
}

这不是一个选择,因为变量是动态的
Mircea 2010年

这并不是用户要求的,但这很可能是最可行的解决方案。+1
Ryan Kinal

2
@Sachin的“ font-size”必须用驼峰大小写为“ fontSize”。除非您使用setAttribute,否则不能保证在所有浏览器中都可以使用催眠的样式名称。
Ashwin Prabhu 2014年

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

使用普通的Javascript,您无法一次设置所有样式。您需要为每条线使用一行。

但是,您不必一遍document.getElementById(...).style.又一遍地重复代码。创建一个对象变量以引用它,您将使代码更具可读性:

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

...等等。比您的示例更容易阅读(坦率地说,与jQuery替代一样容易阅读)。

(如果对Javascript进行了适当的设计,则也可以使用该with关键字,但是最好不要使用它,因为它可能会导致一些令人讨厌的名称空间问题)


1
事实并非如此,您可以通过一次设置所有样式cssText
Felix Kling

2
@Felix:cssText适合设置内联样式表值。但是,如果您还拥有类,或者如果您只想覆盖某些值而不是全部值,则可能很难使用cssText。所以你是对的。您可以做到,但在大多数情况下,我建议您不要这样做。
Spudley

1
拥有类不是参数... obj.top或者obj.style.color也可以设置内联样式表值。是的,在我的回答中,我说过一个将覆盖值……这取决于上下文是否有用。
Felix Kling 2010年

1
您最好使obj = document.getElementById(“ myElement”)。style; 或设置属性obj.style.top = top。
肯纳贝克

@kennebec-嗯,本来可以发誓的。哦,很好,已编辑。感谢您的发现。
Spudley 2010年

1

最好的选择是创建一个可以自行设置样式的函数:

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


1

在中查看..

例:

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];
}

1

这是旧线程,所以我想找一个寻找现代答案的人,建议使用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);

1

在某些情况下,将CSS与javascript一起使用可能会更解决此类问题。看下面的代码:

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

只需在CSS类之间切换即可解决与覆盖样式相关的许多问题。它甚至使您的代码更整洁。


0

您可以编写一个函数,该函数将分别设置声明,以便不覆盖您没有提供的任何现有声明。假设您有此对象参数的声明列表:

const myStyles = {
  'background-color': 'magenta',
  'border': '10px dotted cyan',
  'border-radius': '5px',
  'box-sizing': 'border-box',
  'color': 'yellow',
  'display': 'inline-block',
  'font-family': 'monospace',
  'font-size': '20px',
  'margin': '1em',
  'padding': '1em'
};

您可能会编写一个如下所示的函数:

function applyStyles (el, styles) {
  for (const prop in styles) {
    el.style.setProperty(prop, styles[prop]);
  }
};

其中包含elementobject样式声明的属性列表以应用于该对象。这是一个用法示例:

const p = document.createElement('p');
p.textContent = 'This is a paragraph.';
document.body.appendChild(p);

applyStyles(p, myStyles);
applyStyles(document.body, {'background-color': 'grey'});


0

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

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;
});

0

CSSStyleDeclaration.setProperty()Object.entriesstyles对象内部使用方法。
我们还可以使用此属性为CSS属性设置优先级(“重要”)。
我们将使用“大写字母” 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>


0

下面的innerHtml是否有效

var styleElement = win.document.createElement("STYLE");
styleElement.innerHTML = "#notEditableVatDisplay {display:inline-flex} #editableVatInput,.print-section,i.fa.fa-sort.click-sortable{display : none !important}";


0

使用ES6 +,您还可以使用反引号,甚至可以直接从某处复制CSS:

const $div = document.createElement('div')
$div.innerText = 'HELLO'
$div.style.cssText = `
    background-color: rgb(26, 188, 156);
    width: 100px;
    height: 30px;
    border-radius: 7px;
    text-align: center;
    padding-top: 10px;
    font-weight: bold;
`

document.body.append($div)


-1
<button onclick="hello()">Click!</button>

<p id="demo" style="background: black; color: aliceblue;">
  hello!!!
</p>

<script>
  function hello()
  {
    (document.getElementById("demo").style.cssText =
      "font-size: 40px; background: #f00; text-align: center;")
  }
</script>

-1

我们可以向Node原型添加样式功能:

Node.prototype.styles=function(obj){ for (var k in obj)    this.style[k] = obj[k];}

然后,只需在任何节点上调用styles方法即可:

elem.styles({display:'block', zIndex:10, transitionDuration:'1s', left:0});

它将保留任何其他现有样式,并覆盖object参数中存在的值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.