Для манипуляции свойствами элемента в JavaScript есть несколько свойств. К ним относятся:
Для получения css-свойств из внешней таблицы стилей - метод window.getComputedStyle().
Познакомимся с ними на примерах.
Свойство style элемента
Самое старое и самое, пожалуй, известное - свойство style. Записывается следующим образом:
1 2 3 4 5 6 7 8 9 |
element.style.cssСвойство = "значение"; Например, var elem = document.getElementById("elem"); elem.style.backgroundColor = "red"; elem.style.fontSize= "2.3em"; elem.style.color = "#fff"; elem.style.fontWeight= "bold"; |
Обратите внимание, что свойства, состоящие из 2-х слов и пишущиеся в css-стилях через дефис, в JS записываются слитно, без всяких черточек или нижних подчеркиваний, причем второе слово начинается с заглавной буквы. Это так называемый "Camel Case", или "горбатый синтаксис", позволяющий визуально отделить друг от друга слова в многосложных конструкциях. Например, css-свойство background-color превратилось в backgroundColor, font-size - в fontSize, а одиночное свойство color так и осталось в виде color. Если бы мы использовали такое свойство, как list-style-type, то должны были бы написать listStyleType.
Исключением является свойство float:
1 |
elem.style.cssFloat вместо elem.style.float |
Дело в том, что слово float является зарезервированным в стандарте языка JavaScript, поэтому его использование в стилевых свойствах невозможно.
В случае использования свойства style мы добавляем inline-форматирование для элемента, к которому обращаемся в JavaScript. Т.е. с точки зрения инспектора свойств те стили, которые были записаны в скрипте будут применены к элементу в виде атрибута style
. Это видно из инспектора свойств в браузере.
Напомню, что такие свойства имеют приоритет перед теми, которые заданы в css-файле. И в этом есть как свои плюсы, так и свои минусы.
Чтобы сбросить поставленный стиль, присваивают в style
пустую строку:
1 |
elem.style.background=""; |
Эту особенность можно использовать, если вам нужно переключаться между какими-то свойствами элемента по событию, например, по клику или по наведению-уведению курсора мыши. В примере ниже при наведении на элемент маркированного списка мы видим изображение слева. При уведении курсора снова отображается маркер, т.е. изображение исчезает.
- Lorem ipsum dolor sit amet.
- Et a quos sed ex.
- Veniam, incidunt repellat ullam minus!
- Quam non incidunt nemo consectetur.
- Voluptatibus velit omnis, adipisci. Nobis!
Код примера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<ul id="test"> <li>Lorem ipsum dolor sit amet.</li> <li>Et a quos sed ex.</li> <li>Veniam, incidunt repellat ullam minus!</li> <li>Quam non incidunt nemo consectetur.</li> <li>Voluptatibus velit omnis, adipisci. Nobis!</li> </ul> <script> var ul = document.querySelector("#test"); ul.onmouseover = function(e){ e.target.style.listStyleImage = "url(img/check-icon.png)"; } ul.onmouseout = function(e){ e.target.style.listStyleImage = ""; } </script> |
Важно: писать код на javascript, который манипулирует свойствами html-элементов нужно ПОСЛЕ того, как они встретятся на странице, иначе у вас будет ошибка в скрипте, т.к. искомый элемент просто не будет найден. Проще всего располагать теги <script>
в самом низу html-документа перед закрывающимся тегом </body>
.
Для того чтобы разобраться с тем, что делает такой метод, как document.querySelector()
, стоит прочитать статью Выбор элементов html-страницы с помощью JavaScript.
Свойство style.cssText элемента
Предположим, мы не хотим прописывать в виде нескольких строк целый ряд css-свойств для элемента, тем более, что в итоге они все будут друг за другом перечислены в атрибуте style (см. рисунок выше из Инспектора свойств). Но в свойство style элемента в JavaScript нельзя присвоить строку, состоящую из нескольких свойств. для этого можно использовать свойство style.cssText, которое записывается так:
1 |
elem.style.cssText = "background: red; color: #fff; padding: 10px;"; |
Это удобней, чем записывать каждое свойство на отдельной строке.
В примере ниже строка css-свойств используется для изменения вида абзаца при клике на нем. Код можно посмотреть во вкладке JS.
See the Pen JS style and className property by Elen (@ambassador) on CodePen.
Свойство className
Свойство className предполагает, что вы имеете таблицу стилей, связанную с вашим html-файлом с некоторым количеством классов в ней (стандартная ситуация, не так ли?). Как правило, класс предполагает наличие не 1-2 стилевых свойств, а 4, 5 и более. В плане применения всех свойств форматирование назначение класса намного удобнее и с точки зрения использования JavaScript, и с точки зрения подключения css.
Назначить класс для элемента можно, используя свойство className (использовать в JS слово class нельзя, т.к. оно является зарезервированным - аналогично float).
1 |
elem.className = "red-heart"; |
Чтобы удалить класс, достаточно в это свойство записать пустую строку.
1 |
elem.className = ""; |
В примере со списком нужно кликнуть по любому элементу - строке стихотворения - и она окрасится в другой цвет с изменением цвета текста и нижней границей. При повторном клике вид строки вернется к первоначальному.
- И. Демьянов
- Под самым карнизом,
- Над самым оконцем
- Забралось в сосульки
- Весеннее солнце.
- Сверкая, бегут по сосулькам слезинки…
- И тают сосульки – веселые льдинки.
Использованный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<style> #myList {cursor: pointer;} .higtlight { background-color: #ddaaff; color: #5533ff; padding: 0 5px; border-bottom: 1px solid #5533ff; } </style> <ul id="myList">И. Демьянов <li>Под самым карнизом,</li> <li>Над самым оконцем</li> <li>Забралось в сосульки</li> <li>Весеннее солнце.</li> <li>Сверкая, бегут по сосулькам слезинки…</li> <li>И тают сосульки – веселые льдинки. </li> </ul> <script> var ul = document.getElementById("myList"); ul.onclick = function(e){ if(e.target.tagName != "UL"){ e.target.className == "higtlight" ? e.target.className = "" : e.target.className = "higtlight"; } } </script> |
На рисунке видно, что при клике на строке добавляется атрибут class="higtlight"
, а при повторном клике атрибут class=""
, т.е. имеет пустое значение, как и прописано в js-коде. Чтобы совсем удалить атрибут class
или style
, необходимо воспользоваться методом removeAttribute():
1 |
elem.removeAttribute("class"); |
Здесь мы удаляем атрибут class
, а не className
, т.к. это строка, а не название свойства.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<style> #stih{cursor: pointer;} .add { color: #d24909; padding: 0 5px; border-bottom: 2px dotted #d24909;} </style> <ul id="stih">Т. Дмитриев <li>Тюки-тюки, тюки-так –</li> <li>Звон веселый слышен.</li> <li>Звон веселый слышен.</li> <li>Завела под крышей...</li> </ul> <script> var ul = document.getElementById("stih"); ul.onclick = function(e){ if(e.target.tagName != "UL"){ e.target.className == "add" ? e.target.removeAttribute("class"): e.target.className = "add"; } } </script> |
- Т. Дмитриев
- Тюки-тюки, тюки-так –
- Звон веселый слышен.
- Звон веселый слышен.
- Завела под крышей...
В инспекторе свойств видно, что сначала у двух элементов
li
был добавлен атрибут class="add"
, а затем у верхнего li
он исчез.
Таким же образом можно удалять атрибут style:
1 |
elem.removeAttribute("style"); |
Свойство classList
Свойство classList возвращает список классов элемента. В нем можно использовать 4 метода:
- add – добавление класса;
- remove – удаление класса;
- toggle – переключение класса;
- replace – замена одного класса на другой;
- contains – проверка наличия класса у элемента.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// добавление элементу класса "pink" elem.classList.add("pink"); // можно добавить нескольких классов через запятую elem.classList.add( "container", "bg-big" ); // удаление класса "pink" elem.classList.remove("pink"); //можно удалить несколько классов elem.classList.remove("pink", "bordered", "clearfix"); // переключение класса "pink" elem.classList.toggle("pink"); //замена одного класса на другой elem.classList.replace('visible', 'invisible'); //свойство,которое возвращает количество классов, назначенных элементу elem.classList.length // проверка, есть ли у элемента класс "pink". // Если есть - метод возвращает true, если класса нет, то false console.log( elem.classList.contains("pink") ); |
Ссылка на описание свойства classList.
Изменение классов методами classList.add() и classList.remove()
Попробуем использовать 3 из 4-х методов свойства classList: contains() для проверки, а назначен ли класс у элемента, add() - для добавления класса, если он не назначен и remove() - для удаления класса при повторном клике.
В примере ниже при клике на любом абзаце добавляется класс "pink". При повторном клике этот класс удаляется.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis vero et vitae accusantium tenetur soluta, possimus ratione molestias expedita neque!
Totam aperiam, expedita eaque. Cum ea consectetur, quas magni fuga animi vero amet repudiandae aperiam ullam, placeat tempore in doloribus!
Incidunt sequi et harum dignissimos quam facere perferendis sunt nesciunt pariatur perspiciatis, magnam natus facilis excepturi, quisquam recusandae doloremque temporibus.
Id ratione quisquam, sed illum debitis consectetur atque enim officiis aut dolorum eaque doloribus distinctio necessitatibus animi praesentium laborum, ad!
Код примера выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<style> #test-list {width: 90%; margin: 0 auto;} #test-list p { cursor: pointer; margin: 10px 0;} .pink { background-color: pink; box-shadow: 1px 1px 3px #900; text-shadow: 0 0 3px rgba(0, 0, 0, .7); } </style> <div id="test-list"> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nobis vero et vitae accusantium tenetur soluta, possimus ratione molestias expedita neque!</p> <p class="pink">Totam aperiam, expedita eaque. Cum ea consectetur, quas magni fuga animi vero amet repudiandae aperiam ullam, placeat tempore in doloribus!</p> <p>Incidunt sequi et harum dignissimos quam facere perferendis sunt nesciunt pariatur perspiciatis, magnam natus facilis excepturi, quisquam recusandae doloremque temporibus.</p> <p>Id ratione quisquam, sed illum debitis consectetur atque enim officiis aut dolorum eaque doloribus distinctio necessitatibus animi praesentium laborum, ad!</p> </div> <script> var par = document.querySelectorAll("#test-list p"); for(var i=0; i<par.length; i++){ par[i].title = "Щелкни на абзаце"; par[i].onclick = function(){ this.classList.contains("pink") ? this.classList.remove("pink") : this.classList.add("pink"); } } </script> |
Переключение классов методом classList.toggle()
Например, нужно сделать простейший переключатель видимых - невидимых элементов с помощью классов. Используем здесь переключатель классов - метод toggle() для того, чтобы добавить к основному классу знак минус с помощью класса "minus" и показать блок абзацев в классе "hide".
See the Pen classList Property by Elen (@ambassador) on CodePen.
В примере с абзацами можно было бы сократить код, просто использовав метод classList.toggle():
1 2 3 4 5 6 7 8 9 |
<script> var par = document.querySelectorAll("#test-list p"); for(var i=0; i<par.length; i++){ par[i].title = "Щелкни на абзаце"; par[i].onclick = function(){ this.classList.toggle("pink"); } } </script> |
Еще один пример от Nikolay Talanov покажет, как можно манипулировать классами для создания красивого блока для вашего сайта.
See the Pen Cool Layout with Complex Chainable Animation by Nikolay Talanov (@j_holtslander) on CodePen.
Пример переключения темы страницы со светлой на темную с помощью elem.classList.replace()
:
See the Pen Light / Dark Mode by Mostafa Fotouhi (@mostafa-fotouhi) on CodePen.
Метод window.getComputedStyle()
В том случае, когда вам нужно не просто назначить стили или классы для html-элемента, а получить их из таблицы стилей, использовать свойство style
не получится, т.к. у элемента нет такого свойства в виде атрибута, зато оно вычислено на сонове его стилей в css-файле.
Используйте для получения стилевых свойств метод window.getComputedStyle(). Он возвращает объект, содержащий значения всех CSS-свойств элемента, полученных после применения всех активных таблиц стилей, и завершения базовых вычислений значений, которые они могут содержать. Причем получить свойства можно как для самого элемента, так и для псевдоэлемента, указав его в качестве второго параметра.
1 2 3 4 5 |
let style = window.getComputedStyle(element [, pseudoElt]); let top = window.getComputedStyle(document.getElementById('my-elem')).getPropertyValue("top"); let widthAfter = window.getComputedStyle( document.querySelector('.test-elem'), ':after' ).getPropertyValue('width'); |
Обратите внимание, что нужно еще использовать метод getPropertyValue('свойство')
для того, чтобы получить значение конкретного свойства.
В JavaScript вы можете использовать значения свойств из внешних таблиц стилей, но не переназначать их в них. Например, мы получим значение свойства top
для абсолютно спозиционированного элемента, а затем будем смещать его вниз с помощью функции setInterval()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<style> .test-wrap { position: relative; height: 300px; overflow: hidden; } #style-box { position: absolute; width: 120px; height: 120px; background-color: #18b70b; border: 2px solid #2b8924; top: 30px; left: 20px; text-align: center; padding-top: 20px; } #get-style { margin-left: 20px; } </style> <div class="test-wrap"> <div id="style-box"></div> <button class="button" id="get-style">Получить стиль</button> <script> let btnStyle = document.getElementById('get-style'), styleBox = document.getElementById('style-box'), wrap = document.querySelector('.test-wrap');; btnStyle.onclick = function() { let top = window.getComputedStyle(styleBox).getPropertyValue("top"); let wrapHeight = parseInt(window.getComputedStyle(wrap).getPropertyValue("height")); console.log(top, wrapHeight); styleBox.innerHTML = top; top = parseInt(top); let boxId = setInterval(function() { top += 20; styleBox.style.top = styleBox.innerHTML = top + "px"; console.log(styleBox.style.top); if (top > wrapHeight+10) { clearInterval(boxId); styleBox.style.top = styleBox.innerHTML = '30px'; } }, 200); } </script> </div> |
Нажмите на кнопку, чтобы запустить скрипт.
Вы можете посмотреть на использование этого метода в статье "Видимость элемента в JavaScript. Свойство display: none и block"
Здравствуйте, мне нужно, чтобы button переключала цвет body background c одного на другой. Не подскажете, что-то никак не получается)))
Здравствуйте. Проще всего задать в стилях какой-то класс, который бы назначал цвет фона. Например,
.bg {background-color: green}
, а затем при клике на кнопке добавлять/удалять этот класс дляdocument.body
Примерно так:
button.onclick = function {
document.body.classList.toggle('bg');
}
А как насчет изменения тех свойств, которые были заданы в css?
Всем привет)
CSS cвойства элемента style, cssText, className вообще используются сейчас?
Их же можно задать в css. Зачем это делать в JavaScript?
Конечно. так и надо делать.
Сначала нужно задать свойства в css, а в JS ими можно манипулировать.
Например, для того чтобы при перемещении пользователя по большой посадочной странице в меню "загорался" соответствующий пункт, необходимо именно с помощью JS или (jQuery) убирать класс у одного элемента и назначать его другому.
Ни HTML, ни CSS этого пока сделать не могут.
Спасибо.
Очень понятно. Сделал все примеры. Все работает.