Jak ustawić wiele stylów CSS w JavaScript?

189

Mam następujące zmienne JavaScript:

var fontsize = "12px"
var left= "200px"
var top= "100px"

Wiem, że mogę ustawić je dla mojego elementu iteracyjnie w następujący sposób:

document.getElementById("myElement").style.top=top
document.getElementById("myElement").style.left=left

Czy można je wszystkie połączyć naraz, coś takiego?

document.getElementById("myElement").style = allMyStyle 
Mircea
źródło
1
Co będzie allMyStylew twoim przykładzie? Na początku masz listę pojedynczych zmiennych ...
Felix Kling
1
rozmiar czcionki: 12px; po lewej: 200px; u góry: 100 pikseli
Mircea,
1
Jeśli to zadziała, byłby to ciąg znaków zawierający cały CSS, który należy ustawić: document.getElementById („myElement”). Style = font-size: 12px; po lewej: 200px; u góry: 100 pikseli
Mircea,
@Mircea: Spójrz na moją odpowiedź ... możesz użyć cssText.
Felix Kling
@Felix Kling tego właśnie szukam. Nie robi dużo powtórzeń i przemalowań. Nie jestem pewien, czy będzie działać z moim kodem, ale tak powinno być! Thanx
Mircea

Odpowiedzi:

276

Jeśli masz wartości CSS jako ciąg znaków i nie ma już innego CSS ustawionego dla elementu (lub nie przejmujesz się nadpisywaniem), skorzystaj z cssTextwłaściwości :

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

Jest to w pewnym sensie dobre, ponieważ pozwala uniknąć odmalowania elementu za każdym razem, gdy zmieniasz właściwość (zmieniasz je wszystkie „naraz”).

Z drugiej strony musisz najpierw zbudować ciąg.

Felix Kling
źródło
64
document.getElementById („myElement”). style.cssText + = ';' + cssString; zwróci „znormalizowaną” wartość dla elementu.style.cssText - nowy ciąg zastąpi istniejące nazwane właściwości dowolnymi nowymi wartościami, doda nowe i pozostawi resztę w spokoju.
kennebec
2
@kennebec: Właśnie wypróbowałem i masz rację. Nie wiedziałem o tym, po prostu pomyślałem, że dołącza się do już istniejącego tekstu. Ale rzeczywiście zastępuje wartości ...
Felix Kling
1
Miałem nadzieję, że ktoś to zdobędzie i wykorzysta - nigdy nie widziałem tego udokumentowanego. Nawiasem mówiąc, dobra odpowiedź.
kennebec
33
@kennebec Przeprowadziłem test jsperf i stwierdziłem, że zastosowanie wielu reguł css w sekwencji w przeciwieństwie do metody cssText jest szybsze: jsperf.com/csstext-vs-multiple-css-rules/4
Andrei Oniga
2
@RohitTigga: Ciąg znaków zawierający reguły CSS. Np display: block; position: absolute;.
Felix Kling
279

Za pomocą Object.assign :

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

Daje to również możliwość łączenia stylów zamiast przepisywania stylu CSS.

Możesz także wykonać funkcję skrótu:

const setStylesOnElement = function(styles, element){
    Object.assign(element.style, styles);
}
Laimis
źródło
16
niestety ta metoda nie jest obsługiwana przez IE11 kangax.github.io/compat-table/es6/…
AndrewSilver
2
@AndrewSilver - Użyj babel && jednej z wielu bibliotek wypełniania wieloczęściowego, aby uzyskać obsługę funkcji ES6 w niekompatybilnych przeglądarkach.
Periata Breatta
1
Podczas korzystania z Babel jest to metoda, z którą należy przejść! Idealny!
nirazul
1
@Nirazul Jak go używać? Próbuję, document.querySelector('html').style = Object.assign({}, document.querySelector('html').style, { color: 'red'})ale nic się nie dzieje.
Jonathan Dion
1
Wystarczy, gdy rozwiniesz prosty obiekt javascript - Nie musisz niczego przypisywać: Object.assign(document.querySelector('html').style, { color: 'red' });... Upewnij się, że styl nie jest nadpisany w dolnym elemencie. Jest to bardzo prawdopodobne, gdy używasz go na htmlelemencie.
nirazul
51

@Mircea: Bardzo łatwo jest ustawić wiele stylów dla elementu w pojedynczej instrukcji. Nie wpływa to na istniejące właściwości i pozwala uniknąć złożoności korzystania z pętli lub wtyczek.

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

UWAŻAJ: Jeśli później użyjesz tej metody do dodania lub zmiany właściwości stylu, poprzednie właściwości ustawione za pomocą „setAttribute” zostaną usunięte.

CHOLEWKA
źródło
removeAttributemoże się przydać tym, którzy myślą o setAttributezresetowaniu stylu
che-azeh
41

Zrób funkcję, aby się tym zająć i przekaż parametry wraz ze stylami, które chcesz zmienić.

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

i nazwij to tak

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

dla wartości właściwości wewnątrz właściwościObiekt można użyć zmiennych.

Gabriele Petrioli
źródło
Używałem właściwości .style za każdym razem indywidualnie, aby nie zastępować, jeśli mam zmienić styl, ale działa to lepiej, bardziej skondensowane.
dragonore
2
Najlepsze rozwiązanie, ponieważ tak elastyczne i przydatne jak cssText, ale szybsze.
Simon Steinberger,
17

Biblioteka JavaScript pozwala robić te rzeczy bardzo łatwo

jQuery

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

Obiekt i pętla for-in

Lub, o wiele bardziej elegancka metoda, to podstawowy obiekt i pętla for

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

for(i in css){
   el.style[i] = css[i];
}
Harmen
źródło
2
Tak, ale w tym projekcie nie mogę użyć jQuery ... Thanx
Mircea
musisz napisać fontsize jako fontSize?
środkowy
1
Tak. We właściwościach rozróżniana jest wielkość liter, nawet przy użyciu notacji ciągów. Powinien to być fontSize: 12px.
MyNameIsKo
Powiedziałbym rozmiar czcionki;)
mikus
14

ustaw wiele właściwości stylu css w JavaScript

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

lub

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

Przykład:

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

document
.getElementById("demo")
.setAttribute("style","margin-left:100px; background-color:red");
eyupgevenim
źródło
13

Właśnie się tu natknąłem i nie rozumiem, dlaczego do osiągnięcia tego jest tak dużo kodu.

Dodaj swój kod CSS jako ciąg.

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

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

Thielicious
źródło
1
Używam tej metody, ponieważ jest przydatna, jeśli nie masz innych stylów wstawianych, ale czasami powoduje problemy.
Любопытный
Jeśli pojawią się problemy, to tylko z powodu złej implementacji. Wszystko zależy od tego, jak, kiedy i gdzie zastosujesz go do swojego kodu.
Thielicious
3

Możesz mieć indywidualne klasy w swoich plikach css, a następnie przypisać nazwę klasy do swojego elementu

lub możesz przeglądać właściwości stylów jako -

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

for(var prop in css) {
  document.getElementById("myId").style[prop] = css[prop];
}
Sachin Shanbhag
źródło
To nie jest opcja, ponieważ zmienne są dynamiczne
Mircea
To nie jest dokładnie to, o co pytał użytkownik, ale najprawdopodobniej jest to najbardziej realne rozwiązanie. +1
Ryan Kinal
2
@Sachin „font-size” musi być wielbłądem jako „fontSize”. Nie można zagwarantować, że nazwy stylów hiperwizowanych będą działać w różnych przeglądarkach, chyba że użyto setAttribute.
Ashwin Prabhu
2

Nie sądzę, że jest to możliwe jako takie.

Ale możesz utworzyć obiekt na podstawie definicji stylu i po prostu przejść przez nie.

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

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

Aby dalej się rozwijać, utwórz dla niego funkcję:

function setStyles(element, styles) {
  for (i in styles)
    element.style[i] = styles[i];
}

setStyles(document.getElementById("myElement"), allMyStyle);
nnevala
źródło
2

Używając zwykłego Javascript, nie można ustawić wszystkich stylów jednocześnie; musisz użyć pojedynczych linii dla każdej z nich.

Nie musisz jednak powtarzać document.getElementById(...).style.kodu w kółko; utwórz zmienną obiektową, aby się do niej odwoływała, a sprawisz, że kod będzie znacznie bardziej czytelny:

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

...itp. Znacznie łatwiejszy do odczytania niż twój przykład (i szczerze mówiąc, równie łatwy do odczytania jak alternatywa jQuery).

(jeśli JavaScript został poprawnie zaprojektowany, mógłbyś również użyć withsłowa kluczowego, ale najlepiej zostawić to w spokoju, ponieważ może to powodować pewne nieprzyjemne problemy z przestrzenią nazw)

Spudley
źródło
1
To nie jest prawda, możesz ustawić wszystkie style jednocześnie cssText.
Felix Kling
2
@ Felix: nadaje się cssTextdo ustawiania wartości wbudowanego arkusza stylów. Jednak jeśli masz również klasy lub chcesz tylko zastąpić niektóre wartości, ale nie wszystkie, użycie tego może być dość trudne cssText. Masz rację; możesz to zrobić, ale odradzam to w większości przypadków użycia.
Spudley,
1
Cóż, posiadanie klas nie jest żadnym argumentem ... obj.toplub jedynie obj.style.colorustawia wartość wbudowanego arkusza stylów. I tak, w mojej odpowiedzi powiedziałem, że należy nadpisać wartości ... to zależy od kontekstu, czy jest użyteczny czy nie.
Felix Kling
1
Lepiej, aby ten obj = document.getElementById ("myElement"). Style; lub ustaw swoje właściwości obj.style.top = top.
kennebec
@kennebec - hmm, mógłbym przysiąc, że to zrobiłem. no cóż, zredagowane. dzięki za zauważenie.
Spudley,
1

Najlepszym rozwiązaniem może być utworzenie funkcji, która sama określa style:

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

Pamiętaj, że nadal będziesz musiał używać nazw właściwości zgodnych z javascript (stąd backgroundColor)

Ryan Kinal
źródło
1

Zobacz dla ... w

Przykład:

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];
}
Onkelborg
źródło
1

To jest stary wątek, więc pomyślałem, że dla każdego, kto szuka nowoczesnej odpowiedzi, sugeruję użycie 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);
Dragonore
źródło
1

Istnieją scenariusze, w których użycie CSS wraz z javascript może mieć większy sens w przypadku takiego problemu. Spójrz na następujący kod:

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

To po prostu przełącza się między klasami CSS i rozwiązuje tak wiele problemów związanych z nadpisywaniem stylów. Sprawia nawet, że Twój kod jest bardziej uporządkowany.

che-azeh
źródło
0

Możesz napisać funkcję, która będzie ustawiać deklaracje indywidualnie, aby nie zastępować żadnych istniejących deklaracji, których nie dostarczasz. Załóżmy, że masz tę listę parametrów obiektu deklaracji:

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

Możesz napisać funkcję, która wygląda następująco:

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

która pobiera elementi objectlistę właściwości deklaracji stylu do zastosowania do tego obiektu. Oto przykład użycia:

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

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

jsejcksn
źródło
0

Myślę, że jest to bardzo prosty sposób w odniesieniu do wszystkich powyższych rozwiązań:

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;
});
Jalal
źródło
0

Użyj CSSStyleDeclaration.setProperty()metody w Object.entriesobiekcie stylów.
Dzięki temu możemy również ustawić priorytet („ważny”) dla właściwości CSS.
Użyjemy nazw właściwości CSS „hypen-case”.

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>

sivako
źródło
0

Czy podany poniżej parametr innerHtml jest prawidłowy

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

Sandeep M.
źródło
0

Dzięki ES6 + możesz także używać backticków, a nawet kopiować css bezpośrednio skądś:

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)

V. Sambor
źródło
-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>
Razzak Romy
źródło
-1

Możemy dodać funkcję stylów do prototypu węzła:

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

Następnie po prostu wywołaj metodę stylów na dowolnym węźle:

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

Zachowa wszelkie istniejące style i nadpisze wartości obecne w parametrze obiektu.

admirhodzic
źródło