Расширить элемент
В <body>
есть элемент <div>
с заданной шириной width
.
Задача – написать код, который «распахнёт» <div>
по ширине на всю страницу.
Исходный документ (<div>
содержит текст и прокрутку):
P.S. Пользоваться следует исключительно средствами JS, CSS в этой задаче менять нельзя. Также ваш код должен быть универсален и не ломаться, если цифры в CSS станут другими.
P.P.S. При расширении элемент <div>
не должен вылезти за границу <body>
.
Решение через width: auto
Вначале рассмотрим решение через «умную» установку CSS-свойства.
Они могут быть разными. Самое простое выглядит так:
elem.
style.
width =
'auto'
;
Такой способ работает, так как <div>
по умолчанию распахивается на всю ширину.
Конечно, такое решение не будет работать для элементов, которые сами по себе не растягиваются, например в случае со <span>
или при наличии position: absolute
.
Обратим внимание, такой вариант был бы неверен:
elem.
style.
width =
'100%'
;
По умолчанию в CSS ширина width
– это то, что внутри padding
, а проценты отсчитываются от ширины родителя. То есть, ставя ширину в 100%
, мы говорим: «внутренняя область должна занимать 100%
ширины родителя». А в элементе есть ещё padding
, которые в итоге вылезут наружу.
Можно бы поменять блочную модель, указав box-sizing
через свойство elem.style.boxSizing
, но такое изменение потенциально может затронуть много других свойств, поэтому нежелательно.
Точное вычисление
Альтернатива – вычислить ширину родителя через clientWidth
.
Доступную внутреннюю ширину родителя можно получить, вычитая из clientWidth
размеры paddingLeft/paddingRight
, и затем присвоить её элементу:
var
bodyClientWidth =
document.
body.
clientWidth;
var
style =
getComputedStyle
(
elem)
;
var
bodyInnerWidth =
bodyClientWidth -
parseInt
(
style.
paddingLeft)
-
parseInt
(
style.
paddingRight)
;
elem.
style.
width =
bodyInnerWidth +
'px'
;
Такое решение будет работать всегда, вне зависимости от типа элемента. Конечно, при изменении размеров окна браузера ширина не адаптируется к новому размеру автоматически, как с width:auto
. Это недостаток. Его, конечно, тоже можно обойти при помощи событий (изучим далее), но как общий рецепт – если CSS может решить задачу – лучше использовать CSS.