Bagaimana saya bisa mengatur beberapa gaya CSS dalam JavaScript?


189

Saya memiliki variabel JavaScript berikut:

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

Saya tahu bahwa saya dapat mengaturnya ke elemen saya secara berulang seperti ini:

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

Apakah mungkin untuk menyatukan semuanya sekaligus, seperti ini?

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

1
Apa yang akan allMyStyleada dalam contoh Anda? Pada awalnya Anda memiliki daftar variabel tunggal ...
Felix Kling

1
ukuran font: 12px; kiri: 200px; atas: 100px
Mircea

1
Jika ini berhasil, itu akan menjadi string yang berisi semua CSS yang akan ditetapkan: document.getElementById ("myElement"). Style = font-size: 12px; kiri: 200px; atas: 100px
Mircea

@ Mircea: Lihat jawaban saya .... Anda dapat menggunakan cssText.
Felix Kling

@Felix Kling, inilah yang saya cari. Tidak membuat banyak aliran ulang dan pengecatan ulang. Saya tidak yakin apakah itu akan berfungsi dengan kode saya tetapi ini harus itu! Thanx
Mircea

Jawaban:


277

Jika Anda memiliki nilai CSS sebagai string dan tidak ada CSS lain yang telah ditetapkan untuk elemen (atau Anda tidak peduli tentang menimpa), manfaatkan cssTextproperti :

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

Ini bagus dalam arti karena menghindari pengecatan ulang elemen setiap kali Anda mengubah properti (entah bagaimana Anda mengubah semuanya "sekaligus").

Di sisi lain, Anda harus membuat string terlebih dahulu.


64
document.getElementById ("myElement"). style.cssText + = ';' + cssString; akan mengembalikan nilai 'dinormalisasi' untuk element.style.cssText- string baru akan menggantikan properti bernama yang sudah ada dengan nilai baru, tambahkan yang baru dan biarkan sisanya.
Kenenn

2
@kennebec: Baru saja mencobanya dan Anda benar. Saya tidak tahu itu, saya hanya berpikir itu menambahkan teks yang sudah ada. Tapi itu memang menggantikan nilai-nilai ...
Felix Kling

1
Saya berharap seseorang akan mendapatkannya dan menggunakannya- Saya belum pernah melihatnya didokumentasikan. Jawaban yang bagus.
Kenenn

33
@kennebec Saya telah melakukan tes jsperf dan menemukan bahwa menerapkan beberapa aturan css secara berurutan dibandingkan dengan menggunakan metode cssText lebih cepat: jsperf.com/csstext-vs-multiple-css-rules/4
Andrei Oniga

2
@RohitTigga: String yang berisi aturan CSS. Misalnya display: block; position: absolute;.
Felix Kling

280

Menggunakan Object.assign :

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

Ini juga memberi Anda kemampuan untuk menggabungkan gaya, alih-alih menulis ulang gaya CSS.

Anda juga dapat membuat fungsi pintasan:

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

16
sayangnya metode ini tidak didukung oleh IE11 kangax.github.io/compat-table/es6/…
AndrewSilver

2
@AndrewSilver - Gunakan babel && salah satu dari banyak perpustakaan polyfill untuk mendapatkan dukungan untuk fitur ES6 di browser yang tidak kompatibel.
Periata Breatta

1
Saat menggunakan babel, ini adalah metode untuk digunakan! Sempurna!
nirazul

1
@Nirazul Bagaimana cara menggunakannya? Saya mencoba document.querySelector('html').style = Object.assign({}, document.querySelector('html').style, { color: 'red'})tetapi tidak ada yang terjadi.
Jonathan Dion

1
Ini sudah cukup, saat Anda memperluas objek javascript sederhana - Tidak perlu menetapkan apa pun sama sekali: Object.assign(document.querySelector('html').style, { color: 'red' });... Pastikan gaya tidak ditimpa dalam elemen yang lebih rendah. Ini sangat mungkin saat menggunakannya pada htmlelemen.
nirazul

51

@ Mircea: Sangat mudah untuk mengatur beberapa gaya untuk elemen dalam satu pernyataan. Itu tidak mempengaruhi properti yang ada dan menghindari kompleksitas untuk loop atau plugin.

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

HATI-HATI: Jika nanti Anda menggunakan metode ini untuk menambah atau mengubah properti gaya, properti sebelumnya yang disetel menggunakan 'setAttribute' akan dihapus.


removeAttributemungkin berguna bagi mereka yang mungkin berpikir untuk menggunakan setAttributeuntuk mengatur ulang gaya
che-azeh

41

Buat fungsi untuk merawatnya, dan berikan parameter dengan gaya yang ingin Anda ubah ..

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

dan menyebutnya seperti ini

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

untuk nilai properti di dalam propertyObject, Anda dapat menggunakan variabel ..


Saya menggunakan properti .style setiap kali secara individu untuk tidak menimpa jika saya mengubah gaya, tetapi ini berfungsi lebih baik, lebih kental.
Dragonore

2
Solusi terbaik, karena sefleksibel dan bermanfaat seperti cssText, tetapi lebih cepat.
Simon Steinberger

17

Pustaka JavaScript memungkinkan Anda melakukan hal-hal ini dengan sangat mudah

jQuery

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

Objek dan for-in-loop

Atau, metode yang jauh lebih elegan adalah objek dasar & untuk-loop

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

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

2
Ya, tetapi pada proyek ini saya tidak dapat menggunakan jQuery ... Thanx
Mircea

perlu menulis fontsize sebagai fontSize?
midstack

1
Iya. Properti peka huruf besar-kecil, bahkan ketika menggunakan notasi string. Seharusnya fontSize: 12px.
MyNameIsKo

Saya akan mengatakan font-size;)
mikus

14

setel beberapa properti style css di Javascript

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

atau

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

Contoh:

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

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

13

Saya hanya tersandung di sini dan saya tidak melihat mengapa ada begitu banyak kode yang diperlukan untuk mencapai ini.

Tambahkan kode CSS Anda sebagai string.

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

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


1
Saya menggunakan metode ini juga karena berguna jika Anda tidak memiliki gaya inline lainnya, tetapi kadang-kadang menyebabkan masalah.
Любопытный

Jika masalah terjadi maka hanya karena implementasi yang buruk. Itu semua tergantung bagaimana, kapan dan di mana Anda menerapkannya pada kode Anda.
Thielicious

3

Anda dapat memiliki kelas individu dalam file css Anda dan kemudian menetapkan classname ke elemen Anda

atau Anda dapat mengulangi properti gaya sebagai -

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

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

Itu bukan opsi sice variabel dinamis
Mircea

Ini tidak persis apa yang diminta pengguna, tetapi kemungkinan besar solusi yang paling layak. +1
Ryan Kinal

2
@Sachin "font-size" perlu dikunci unta sebagai "fontSize". Nama gaya hyphnated tidak dijamin berfungsi di seluruh peramban, kecuali jika Anda menggunakan setAttribute.
Ashwin Prabhu

2

Jangan berpikir itu mungkin.

Tapi Anda bisa membuat objek dari definisi gaya dan hanya mengulanginya.

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

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

Untuk mengembangkan lebih lanjut, buat fungsi untuk itu:

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

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

2

Menggunakan Javascript biasa, Anda tidak dapat mengatur semua gaya sekaligus; Anda perlu menggunakan satu baris untuk masing-masingnya.

Namun, Anda tidak perlu mengulang document.getElementById(...).style.kode berulang-ulang ; buat variabel objek untuk referensi, dan Anda akan membuat kode Anda lebih mudah dibaca:

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

... dll. Jauh lebih mudah dibaca daripada contoh Anda (dan terus terang, sama mudahnya dengan membaca sebagai alternatif jQuery).

(jika Javascript telah dirancang dengan benar, Anda juga bisa menggunakan withkata kunci, tetapi sebaiknya dibiarkan sendiri, karena dapat menyebabkan beberapa masalah namespace yang buruk)


1
Itu tidak benar, Anda dapat mengatur semua gaya sekaligus melalui cssText.
Felix Kling

2
@ Feliks: cssTexttidak masalah untuk mengatur nilai stylesheet inline. Namun jika Anda juga memiliki kelas, atau jika Anda hanya ingin menimpa beberapa nilai tetapi tidak semua, itu bisa sangat sulit untuk digunakan cssText. Jadi kamu benar; Anda dapat melakukannya, tetapi saya akan merekomendasikan untuk sebagian besar kasus penggunaan.
Spudley

1
Baik memiliki kelas bukan argumen ... obj.topatau obj.style.colorjuga hanya menetapkan nilai inline stylesheet. Dan ya, dalam jawaban saya, saya mengatakan bahwa seseorang akan menimpa nilai-nilai ... itu tergantung pada konteksnya apakah itu berguna atau tidak.
Felix Kling

1
Anda lebih baik membuat itu obj = document.getElementById ("myElement"). Style; atau atur properti Anda obj.style.top = atas.
Kenenn

@kennebec - hmm, bisa bersumpah aku melakukan itu. oh sudah diedit. terima kasih sudah melihat.
Spudley

1

Taruhan terbaik Anda adalah membuat fungsi yang mengatur gaya Anda sendiri:

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

Perhatikan bahwa Anda masih harus menggunakan nama properti yang kompatibel dengan javascript (karenanya backgroundColor)


1

Lihat untuk .. di

Contoh:

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

Ini adalah utas lama, jadi saya mencari orang yang mencari jawaban modern, saya sarankan menggunakan 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

Ada skenario di mana menggunakan CSS bersama javascript mungkin lebih masuk akal dengan masalah seperti itu. Lihatlah kode berikut:

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

Ini hanya beralih di antara kelas-kelas CSS dan menyelesaikan begitu banyak masalah yang terkait dengan gaya-gaya utama. Itu bahkan membuat kode Anda lebih rapi.


0

Anda dapat menulis fungsi yang akan mengatur deklarasi satu per satu agar tidak menimpa deklarasi yang ada yang tidak Anda berikan. Katakanlah Anda memiliki daftar parameter objek deklarasi ini:

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

Anda mungkin menulis fungsi yang terlihat seperti ini:

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

yang membutuhkan elementdan objectdaftar properti deklarasi gaya untuk diterapkan ke objek itu. Berikut ini contoh penggunaan:

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

Saya pikir ini cara yang sangat sederhana sehubungan dengan semua solusi di atas:

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

Gunakan CSSStyleDeclaration.setProperty()metode di dalam Object.entriesobjek gaya.
Kami juga dapat mengatur prioritas ("penting") untuk properti CSS dengan ini.
Kami akan menggunakan nama properti 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>


0

Apakah innerHtml di bawah ini valid

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

Dengan ES6 + Anda juga dapat menggunakan backticks dan bahkan menyalin css langsung dari suatu tempat:

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

Kami dapat menambahkan fungsi gaya ke prototipe Node:

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

Kemudian, cukup panggil metode styles pada Node apa pun:

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

Ini akan mempertahankan gaya lain yang ada dan menimpa nilai yang ada di parameter objek.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.