Javascript не только предназначен для создания функциональности на странице. Благодаря наличию Documnt Object Model (DOM) и Browser Object Model (BOM), язык может взаимодействовать с разметкой, стилями и браузером. DOM является древовидной структурой, основой которой является объект Window.
Элементы HTML разметки представляются в DOM как набор объектов в определенной иерархии. Каждый HTML элемент представлен в виде объекта со своими свойствами и методами. Поэтому, посредством JS, можно обращаться к элементам разметки и манипулировать с их свойствами.
Свойства HTML элементов выражены в CSS стилях. Однако JS не может изменять стили, заключенные в теге <style>, а также во внешних файлах CSS. Когда посредством JS изменяется или добавляется новое свойство CSS для элемента, то интерпретатор формирует его как атрибут «style». Это можно наглядно увидеть в инструментах разработчика Chrome или в Firebug браузера Firefox.
Объекты в иерархии DOM распределены в следующей последовательности:
Теперь подробнее о каждом из них:
Прежде чем присвоить элементу какой-либо стиль, нужно сначала обратиться к объекту этого элемента, через объект Document. Выглядит это следующим образом: Document.Element(метод обращения к элементу).style.property = value
Подробнее об этой конструкции:
Аналогичным способом мы можем прочитать значение любого CSS свойства. Однако это возможно только в том случае, если у элемента стоит атрибут style. Рассмотрим на примере обращение к элементу посредством метода «getElementById(name)»
Пример:
<p id = «paragraph» class = «parag1»>Параграф<\p>
var p = document.getElementById(«paragraph»); // сохранили в переменную элемент с id = paragraph.
p.style.fontSize = «3em»; // изменим стиль параграфа, увеличив его шрифт до 3em
Если открыть инструменты разработчика в браузере, параграф будет с атрибутом style: <p id = «paragraph» class = «parag1» style = «font-size: 3em»>Параграф<\p>
Есть несколько методов объекта document для поиска определенного элемента по классу, по айди или имени тега:
Пример:
<p id = «paragraph» class = «parag1»>Параграф<\p>
<form>
<input type = «text»>
<input type = «submit»>
</form>
<img src = «cat.jpg»>// Получаем объекты этих элементов
var p = document.getElementById(«paragraph»); // получаем параграф по айди
var f = document.forms; // получили список форм, состоящий из одной
var i = document.images; // получение всех изображений//Добавим полученным элементам стили
p.style.backgroundColor = «red»;
f.style.borderRadius = «20px»;
i.style.float = «left»;
i.style.margin = «50px»;
В CSS имена свойств пишутся через дефис, к примеру: font-size, background-image, border-width и другие. Сейчас рассматриваются именно те свойства, которые пишутся через дефис. В JavaScript свойства пишутся слитно, но с большой буквы: fontSize, backgroundImage, borderWidth. Данное правило не относится к свойствам CSS, состоящим из одного слова: width, position, margun и другие указываются в JavaScript с тем-же синтаксисом.
Представим, что у нас есть внешний CSS файл со свойствами для тегов определенного класса:
.paragraph{
font-size: 20px;
background-color: yellow;
border: 1px solid black;
}
Теперь в том-же файле определим стиль, для несуществующего элемента:
.chageParagraph{
font-size: 3em;
}
В HTML у нас есть элемент для которого были написаны эти стили:
<p class = «paragraph»>Параграф<\p>
Чтобы определить параграфу стили из внешнего файла, нужно сменить имя его класса. Мы определили стили для несуществующего класса. Его мы и поставим нашему параграфу:
var p = document.getElementById(«paragraph»); // Сохранили объект параграфа в переменную
p.class = «changeParagraph»; // Замена имени класса параграфа
Теперь наш параграф получил новый класс «chageParagraph». Как видно для данного класса определены лишь стили по увеличению размера шрифта. Соответственно, фоновый цвет стал по умолчанию, и рамка исчезла. Вернуть обратно прежний стиль можно прежним образом, через установку старого имени класса. Такой подход часто применяют в событиях при добавлении интерактивности странице.
Рассмотрим несколько полезных свойств и методов, которые удобно применять для значения атрибутов class и id:
Рассмотрим несколько примеров для установки стилей для различных элементов через JavaScript:
ClassList хранит объект всех классов определенных элементов. Он обладает своими методами и свойствами для манипуляций с классами. Рассмотрим несколько примеров:
Пример 1: Добавление надписи посредством нажатия на кнопку
<p id=»demo»>Click the button to change the text in this paragraph.</p>
<button onclick=»myFunction()»>Try it</button>
<script>
function myFunction() {
document.getElementById(«demo»).innerHTML = «Hello World»;
}
</script>
Пример 2: Смена цвета текста параграфа
<p id=»demo»>Click the button to change the color of this paragraph.</p>
<button onclick=»myFunction()»>Try it</button>
<script>
function myFunction() {
var x = document.getElementById(«demo»);
x.style.color = «red»;
}
</script>Пример 3: Смена фонового цвета среднего параграфа
<div class=»example»>
<p>P element in first div with class=»example». Div’s index is 0.</p>
</div><div class=»example color»>
<p>P element in first div with class=»example color». Div’s index is 0.</p>
</div><div class=»example color»>
<p>P element in second div with class=»example color». Div’s index is 1.</p>
</div><p>Click the button to change the background color of the first div element with the classes «example» and «color».</p>
<button onclick=»myFunction()»>Try it</button>
<script>
function myFunction() {
var x = document.getElementsByClassName(«example color»);
x[0].style.backgroundColor = «red»;
}
</script>
Пример 4: Смена фона для всех элементов списка
<p>This is a p element</p>
<p>This is also a p element.</p>
<p>This is also a p element — Click the button to change the background color of all p elements in this document.</p>
<button onclick=»myFunction()»>Try it</button>
<script>
function myFunction() {
var x = document.getElementsByTagName(«P»);
var i;
for (i = 0; i < x.length; i++) {
x[i].style.backgroundColor = «red»;
}
}
</script>
Пример 5: Получение всех параметров документа
<p>An unordered list:</p>
<ul>
<li>Coffee</li>
<li>Tea</li>
<li>Milk</li>
</ul><p>Click the button to display the innerHTML of the UL element (index 3).</p>
<button onclick=»myFunction()»>Try it</button>
<p id=»demo»></p>
<script>
function myFunction() {
var x = document.getElementsByTagName(«*»);
document.getElementById(«demo»).innerHTML = x[3].innerHTML;
}
</script>
Обратите внимание, здесь все элементы помещены в список через параметр «*». Обращение к любому из них также осуществляется через индекс.
Современный JavaScript не является удобным инструментом для манипуляций со стилями. доя этого есть ряд других инструментов, к примеру JQuery. Однако каждый разработчик должен знать как управлять стилями нативным языком.