Хочешь проверить свои знания по JS?
Подпишись на наш канал с тестами по JS в Telegram!
Решать задачи
×
Как изменить CSS-стили? Ответ очевиден — отредактировать CSS-файл. Возможно, после этого понадобится компиляция. Затем нужно обновить стили во время выполнения, изменив атрибуты элемента, такие как class
и aria-*
.
Хотя этот ответ неполный, подумайте над следующими вопросами:
- Как обновить стили во время выполнения, основываясь на взаимодействии с пользователем, а не на предустановленных значениях? Сгенерировать уникальные имена классов для каждой возможной комбинации цветов нереально.
- Что, если у вас нет доступа к таблицам стилей или HTML? Например, если сайт сгенерирован конструктором сайтов со сторонними CSS-файлами, изобилующими свойствами !important.
В этой статье мы рассмотрим четыре способа обновить CSS-стили при помощи JavaScript. Также мы кратко разберем, в каких случаях эти способы стоит применять. Наконец, мы оценим их с точки зрения CSS-сложности, т. е. того, насколько просто понять и изменить код в каждом случае.
Используйте встроенные стили
До изобретения CSS для стилизации веб-страниц использовались теперь уже устаревшие HTML-атрибуты, такие как color
, background
и border
. Встроенный CSS — духовный преемник этих атрибутов. При таком подходе свойства CSS задаются через атрибут style
элемента.
Два следующих способа изменить размер шрифта для элемента hero
равнозначны:
document.getElementById('hero').style = 'font-size: 12rem;'; document.getElementById('hero').style.fontSize = '12rem';
Использование JavaScript для обновления встроенного CSS в целом считается плохой практикой. Причин для этого несколько:
- Нарушается разделение между стилями и контентом, из-за чего становится сложнее читать и изменять документ.
- При таком подходе CSS-селекторы не могут формировать семантические абстракции.
- Без селекторов обновление нескольких элементов на странице потребует прохода по всем элементам, а это отнимает время. К тому же, таким образом можно допустить ошибки.
- Повторяющиеся стили раздувают ваш HTML.
- У вас не будет доступа к псевдоэлементам и псевдоклассам, они доступны только через CSS-селекторы.
В настоящее время мы наблюдаем возрождение встроенного CSS-lite через атомарные CSS-фреймворки, такие как Tailwind CSS. Атомарные фреймворки используют имена классов CSS, которые переводятся в одно CSS-свойство и основываются на генерации компонентов для повторного использования стилей при помощи JS. Это позволяет избавиться от проблем 3, 4 и 5 из приведенного выше списка. Но проблему раздувания HTML это все равно не решает.
Хотя встроенные CSS-стили в целом вредны, их применение имеет одно преимущество. Чтобы внести изменение, вам не нужно иметь доступ к таблицам стилей. Поэтому с их помощью вполне можно вносить некоторые правки по ходу работы.
Когда стоит применять встроенный CSS
- Для обновления стилей отдельного элемента во время выполнения.
- Для быстрой проверки чего-либо.
- Когда таблицы стилей недоступны.
Используйте HTML-атрибуты
Можно изменять и другие атрибуты элементов, не только style
. Это самый популярный способ, он позволяет создавать переиспользуемые и семантически значимые стили. Вот несколько примеров:
// toggles HTML semantic state document.getElementById('cta').disabled = true; // a aria based semantic button state document.getElementById('cta').ariaExpanded = "true"; // a class based semantic primary variation document.getElementById('cta').classList.toggle('primary');
Тут особо нечего добавить. Вероятно, вы и так пользуетесь этим методом. Такой код и понять просто, и изменить легко. К тому же, в нашем распоряжении множество CSS-методологий для контроля над его сложностью.
Но я хочу отметить, что примеры в приведенном выше коде расположены в порядке их значимости. Прежде чем прибегнуть к состояниям на основе классов, стоит обратиться к состояниям на основе атрибутов HTML. Теперь, когда селектор :has()
уже на горизонте, это стало проще.
Когда стоит модифицировать атрибуты помимо style
Всегда, когда у вас есть доступ к таблицам стилей и предопределенные стили.
Используйте CSSOM
Следующий метод изменения CSS посредством JavaScript можно сравнить со скальпелем в наборе инструментов фронтендера. Мы можем напрямую изменять объекты CSS.
Два предыдущих метода для изменения стилей модифицируют HTML DOM. Но в некоторых случаях проще изменить напрямую CSS Object Model (CSSOM).
Обратившись к объекту styleSheets
документа, мы можем избирательно менять стили сайта, используя всю мощь CSS. Например:
const thirdPartyStylesheet = document.styleSheets[0]; //index 15 rule color: red !important; thirdPartyStylesheet.deleteRule(15);
Можно даже добавить новые динамически генерируемые стили при помощи конструктора CSSStyleSheet. По своему опыту могу сказать, что это наилучший вариант, когда вы имеете дело со сторонними таблицами стилей или конструктором сайтов, т. е., когда ваши возможности работы с CSS ограничены.
Когда вы засоряете свои встроенные стили многочисленными !important
для перезаписи сторонних стилей, происходит жуткое разрастание CSS-селекторов. Изменение CSSOM позволяет этого избежать. Этот подход также может быть эффективнее перебора в цикле нескольких элементов для динамического обновления их стилей.
Основной недостаток CSSOM-подхода — такой код труден для понимания и отладки. Для измененного CSSOM нет поддержки в инструментах разработчика. И, если только вы не задокументировали свои шаги крупным шрифтом, ваш код может довести будущего мейнтейнера до ручки. Так же, как и скальпель, этот метод нужно использовать редко и осторожно.
Когда стоит модифицировать CSSOM
Больше всего этот способ подходит не для внесения новых стилей, а для удаления сторонних. Также с его помощью можно изменить стили, которые вы не контролируете.
Используйте пользовательские свойства CSS
Последний способ динамического обновления CSS-стилей предполагает применение пользовательских свойств CSS. Хотя технически тут не используются никакие новые APIs, применение пользовательских свойств существенно отличается от предыдущих подходов.
Пользовательские свойства можно использовать с любым из предыдущих методов:
const themeColor = document.getElementById('color-picker').value; // use with inline style document.body.style=`--theme-color: ${themeColor};`; // use in CSSOM const stylesheet = document.styleSheets[0]; stylesheet.insertRule(`:root { --theme-color: ${themeColor}; }`);
Пользовательские свойства элемента наследуются его потомками. Мы можем использовать их со встроенными стилями и не беспокоиться о выборке и переборе в цикле всех элементов в DOM. Все, что нам нужно, это найти их общего предка. В силу этой особенности пользовательские свойства также могут применяться для изменения псевдоэлементов при помощи встроенных стилей.
Самые значительные минусы применения пользовательских свойств — необходимость доступа к таблицам стилей и необходимость планирования своих действий. При благоразумном использовании с их помощью можно изменить несколько стилей за одно обновление. Пример — генерация целой цветовой палитры путем обновления одного цвета.
Применение пользовательских свойств требует такой же продуманности (если не большей), что и подход с изменением атрибутов элемента, но с его помощью можно менять стили во время работы кода.
Поддержка кода с пользовательскими свойствами проще, чем кода с измененной CSSOM: тут нужно отслеживать меньше изменений. Но при этом вам нужен доступ к таблицам стилей.
Когда стоит применять пользовательские свойства
- Вам нужно внести комплексные изменения стилей во время выполнения программы.
- Вы хотите создать новые отношения между стилевыми свойствами.
- Вам нужно пробить Shadow DOM, чтобы стилизовать множество веб-компонентов.
Итоги
Когда вам в очередной раз понадобится изменить CSS-стили при помощи JavaScript, спросите себя:
- Это предопределенное изменение или значение стиля определяется динамически во время работы программы?
- Я перекрываю существующие сторонние стили?
- Мне нужно изменить один элемент или несколько, включая псевдоэлементы и классы?
- Хочу ли я, чтобы это изменение повлияло на несколько производных свойств или затронуло несколько элементов на странице?
Исходя из ответов на эти вопросы, можно подобрать наиболее подходящий способ внесения изменений в CSS-стили.
Перевод статьи «How to Change CSS Styles with JavaScript – From Basic to Advanced Methods».
Как правило, начинающие изучать веб-разработку люди уже знают, как легко можно поменять внешний вид элемента с помощью CSS стилей. Но менять стили можно и через JavaScript. Когда же наступает необходимость это делать через JavaScript? Первое, что приходит в голову — это для создании анимаций.
Изменение стилей через CSS
У нас есть черный заголовок в розовой рамке. За внешний вида заголовка отвечают CSS стили.
//HTML код
<div class="container">
<h1 id="heading">Польза ананасов</h1>
</div>
//CSS код
.container {
width: 400px;
border: 10px solid plum;
margin: 20px auto;
}
#heading {
font-size: 24px;
font-weight: 700;
color: black;
font-family: 'Arial Narrow Bold', sans-serif;
text-align: center;
}
Если мы хотим изменит цвет у заголовка с черного на фиолетовый, то идем в CSS код и вручную заменяем значение у свойства color.
#heading {
color: violet;
}
Заголовок стал фиолетовый.
Изменение стилей через JavaScript
Но мы хотим большего взаимодействия с пользователем. Чтобы цвет заголовка менялся вследствии наступления какого-нибудь события (клика мыши). Изменим наш заголовок на фиолетовый через JavaScript. Действуем уже по отработанному алгоритму:
- Получить элемент
- Обратится к свойству элемента
- Установит новое значение
Найдем заголовок по названию селектора и поместим его в переменную headingElement для дальнейших манипуляций. Затем получим доступ к его атрибуту style и укажем нужное нам свойство color, которое собираемся изменить. То есть, мы обращаемся к свойству color у стиля того элемента, который лежит а переменной headingElement и устанавливаем ему новое значение — фиолетовый цвет. В записи мы используем две точки, потому что у нас два объекта. Первый объект сам элемент h1, а второй объект — style, в свойствах которого хранятся все стили элемента h1.
// получение элемента по селектору
let headingElement = document.querySelector('#heading');
// обращение к интересующему свойству и присвоение нового цвета
headingElement.style.color = 'violet';
Цвет заголовка опять поменялся на фиолетовый.
Названия свойств
Теперь попробуем изменить цвет рамки у заголовка. Действуем по аналогии с заменой цвета. Получаем элемент container, у которого будем менять цвет свойства border-color с розового на черный.
let containerElement = document.querySelector('.container');
containerElement.style.border-color = 'black'; // нельзя писать border-color
Упс! Ничего не произошло и выскочило сообщение об ошибке, а цвет у рамки не поменялся. Почему не сработало? Ведь в обычном CSS мы бы так и написали border-color: black. Все дело в дефисе, имена свойств в JavaScript не могут содержать дефис. Поэтому все CSS свойства в названиях которых есть дефис, нужно преобразовать в другой синтаксис. Для этого мы убираем дефис и пишем первую букву второго слова, заглавной. Такой стиль написания называется camelCase (верблюжий регистр), напоминающий горбы верблюда.
let containerElement = document.querySelector('.container');
containerElement.style.borderColor = "black"; // так правильно borderСolor
Теперь наш обновленный JavaScript сработал. Рамка у заголовка окрасилась в черный цвет.
Заключение
Зачем вообще нужно изменять элементы на странице с помощью JavaScript? Не проще ли сразу создать HTML страницу с необходимым CSSкодом? Все дело в том, что JavaScript позволяет реагировать на события, производимые пользователем и менять CSS свойства прямо на ходу. Во взаимодействии с пользователем и заключается вся сила языка JavaScript. Например вы можете создавать формы и проверять, что туда вводит пользователь. Просто создавать HTML страницы и стилизовать их согласно макету заказчика, недостаточно в современной веб-разработке. Вы можете возразить, что для этого есть другие специалисты — JavaScript программисты. Однако в реальном мире, заказчики предпочитают выбирать исполнителей с опцией «все включено», чтобы цепочка исполнителей была, как можно короче. Поэтому изучайте JavaScript на моем видеокурсе, если вы хотите стать востребованным фронтенд-разработчиком.
-
Создано 05.04.2021 10:14:06
-
Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
Она выглядит вот так:
-
Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
Домой ← Публикации ← Изменение CSS свойств с помощью JavaScript
15 апреля 2015
Приветствую, друзья!
Данная статья пригодится новичкам в веб-программировании. Буду подразумевать, что вам знаком «СИшный» синтаксис, который лежит в основе JavaScript, и получение ссылки на элемент — метод getElementById и сопутствующие — проблем не вызывает. Естественно, основы HTML и CSS вам также должны быть известны.
Для доступа к стилям существует специальное свойство объекта — style. Пусть на странице определён элемент с идентификатором elem:
<div id="elem">DIV</div>
Тогда, для доступа к его «стилевым» свойствам, можно использовать такой код (не пытайтесь использовать, вырвано из контекста!):
document.getElementById('elem').style.ЦС
где ЦС — то свойство, к которому нужно обратиться или изменить.
Далее начинается пусть небольшая, но магия. Вам известны различные CSS свойства: background, border, display, font-size и т. п. Обратите внимание на последнее, в котором есть символ — (минус на клавиатуре). В названиях переменных такие дефисы использовать нельзя, поскольку в контексте программы они интерпретируются как знак вычитания. Для логического обоснования, маленький пример:
font-size
Если бы интерпретатор JavaScript допускал в именах символ минус, ему пришлось бы выполнить дополнительные действия:
- Проверить существование переменной font-size.
- Если её нет, попытаться выполнить арифметическое действие «вычитание» значения size из font.
Поэтому, имена свойств требуется «причесать» (нормализовать) для использования в коде. К счастью, определено всего 2 простых правила:
- Если знака минус нет (margin, border, width и прочее) — записывается как есть:
// установить элементу ширину в 30 пикселей document.getElementById('elem').style.width = '30px';
- Если знак минус присутствует, то он убирается, а следующая буква переводится в верхний регистр: background-color → backgroundСolor, z-index → zIndex и т. д.:
// Сделать фон красным document.getElementById('elem').style.backgroundColor = '#FF0000';
Вот так! Всё очень просто. Если вы знаете CSS свойства, значит, имеете возможность свободно ими рулить и в JavaScript. А попрактиковаться можете уже сейчас.
Ниже дан небольшой пример изменения свойств элемента с помощью JS. Если видете в названии слово color, это подразумевает задание цвета.
Думаю, нет нужды объяснять, что присвоение неверных значений игронируется?
- Попробуйте управлять этим списком.
- Сделать это совсем просто.
- Можете выбрать свойство color.
- Установите для него значение #0000dd
Выберите CSS-свойство и укажите корректное значение для него:
Автор публикации
2 070
x64 (aka andi)
Комментарии: 2893Публикации: 405Регистрация: 02-04-2009
Загрузка…
In my previous article, we looked at different ways to get style information from an HTML element using JavaScript. Today, you’ll learn how to apply CSS styles to HTML elements with JavaScript.
Let us say we have the following <div>
element:
<div class="pizza">Hot, spicy, pizza 🍕</div>
Now, we want to change its text, background colors, and font style CSS properties using JavaScript. What should we do? There are multiple options available in JavaScript.
Inline Styles
The easiest and straightforward way to change the CSS styles of an element with JavaScript is by using the DOM style property.
All you need to do is fetch the element from DOM and change its inline styles:
const pizza = document.querySelector('.pizza')
// change the text color to white
pizza.style.color = 'white'
// set background color to blue
pizza.style.backgroundColor = 'blue'
// change font style to italic
pizza.style.fontStyle = 'italic'
The style
property uses the camel-case naming conventions for CSS properties and applies styles inline to the element:
<div class="pizza" style="color: white; background-color: blue; font-style: italic;">Hot, spicy, pizza 🍕</div>
Global Styles
Another way is to create a <style>
element, inject your CSS properties, and append it to the DOM. This option is beneficial if you want to apply styles to multiple HTML elements instead of just one.
First, let us create a <style>
element:
const style = document.createElement('style')
Next, add the CSS styles to the above tag using innerHTML
:
style.innerHTML = `
.pizza {
color: white;
background-color: blue;
font-style: italic;
}
`
Finally, append the style element to the DOM. To do this, get the <head>
tag using document.head
, and then call the appendChild()
method on it to append the style element:
document.head.appendChild(style)
Here is the complete JavaScript code snippet:
// create an element
const style = document.createElement('style')
// add CSS styles
style.innerHTML = `
.pizza {
color: white;
background-color: blue;
font-style: italic;
}
`
// append to DOM
document.head.appendChild(style)
CSS Object Model (CSSOM) InsertRule()
According to MDN:
The CSS Object Model is a set of APIs allowing the manipulation of CSS from JavaScript. It is much like the DOM, but for the CSS rather than the HTML. It allows users to read and modify [the] CSS style dynamically.
The CSSStyleSheet.insertRule()
method inserts a new CSS rule to a stylesheet. Here is how you can use this method to add styles to the above HTML element:
// create an new style
const style = document.createElement('style')
// append to DOM
document.head.appendChild(style)
// insert CSS Rule
style.sheet.insertRule(`
.pizza {
color: white;
background-color: blue;
font-style: italic;
}
`)
It is not really required to create a new <style>
element. You can use existing <style>
elements as well as external stylesheets to add CSS rules using insertRule()
.
The insertRule()
method works in all modern browsers, including Internet Explorer 9 and higher.
Constructable Stylesheets
Constructable Stylesheets is a modern way of creating and distributing reusable styles when working with the Shadow DOM.
Here is an example that creates a Constructable Stylesheets and appends it to the Shadow DOM:
// create a new shared stylesheet
const sheet = new CSSStyleSheet()
// add CSS styles
sheet.replaceSync(`
.pizza {
color: white;
background-color: blue;
font-style: italic;
}
`)
// apply the stylesheet to a document
document.adoptedStyleSheets = [sheet]
Conclusion
In this article, we looked at four ways to add CSS styles to an HTML element in JavaScript.
So, which method should you use? It depends on what you want to achieve by dynamically changing the CSS.
If you only want to modify CSS styles for a single element, it is better to use the style property. This property changes the inline styles for a specific HTML element without affecting global styles.
If you want to apply a style to a set of HTML elements, create a new <style>
tag with the necessary CSS properties and append it to the document.
Read Next: How to add multiple CSS styles using JavaScript
✌️ Like this article? Follow me on
Twitter
and LinkedIn.
You can also subscribe to
RSS Feed.
I have this style sheet
#navigation {
float: left;
white-space: nowrap;
font-size: 12px;
font-weight:bold;
}
#navigation ul {
list-style-type: none;
padding-top: 30px;
}
#navigation ul li {
float: left;
display: inline;
border-right: solid 1px #5f5f5f;
padding-right: 8px;
margin-right:8px;
}
this is the HTML
<div id="navigation" >
<ul dir="rtl">
<li>
<asp:LinkButton ID="LinkButtonRegister" runat="server" Visible="true" CausesValidation="False"
PostBackUrl="~/Register.aspx">הרשמה</asp:LinkButton>
</li>
<li>
<asp:LinkButton ID="LinkButtonLogin" runat="server" Visible="true" CausesValidation="False">התחבר</asp:LinkButton>
</li>
<li>
<asp:LinkButton ID="LinkButtonLogout" runat="server" Visible="false" OnClick="ButtonLogOut_Click"
CausesValidation="False">התנתק</asp:LinkButton>
</li>
<li>
<asp:LinkButton ID="LinkButtonMyAccount" runat="server" Visible="false" CausesValidation="False"
PostBackUrl="~/MyAccount.aspx">אזור אישי</asp:LinkButton>
</li>
</ul>
</div>
How can I change the » #navigation ul li » ‘float’ attribute to ‘right’ ?
i can reach the div navigation with javascript-
documnet.getelementbyid(«navigation»), but have no idea how to get into the style of each li which is defined in the style sheet
asked Jun 4, 2013 at 9:51
YogevYogev
1413 silver badges14 bronze badges
2
You should be doing this in the stylesheet, but if you don’t have access to that, you can use JavaScript similar to the following:
// get all of the DOM nodes which match the selector
var nodes = document.querySelectorAll("#navigation ul li");
// loop through all of the nodes
for (var i = 0; i < nodes.length; i++) {
// set the style
nodes[i].style.float = "right";
}
NOTE: document.querySelectorAll
will only work on modern browsers (Chrome, Safari, FF, IE9+).
answered Jun 4, 2013 at 9:58
iblamefishiblamefish
4,7113 gold badges35 silver badges45 bronze badges
Do you want output like this Check the example
JavaScript
document.getElementById("navigation").style.cssFloat = "right";
inside Body tag
<div id="navigation" >
<ul dir="rtl">
<li>
<asp:LinkButton ID="LinkButtonRegister" runat="server" Visible="true" CausesValidation="False"
PostBackUrl="~/Register.aspx">הרשמה</asp:LinkButton>
</li>
<li>
<asp:LinkButton ID="LinkButtonLogin" runat="server" Visible="true" CausesValidation="False">התחבר</asp:LinkButton>
</li>
<li>
<asp:LinkButton ID="LinkButtonLogout" runat="server" Visible="false" OnClick="ButtonLogOut_Click"
CausesValidation="False">התנתק</asp:LinkButton>
</li>
<li>
<asp:LinkButton ID="LinkButtonMyAccount" runat="server" Visible="false" CausesValidation="False"
PostBackUrl="~/MyAccount.aspx">אזור אישי</asp:LinkButton>
</li>
</ul>
</div>
css code
#navigation {
float: left;
white-space: nowrap;
font-size: 12px;
font-weight:bold;
}
#navigation ul {
list-style-type: none;
padding-top: 30px;
}
#navigation ul li {
float: left;
display: inline;
border-right: solid 1px #5f5f5f;
padding-right: 8px;
margin-right:8px;
}
answered Jun 4, 2013 at 10:04
Ravi PalRavi Pal
3851 gold badge7 silver badges22 bronze badges
2
In vanilla JS you first need to get the navigation element using getElementById, then get all its list items using getElementsByTagName. Then, iterating through the list items you can set element.style.float:
var nav = document.getElementById("navigation"),
lis = nav.getElementsByTagName("li"),
l = lis.length,
i = 0;
for (i; i < l; i++) {
lis[i].style.float = "right";
}
answered Jun 4, 2013 at 10:00
robertprobertp
3,4571 gold badge20 silver badges13 bronze badges
0
Definitely you can add dynamic style sheet:
var sheet = document.createElement('style')
sheet.innerHTML = "#navigation ul li {float: right;}";
document.body.appendChild(sheet);
answered Jun 4, 2013 at 9:57
Ivan ChernykhIvan Chernykh
41.1k13 gold badges132 silver badges146 bronze badges
use this function:
function style(selector, cssStyle, final) { // make a style function with paramaters: selecctor (the selector you want to style e.g '.test'), cssStyle (the style you would like to change e.g. 'fontFamily'), and final (e.g 'Arial, Helvetica, sans-serif')
const elems = document.querySelectorAll(selector); // actually get the elements
for (const elem of elems) { // loop through all the elements
elem.style[cssStyle] = final; // change the element's style of cssStyle to final using square brackets (e.g.({ test: true })['test'] outputs true)
}
}
/**
* Example:
* Style all h1s' font family to Arial, Helvetica, sans-serif:
*/
style(
'h1',
'fontFamily',
'Arial, Helvetica, sans-serif'
);
/**
* Style all ps' background image to linear-gradient(to bottom right, red, yellow):
*/
style(
'p',
'backgroundImage',
'linear-gradient(to bottom right, red, yellow)'
);
/**
* You get it, its pretty cool
* For your situation:
*/
style(
'#navigation ul li',
'float',
'right'
)
answered Mar 21, 2020 at 15:06
garrygarry
133 bronze badges
1
If you want to change that dinamycally (you have «javascript» tag in the question) put this in your javascript (on the desired event)
$("#navigation ul li").css("float", "right");
I assume you have Jquery included!
answered Jun 4, 2013 at 9:58
V.VachevV.Vachev
3411 gold badge7 silver badges20 bronze badges
2