Як я можу встановити кілька стилів CSS в JavaScript?


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б у вашому прикладі? На початку у вас є список одиничних змінних ...
Фелікс Клінг

1
розмір шрифту: 12px; зліва: 200px; вгору: 100px
Мірча

1
Якщо це буде працювати, це буде рядок, що містить усі встановлені CSS: document.getElementById ("myElement"). Style = font-size: 12px; зліва: 200px; вгорі: 100 пікселів
Мірча

@Mircea: Подивіться на мою відповідь .... ви можете використовувати cssText.
Фелікс Клінг

@Felix Kling це те, що я шукаю. Не робити багато повторних потоків та перефарбовування. Я не впевнений, чи буде він працювати з моїм кодом, але це має бути! Дякус
Мірча

Відповіді:


277

Якщо у вас є значення 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: Просто спробував, і ти маєш рацію. Я цього не знав, я просто подумав, що він додається до вже існуючого тексту. Але це дійсно замінює значення ...
Фелікс Клінг

1
Я сподівався, що хтось це отримає і використає - я ніколи не бачив це документально. Добре відповідь, до речі.
kennebec

33
@kennebec Я провів тест jsperf і виявив, що застосування декількох правил css у послідовності на відміну від використання методу cssText швидше: jsperf.com/csstext-vs-multiple-css-rules/4
Андрій Онига

2
@RohitTigga: рядок, що містить правила CSS. Напр display: block; position: absolute;.
Фелікс Клінг

280

Використання 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 - Використовуйте babel && одну з багатьох бібліотек polyfill, щоб отримати підтримку функцій ES6 у несумісних браузерах.
Periata Breatta

1
Під час використання вавило, це метод, з яким потрібно піти! Ідеально!
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

41

Створіть функцію, щоб піклуватися про неї та передайте їй параметри зі зміненими стилями.

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

для значень властивостей всередині властивостіObject ви можете використовувати змінні ..


Я використовував властивість .style кожен раз індивідуально, щоб не змінювати стиль, якщо я міняв стиль, але це працює краще, більш ущільнено.
драконор

2
Найкраще рішення, тому що настільки ж гнучко і корисно, як cssText, але швидше.
Саймон Штейнбергер

17

Бібліотека JavaScript дозволяє вам робити це дуже легко

jQuery

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

Об'єкт і цикл для введення

Або набагато більш елегантний метод - це базовий об'єкт & for-loop

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?
півзахист

1
Так. Властивості залежать від регістру, навіть якщо використовується нотація рядків. Це має бути fontSize: 12px.
MyNameIsKo

Я б сказав, розмір шрифту;)
mikus

14

встановити декілька властивостей стилю css у Javascript

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
Я також використовую цей метод, тому що він корисний, якщо у вас немає інших стилів вбудованої форми, але іноді це спричиняє проблеми.
Любопытний

Якщо проблеми виникають, то лише через погану реалізацію. Все залежить від того, як, коли і де ви застосовуєте його до свого коду.
Тиелічний

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
Ryan Kinal

2
@Sachin "розмір шрифту" слід називати верблюдом як "fontSize". Імена стилів з гідрифікованою формою не гарантовано працюють у веб-переглядачах, якщо ви не використовуєте setAttribute.
Ешвін Прабху

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.
Фелікс Клінг

2
@Felix: cssTextдобре встановити значення таблиці вкладених стилів. Однак якщо у вас також є заняття або ви хочете лише переотримати деякі значення, але не всі, це може бути досить важко використовувати cssText. Отже, ти маєш рацію; ви можете це зробити, але я рекомендую проти цього для більшості випадків використання.
Спудлі

1
Добре мати класи - це не аргумент ... obj.topабо obj.style.colorтакож джусти встановлює значення таблиці вкладених стилів І так, у своїй відповіді я сказав, що можна перезаписати значення ... це залежить від контексту, корисно це чи ні.
Фелікс Клінг

1
Ви краще зробіть цей стиль obj = document.getElementById ("myElement"). Стиль; або встановіть свої властивості obj.style.top = top.
kennebec

@kennebec - хм, міг присягнути, що я це зробив. о добре, відредаговано. дякую за плями.
Спудлі

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

який бере список elementта objectвластивості декларацій стилів, які слід застосувати до цього об'єкта. Ось приклад використання:

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 "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

Чи дійсний нижче внутрішній HTML

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

Він збереже будь-які інші існуючі стилі та замінить значення, присутні в параметрі об'єкта.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.