Вы могли заметить, что разные типы элементов располагаются по-разному. Некоторые, типа параграфов
и заголовков
растягиваются на всю ширину документа и появляются на отдельных строках. Такие элементы называют блочными. Другие, как ссылки или жирный текст появляются на одной строчке с окружающим их текстом. Они называются встроенными (inline).
Для любого документа браузеры могут построить расположение элементов, расклад, в котором у каждого будет размер и положение на основе его типа и содержимого. Затем этот расклад используется для создания внешнего вида документа.
Размер и положение элемента можно узнать через JavaScript. Свойства
offsetWidth
и
offsetHeight
выдают размер в пикселях, занимаемый элементом. Пиксель – основная единица измерений в браузерах, и обычно соответствует размеру минимальной точки экрана. Сходным образом,
clientWidth
и
clientHeight
дают размер внутренней части элемента, не включая ширину его границ (border).
Я в коробочке
var para = document.body.getElementsByTagName("p")[0];
console.log("clientHeight:", para.clientHeight);
console.log("offsetHeight:", para.offsetHeight);
Самый эффективный способ узнать точное расположение элемента на экране – метод
getBoundingClientRect
. Он возвращает объект со свойствами
top
,
bottom
,
left
, и
right
(сверху, снизу, слева и справа), которые содержат положение элемента относительно левого верхнего угла экрана в пикселях. Если вам надо получить эти данные относительно всего документа, вам надо прибавить текущую позицию прокрутки, которая содержится в глобальных переменных
pageXOffset
и
pageYOffset
.
Разбор документа – задача сложная. В целях быстродействия браузерные движки не перестраивают документ каждый раз после его изменения, а ждут так долго, как это возможно. Когда программа JavaScript, изменившая документ, заканчивает работу, браузеру надо будет просчитать новую раскладку страницы, чтобы вывести изменённый документ на экран. Когда программа запрашивает позицию или размер чего-либо, читая свойства типа
offsetHeight
или вызывая
getBoundingClientRect
, для предоставления корректной информации тоже необходимо рассчитывать раскладку.
Программа, которая периодически считывает раскладку DOM и изменяет DOM, заставляет браузер много раз пересчитывать раскладку, и в связи с этим будет работать медленно. В следующем примере есть две разные программы, которые строят линию из символов X шириной в 2000 пикселей, и измеряют время работы.
function time(name, action) {
var start = Date.now(); // Текущее время в миллисекундах
action();
console.log(name, "заняло", Date.now() - start, "ms");
}
time("тупо", function() {
var target = document.getElementById("one");
while (target.offsetWidth < 2000)
target.appendChild(document.createTextNode("X"));
});
// → тупо заняло 32 ms
time("умно", function() {
var target = document.getElementById("two");
target.appendChild(document.createTextNode("XXXXX"));
var total = Math.ceil(2000 / (target.offsetWidth / 5));
for (var i = 5; i < total; i++)
target.appendChild(document.createTextNode("X"));
});
// → умно заняло 1 ms
Мы видели, что разные элементы HTML ведут себя по-разному. Некоторые показываются в виде блоков, другие встроенные. Некоторые добавляют визуальный стиль – например,
делает жирным текст и делает текст подчёркнутым и синим.
Внешний вид картинки в теге или то, что ссылка в теге при клике открывает новую страницу, связано с типом элемента. Но основные стили, связанные с элементом, вроде цвета текста или подчёркивания, могут быть нами изменены. Вот пример использования свойства style
(стиль):
Обычная ссылка
Зелёная ссылка
Атрибут style
может содержать одно или несколько объявлений свойств ( color
), за которым следует двоеточие и значение. В случае нескольких объявлений они разделяются точкой с запятой: “color: red; border: none”
.
Много всякого можно изменить при помощи стилей. Например, свойство display
контролирует, показывается ли элемент в блочном или встроенном виде.
Текст показан встроенным,
в виде блока, и
вообще не виден.
Блочный элемент выводится отдельным блоком, а последний вообще не виден – display: none
отключает показ элементов. Таким образом можно прятать элементы. Обычно это предпочтительно полному удалению их из документа, потому что их легче потом при необходимости снова показать.
Код JavaScript может напрямую действовать на стиль элемента через свойство узла style
. В нём содержится объект, имеющий свойства для всех свойств стилей. Их значения – строки, в которые мы можем писать для смены какого-то аспекта стиля элемента.
Красотень
var para = document.getElementById("para");
console.log(para.style.color);
para.style.color = "magenta";
Некоторые имена свойств стилей содержат дефисы, например
font-family
. Так как с ними неудобно было бы работать в JavaScript (пришлось бы писать
style[«font-family»]
), названия свойств в объекте стилей пишутся без дефиса, а вместо этого в них появляются прописные буквы:
style.fontFamily
.
Читать дальше