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

1
font-size:12px; 左:200px; top:100px
Mircea

1
これが機能する場合、設定するすべてのCSSを含む文字列になります。document.getElementById( "myElement")。style = font-size:12px; 左:200px; top:100px
Mircea

@Mircea:私の答えを見てください....使用できますcssText
Felix Kling、

@Felix Klingこれは私が探しているものです。大量のリフローとリペイントを行わない。私のコードで動作するかどうかはわかりませんが、これで十分です!Thanx
Mircea

回答:


273

CSS値が文字列であり、要素に他のCSSが設定されていない場合(または上書きする必要がない場合)は、cssTextプロパティを使用します

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

これは、プロパティを変更するたびに要素を再描画する必要がないため、ある意味で優れています(何らかの方法ですべてを一度に変更します)。

反対に、最初に文字列を作成する必要があります。


64
document.getElementById( "myElement")。style.cssText + = ';' + cssString; element.style.cssTextの「正規化された」値を返します。新しい文字列は、既存の名前付きプロパティを新しい値で置き換え、新しい値を追加し、残りはそのままにします。
kennebec

2
@kennebec:試してみて、あなたは正しい。私はそれを知りませんでした、それは既存のテキストに追加されると思っただけです。しかし、それは実際に値を置き換えます...
Felix Kling

1
私は誰かがそれを手に入れてそれを使うことを望みました-私はそれが文書化されたことを見たことはありません。ところで、良い答えです。
ケネベック

33
@kennebec私はjsperfテストを実施しましたが、cssTextメソッドを使用するよりも複数のcssルールをシーケンスに適用する方が速いことがわかりました:jsperf.com/csstext-vs-multiple-css-rules/4
Andrei

2
@RohitTigga:CSSルールを含む文字列。例えばdisplay: block; position: absolute;
Felix Kling 2015

276

Object.assignの使用:

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

これにより、CSSスタイルを書き換える代わりに、スタイルをマージすることもできます。

ショートカット機能を作ることもできます:

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

16
悲しいことに、この方法は、IE11でサポートされていないkangax.github.io/compat-table/es6/...
AndrewSilver

2
@AndrewSilver-互換性のないブラウザーでES6機能をサポートするには、多数のポリフィルライブラリの1つである&bel &&を使用してください。
Periata Breatta

1
バベルを使用するとき、これは一緒に行く方法です!パーフェクト!
nirazul 2017年

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 2017

51

@Mircea:1つのステートメントで要素に複数のスタイルを設定するのは非常に簡単です。既存のプロパティには影響せず、ループやプラグインの複雑化を回避します。

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

注意:後でこのメソッドを使用してスタイルプロパティを追加または変更すると、「setAttribute」を使用して設定された以前のプロパティは消去されます。


removeAttributeを使用setAttributeしてスタイルをリセットすることを考えている人にとって便利かもしれません
che-azeh

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と同じくらい柔軟で便利ですが、より高速なので、最適なソリューションです。
Simon Steinberger、2015年

17

JavaScriptライブラリを使用すると、これらのことを非常に簡単に行うことができます

jQuery

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

オブジェクトとfor-in-loop

または、はるかにエレガントな方法は、基本的なオブジェクトと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

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

これは正確にユーザーが求めたものではありませんが、最も実行可能なソリューションである可能性が高いです。+1
ライアンキナル

2
@Sachin "font-size"は "fontSize"としてキャメルケースにする必要があります。ハイフネーションされたスタイル名は、setAttributeを使用しない限り、ブラウザ間での動作が保証されません。
アシュウィンプラブー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

1
obj = document.getElementById( "myElement")。style; または、プロパティobj.style.top = topを設定します。
kennebec

@kennebec-うーん、そうだと誓ったかもしれない。まあ、編集。発見してくれてありがとう。
Spudley

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

JavaScriptと一緒にCSSを使用することで、このような問題がより適切になるシナリオがあります。次のコードを見てください。

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.entriesます。
これを使用して、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];}

次に、任意のノードでスタイルメソッドを呼び出すだけです。

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

他の既存のスタイルを保持し、オブジェクトパラメータに存在する値を上書きします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.