Вычисленное (computed) и окончательное (resolved) значения
Есть две концепции в CSS:
- Вычисленное (computed) значение – это то, которое получено после применения всех CSS-правил и CSS-наследования. Например,
- Окончательное (resolved) значение – непосредственно применяемое к элементу. Значения
Давным-давно
Так что, в настоящее время
#браузер #документ #стили_классы
Есть две концепции в CSS:
- Вычисленное (computed) значение – это то, которое получено после применения всех CSS-правил и CSS-наследования. Например,
height:1em
или font-size:125%
.- Окончательное (resolved) значение – непосредственно применяемое к элементу. Значения
1em
или 125%
являются относительными. Браузер берёт вычисленное значение и делает все единицы измерения фиксированными и абсолютными, например, height:20px
или font-size:16px
. Для геометрических свойств разрешённые значения могут иметь плавающую точку, например, width:50.5px
.Давным-давно
getComputedStyle
был создан для получения вычисленных значений, но оказалось, что окончательные значения гораздо удобнее, и стандарт изменился.Так что, в настоящее время
getComputedStyle
фактически возвращает окончательное значение свойства, для геометрии оно обычно в пикселях.#браузер #документ #стили_классы
👍4🔥3
getComputedStyle требует полное свойство!
Для правильного получения значения нужно указать точное свойство. Например:
Например, если есть свойства
Есть и другие несоответствия. Например, некоторые браузеры (Chrome) отображают
#браузер #документ #стили_классы
Для правильного получения значения нужно указать точное свойство. Например:
paddingLeft
, marginTop
, borderTopWidth
. При обращении к сокращённому: padding
, margin
, border
– правильный результат не гарантируется.Например, если есть свойства
paddingLeft/paddingTop
, то что мы получим вызывая getComputedStyle(elem).padding
? Ничего, или, может быть, «сгенерированное» значение из известных внутренних отступов? Стандарта для этого нет.Есть и другие несоответствия. Например, некоторые браузеры (Chrome) отображают
10px
в документе выше (см. картинку), а некоторые (Firefox) – нет.#браузер #документ #стили_классы
👍2🔥1
Стили, применяемые к посещённым :visited ссылкам, скрываются!
Посещённые ссылки могут быть окрашены с помощью псевдокласса
Но
JavaScript не видит стили, применяемые с помощью
#браузер #документ #стили_классы
Посещённые ссылки могут быть окрашены с помощью псевдокласса
:visited
.Но
getComputedStyle
не даёт доступ к этой информации, чтобы произвольная страница не могла определить, посещал ли пользователь ту или иную ссылку, проверив стили.JavaScript не видит стили, применяемые с помощью
:visited
. Кроме того, в CSS есть ограничение, которое запрещает в целях безопасности применять к :visited
CSS-стили, изменяющие геометрию элемента. Это гарантирует, что нет обходного пути для «злой» страницы проверить, была ли ссылка посещена и, следовательно, нарушить конфиденциальность.#браузер #документ #стили_классы
👍5🔥1
Итого по стилям и классам
Для управления классами существуют два DOM-свойства:
-
-
Чтобы изменить стили:
- Свойство
- Свойство
Для чтения окончательных стилей (с учётом всех классов, после применения CSS и вычисления окончательных значений) используется:
- Метод
#браузер #документ #стили_классы
Для управления классами существуют два DOM-свойства:
-
className
– строковое значение, удобно для управления всем набором классов.-
classList
– объект с методами add/remove/toggle/contains
, удобно для управления отдельными классами.Чтобы изменить стили:
- Свойство
style
является объектом со стилями в формате camelCase. Чтение и запись в него работают так же, как изменение соответствующих свойств в атрибуте "style"
. Чтобы узнать, как добавить в него important
и делать некоторые другие редкие вещи – смотрите документацию.- Свойство
style.cssText
соответствует всему атрибуту "style"
, полной строке стилей.Для чтения окончательных стилей (с учётом всех классов, после применения CSS и вычисления окончательных значений) используется:
- Метод
getComputedStyle(elem, [pseudo])
возвращает объект, похожий по формату на style
. Только для чтения.#браузер #документ #стили_классы
👍5🔥3
Размеры и прокрутка элементов
Существует множество JavaScript-свойств, которые позволяют считывать информацию об элементе: ширину, высоту и другие геометрические характеристики. В этой главе мы будем называть их «метрики».
Они часто требуются, когда нам нужно передвигать или позиционировать элементы с помощью JavaScript.
#браузер #документ #размеры
Существует множество JavaScript-свойств, которые позволяют считывать информацию об элементе: ширину, высоту и другие геометрические характеристики. В этой главе мы будем называть их «метрики».
Они часто требуются, когда нам нужно передвигать или позиционировать элементы с помощью JavaScript.
#браузер #документ #размеры
👍5🔥3
Размеры и полоса прокрутки: общий вид
У элемента есть рамка
#браузер #документ #размеры
У элемента есть рамка
border
, внутренний отступ padding
и прокрутка. Полный набор характеристик. Обратите внимание, тут нет внешних отступов margin
, потому что они не являются частью элемента, для них нет особых JavaScript-свойств.#браузер #документ #размеры
👍6🔥2
Внимание, полоса прокрутки
В иллюстрации выше намеренно продемонстрирован самый сложный и полный случай, когда у элемента есть ещё и полоса прокрутки. Некоторые браузеры (не все) отбирают место для неё, забирая его у области, отведённой для содержимого (помечена как «
Таким образом, без учёта полосы прокрутки ширина области содержимого (content width) будет
#браузер #документ #размеры
В иллюстрации выше намеренно продемонстрирован самый сложный и полный случай, когда у элемента есть ещё и полоса прокрутки. Некоторые браузеры (не все) отбирают место для неё, забирая его у области, отведённой для содержимого (помечена как «
content width
» выше).Таким образом, без учёта полосы прокрутки ширина области содержимого (content width) будет
300px
, но если предположить, что ширина полосы прокрутки равна 16px
(её точное значение зависит от устройства и браузера), тогда остаётся только 300 - 16 = 284px
, и мы должны это учитывать. Вот почему примеры в этой главе даны с полосой прокрутки. Без неё некоторые вычисления будут проще.#браузер #документ #размеры
👍8🔥2
Метрики
Вот общая картина с геометрическими свойствами. Значениями свойств являются числа, подразумевается, что они в пикселях.
К ней мы часто будем возвращаться в следующих постах и описывать отдельные составляющие. А пока просто изучите, что за что примерно отвечает.
#браузер #документ #размеры
Вот общая картина с геометрическими свойствами. Значениями свойств являются числа, подразумевается, что они в пикселях.
К ней мы часто будем возвращаться в следующих постах и описывать отдельные составляющие. А пока просто изучите, что за что примерно отвечает.
#браузер #документ #размеры
👍5🔥1
offsetParent, offsetLeft/Top
Эти свойства редко используются, но так как они являются «самыми внешними» метриками, мы начнём с них.
В свойстве
То есть, ближайший предок, который удовлетворяет следующим условиям:
- Является CSS-позиционированным (CSS-свойство
- или
- или
Свойства
В примере выше внутренний
#браузер #документ #размеры
Эти свойства редко используются, но так как они являются «самыми внешними» метриками, мы начнём с них.
В свойстве
offsetParent
находится предок элемента, который используется внутри браузера для вычисления координат при рендеринге.То есть, ближайший предок, который удовлетворяет следующим условиям:
- Является CSS-позиционированным (CSS-свойство
position
равно absolute
, relative
, fixed
или sticky
),- или
<td>
, <th>
, <table>
,- или
<body>
.Свойства
offsetLeft/offsetTop
содержат координаты x/y относительно верхнего левого угла offsetParent
.В примере выше внутренний
<div>
имеет элемент <main>
в качестве offsetParent
, а свойства offsetLeft/offsetTop
являются сдвигами относительно верхнего левого угла (180
).#браузер #документ #размеры
👍7🔥3
Вот так выглядят свойства offsetParent, offsetLeft/Top
Подробное описание можете посмотреть постом выше: https://t.me/notesjs/567
#браузер #документ #размеры
Подробное описание можете посмотреть постом выше: https://t.me/notesjs/567
#браузер #документ #размеры
👍5🔥2
offsetWidth/Height
Теперь переходим к самому элементу.
Эти два свойства – самые простые. Они содержат «внешнюю» ширину/высоту элемента, то есть его полный размер, включая рамки.
Для нашего элемента:
-
-
#браузер #документ #размеры
Теперь переходим к самому элементу.
Эти два свойства – самые простые. Они содержат «внешнюю» ширину/высоту элемента, то есть его полный размер, включая рамки.
Для нашего элемента:
-
offsetWidth = 390
– внешняя ширина блока, её можно получить сложением CSS-ширины (300px
), внутренних отступов (2 * 20px
) и рамок (2 * 25px
).-
offsetHeight = 290
– внешняя высота блока.#браузер #документ #размеры
🔥6👍3
Метрики для не показываемых элементов равны нулю.
Координаты и размеры в JavaScript устанавливаются только для видимых элементов.
Если элемент (или любой его родитель) имеет
Например, свойство
Мы можем использовать это, чтобы делать проверку на видимость.
Заметим, что функция
#браузер #документ #размеры
Координаты и размеры в JavaScript устанавливаются только для видимых элементов.
Если элемент (или любой его родитель) имеет
display:none
или отсутствует в документе, то все его метрики равны нулю (или null
, если это offsetParent
).Например, свойство
offsetParent
равно null
, а offsetWidth
и offsetHeight
равны 0
, когда мы создали элемент, но ещё не вставили его в документ, или если у элемента (или у его родителя) display:none
.Мы можем использовать это, чтобы делать проверку на видимость.
Заметим, что функция
isHidden
также вернёт true
для элементов, которые в принципе показываются, но их размеры равны нулю (например, пустые <div>
).#браузер #документ #размеры
👍5🔥3
clientTop/Left
Пойдём дальше. Внутри элемента у нас рамки (border).
Для них есть свойства-метрики
В нашем примере:
-
-
Но на самом деле эти свойства – вовсе не ширины рамок, а отступы внутренней части элемента от внешней.
#браузер #документ #размеры
Пойдём дальше. Внутри элемента у нас рамки (border).
Для них есть свойства-метрики
clientTop
и clientLeft
.В нашем примере:
-
clientLeft = 25
– ширина левой рамки-
clientTop = 25
– ширина верхней рамкиНо на самом деле эти свойства – вовсе не ширины рамок, а отступы внутренней части элемента от внешней.
#браузер #документ #размеры
👍5🔥1
scrollWidth/Height
Эти свойства – как
На рисунке выше:
-
-
Эти свойства можно использовать, чтобы «распахнуть» элемент на всю ширину/высоту.
#браузер #документ #размеры
Эти свойства – как
clientWidth/clientHeight
, но также включают в себя прокрученную (которую не видно) часть элемента.На рисунке выше:
-
scrollHeight = 723
– полная внутренняя высота, включая прокрученную область.-
scrollWidth = 324
– полная внутренняя ширина, в данном случае прокрутки нет, поэтому она равна clientWidth
.Эти свойства можно использовать, чтобы «распахнуть» элемент на всю ширину/высоту.
#браузер #документ #размеры
👍4🔥1
scrollLeft/scrollTop
Свойства
Следующая иллюстрация показывает значения
Другими словами, свойство
#браузер #документ #размеры
Свойства
scrollLeft/scrollTop
– ширина/высота невидимой, прокрученной в данный момент, части элемента слева и сверху.Следующая иллюстрация показывает значения
scrollHeight
и scrollTop
для блока с вертикальной прокруткой.Другими словами, свойство
scrollTop
– это «сколько уже прокручено вверх».#браузер #документ #размеры
👍3🔥2
Алло, мы ищем таланты!
В команду разработчиков fintech-проектов требуются уверенные пользователи ПК со знанием Word, Excel, PowerPoint и умениями разложить пасьянс-косынку с завязанными глазами. От нас кофе, чай и печенюшки, удалёнка с удобным графиком в любимом кресле на вашей персональной клаве, если конечно у вас не лапки! Для проверки, что не лапки, есть несложные тестовые задания.
А если без юмора, то:
Ищем backend-разработчиков с опытом работы от 1 года; уверенным владением Laravel; опытом разработки на PHP, MySQL, знаниями ООП; уверенной работой c Git. Приветствуем: знания верстки, HTML, CSS, JS и популярные библиотеки; знание Docker, владение консолью.
Ищем frontend-разработчиков: HTML, CSS, Javascript, ES6 React Redux git, Redux toolkit, Next.js.
Удаленная работа. График свободный, предпочтительно внутри дня по мск. Оплата от 70 000 junior, от 100 000 mid, от 150 000 senior. Возможность работы по договору для самозанятых или официальное трудоустройство согласно ТК РФ.
Связь по тлг: @scorpinfire
В команду разработчиков fintech-проектов требуются уверенные пользователи ПК со знанием Word, Excel, PowerPoint и умениями разложить пасьянс-косынку с завязанными глазами. От нас кофе, чай и печенюшки, удалёнка с удобным графиком в любимом кресле на вашей персональной клаве, если конечно у вас не лапки! Для проверки, что не лапки, есть несложные тестовые задания.
А если без юмора, то:
Ищем backend-разработчиков с опытом работы от 1 года; уверенным владением Laravel; опытом разработки на PHP, MySQL, знаниями ООП; уверенной работой c Git. Приветствуем: знания верстки, HTML, CSS, JS и популярные библиотеки; знание Docker, владение консолью.
Ищем frontend-разработчиков: HTML, CSS, Javascript, ES6 React Redux git, Redux toolkit, Next.js.
Удаленная работа. График свободный, предпочтительно внутри дня по мск. Оплата от 70 000 junior, от 100 000 mid, от 150 000 senior. Возможность работы по договору для самозанятых или официальное трудоустройство согласно ТК РФ.
Связь по тлг: @scorpinfire
Свойства scrollLeft/scrollTop можно изменять
В отличие от большинства свойств, которые доступны только для чтения, значения
При клике на следующий элемент будет выполняться код
Установка значения
#браузер #документ #размеры
В отличие от большинства свойств, которые доступны только для чтения, значения
scrollLeft/scrollTop
можно изменять, и браузер выполнит прокрутку элемента.При клике на следующий элемент будет выполняться код
elem.scrollTop += 10
. Поэтому он будет прокручиваться на 10px
вниз.Установка значения
scrollTop
на 0
или Infinity
прокрутит элемент в самый верх/низ соответственно.#браузер #документ #размеры
👍5🔥2
Не window.innerWidth/Height
Браузеры также поддерживают свойства
Если есть полоса прокрутки, и она занимает какое-то место, то свойства
А
Если полоса прокрутки занимает некоторое место, то эти две строки выведут разные значения.
#браузер #документ #размеры
Браузеры также поддерживают свойства
window.innerWidth/innerHeight
. Вроде бы, похоже на то, что нам нужно. Почему же не использовать их?Если есть полоса прокрутки, и она занимает какое-то место, то свойства
clientWidth/clientHeight
указывают на ширину/высоту документа без неё (за её вычетом). Иными словами, они возвращают высоту/ширину видимой части документа, доступной для содержимого.А
window.innerWidth/innerHeight
включают в себя полосу прокрутки.Если полоса прокрутки занимает некоторое место, то эти две строки выведут разные значения.
#браузер #документ #размеры
👍7🔥2
Ширина/высота документа
Теоретически, т.к. корневым элементом документа является
Но именно на этом элементе, для страницы в целом, эти свойства работают не так, как предполагается. В Chrome/Safari/Opera, если нет прокрутки, то
Чтобы надёжно получить полную высоту документа, нам следует взять максимальное из этих свойств.
#браузер #документ #размеры
Теоретически, т.к. корневым элементом документа является
documentElement
, и он включает в себя всё содержимое, мы можем получить полный размер документа как documentElement.scrollWidth/scrollHeight
.Но именно на этом элементе, для страницы в целом, эти свойства работают не так, как предполагается. В Chrome/Safari/Opera, если нет прокрутки, то
documentElement.scrollHeight
может быть даже меньше, чем documentElement.clientHeight
! С точки зрения элемента это невозможная ситуация.Чтобы надёжно получить полную высоту документа, нам следует взять максимальное из этих свойств.
#браузер #документ #размеры
👍2🔥1
Получение текущей прокрутки
Обычные элементы хранят текущее состояние прокрутки в
Что же со страницей? В большинстве браузеров мы можем обратиться к
К счастью, нам совсем не обязательно запоминать эти особенности, потому что текущую прокрутку можно прочитать из свойств
Эти свойства доступны только для чтения.
#браузер #документ #размеры
Обычные элементы хранят текущее состояние прокрутки в
elem.scrollLeft/scrollTop
.Что же со страницей? В большинстве браузеров мы можем обратиться к
documentElement.scrollLeft/Top
, за исключением основанных на старом WebKit (Safari), где есть ошибка (5991), и там нужно использовать document.body
вместо document.documentElement
.К счастью, нам совсем не обязательно запоминать эти особенности, потому что текущую прокрутку можно прочитать из свойств
window.pageXOffset/pageYOffset
Эти свойства доступны только для чтения.
#браузер #документ #размеры
👍5🔥2