Измеряем и задаём размеры элементов с помощью JavaScript
Методы получения и изменения размеров DOM-элементов
Наиболее универсальным и точным способом получения фактических размеров элемента (вместе с границами, отступами и трансформациями) является метод getBoundingClientRect(). Он возвращает объект DOMRect с полями width, height, top, left, right, bottom. Результат не зависит от box-sizing и учитывает любые CSS-трансформации.
const element = document.getElementById('myBox');
const rect = element.getBoundingClientRect();
console.log(`Ширина: ${rect.width}px, Высота: ${rect.height}px`);Js text width (измерение ширины текста в javascript)
Ширина: 302px, Высота: 102px
Border width js (стиль border-width в javascript)
Типичная ошибка:
Попытка получить размеры скрытого элемента (display: none) вернёт нулевые значения. Необходимо временно сделать элемент видимым (например, установить visibility: hidden; position: absolute; display: block), измерить, а затем вернуть исходное состояние.
Как узнать видимую ширину и высоту без учёта полей и скролла?
Использование свойств clientWidth и clientHeight. Они возвращают размер содержимого плюс padding (если box-sizing не меняет расчёт). Границы и скролл не учитываются.
const el = document.querySelector('.content');
console.log(`Client: ${el.clientWidth} x ${el.clientHeight}`);
Js style width (стиль width в javascript)
Когда элемент скрыт через visibility: hidden, значения остаются корректными (но для display: none – нули).
Как получить полные размеры с учётом границ и скроллбара?
Свойства offsetWidth и offsetHeight включают padding, border и вертикальный скроллбар (если он есть). Это аналогично размеру, который занимает элемент в макете.
const box = document.getElementById('panel');
console.log(`Offset: ${box.offsetWidth} x ${box.offsetHeight}`);Js width height (ширина и высота в javascript)
Как измерить размер всего содержимого, включая скрытую часть?
Свойства scrollWidth и scrollHeight возвращают полные размеры содержимого, включая ту часть, которая находится за пределами видимой области (при overflow).
const container = document.getElementById('scrollable');
console.log(`Scroll size: ${container.scrollWidth} x ${container.scrollHeight}`);Js device width (ширина экрана устройства в javascript)
Как установить ширину или высоту элемента через JavaScript?
Можно напрямую присвоить значения свойству style.width / style.height в виде строки с единицей измерения (например, '300px' или '50%'). Для числовых значений удобно использовать .style.width = value + 'px'.
element.style.width = '250px';
element.style.height = '80px';
Если забыть указать единицу измерения (например, element.style.width = 250), значение будет проигнорировано. Всегда используйте строку с 'px', 'em', '%' и т.д.
Как получить вычисленный размер с учётом всех CSS-свойств (включая проценты)?
Функция getComputedStyle возвращает реальное значение свойства после применения всех стилей. Результат – строка с единицей измерения (например, '200px').
const style = window.getComputedStyle(element);
console.log(style.width, style.height);
Значения auto могут вернуть 'auto' как строку. Для преобразования в число используйте parseInt.
Общие проблемы и решения
- Разница из-за box-sizing: при box-sizing: border-box свойство clientWidth включает padding и border, но не соответствует ширине содержимого. Для расчёта чистой ширины содержимого вычитайте padding и border.
- Скрытые элементы: если элемент имеет display: none, большинство методов возвращают 0. Используйте временное изменение стиля.
- Измерение до загрузки шрифтов или изображений: размеры могут быть неверными. Дождитесь события load или используйте ResizeObserver.
- Плавающие размеры при анимации: во время CSS-анимации getComputedStyle может возвращать промежуточные значения.
Расширенные примеры измерения и установки размеров
Пример 1. Измерение размеров элемента после трансформации (scale, rotate)
Метод getBoundingClientRect возвращает фактический размер, отображённый на экране, в то время как offsetWidth показывает размер до трансформации (исходный).
const transformed = document.createElement('div');
transformed.style.width = '200px';
transformed.style.height = '100px';
transformed.style.transform = 'scale(1.5)';
document.body.appendChild(transformed);
console.log('offsetWidth:', transformed.offsetWidth); // 200
console.log('getBoundingClientRect:', transformed.getBoundingClientRect().width); // 300
offsetWidth: 200 getBoundingClientRect: 300
Пример 2. Работа с процентными размерами - получение пиксельного значения
Если ширина задана в процентах, element.style.width вернёт строку '50%'. Для получения актуальных пикселей используем getComputedStyle.
const parent = document.querySelector('.parent');
const child = document.querySelector('.child');
console.log('Style width:', child.style.width); // '50%'
console.log('Computed width:', getComputedStyle(child).width); // '320px'
Пример 3. Установка размеров с учётом box-sizing: border-box
При border-box свойство width включает padding и border. Если нужно установить ширину только содержимого, необходимо вычесть padding и border.
const box = document.getElementById('mybox');
const style = getComputedStyle(box);
const border = parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth);
const padding = parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);
const contentWidth = box.clientWidth - padding - border;
box.style.width = (contentWidth + 50) + 'px'; // увеличиваем содержимое на 50px
Пример 4. Определение размеров скрытого элемента (display: none) с помощью виртуального замера
Создаём временный контейнер, копируем стили, измеряем.
function getHiddenSize(element) {
const clone = element.cloneNode(true);
clone.style.cssText = 'position:absolute;visibility:hidden;display:block;';
document.body.appendChild(clone);
const size = { width: clone.offsetWidth, height: clone.offsetHeight };
document.body.removeChild(clone);
return size;
}
const hiddenEl = document.getElementById('hiddenDiv');
console.log(getHiddenSize(hiddenEl)); // {width: 400, height: 150}
Пример 5. Отслеживание изменения размеров через ResizeObserver
Современный способ реагировать на изменения размеров элемента без привязки к window.resize.
const target = document.querySelector('.resizable');
const observer = new ResizeObserver(entries => {
for (let entry of entries) {
const { width, height } = entry.contentRect;
console.log(`Размер изменился: ${Math.round(width)}px x ${Math.round(height)}px`);
}
});
observer.observe(target);
Пример 6. Получение размеров изображения до его полной загрузки
Использование naturalWidth и naturalHeight даёт оригинальные размеры, даже если CSS сжимает изображение.
const img = new Image();
img.src = 'large-photo.jpg';
img.onload = () => {
console.log('Natural:', img.naturalWidth, img.naturalHeight);
console.log('Style:', img.offsetWidth, img.offsetHeight); // возможно меньше
}
Пример 7. Установка размеров с использованием CSS-переменных (custom properties)
Можно динамически менять значения переменных, что меняет размеры элементов, использующих эти переменные.
document.documentElement.style.setProperty('--box-width', '300px');
document.documentElement.style.setProperty('--box-height', '150px');
// Если в CSS: .box { width: var(--box-width); height: var(--box-height); }
// Размеры обновятся без прямого обращения к свойству style элемента.
Пример 8. Измерение размеров SVG-элементов
Для SVG элементы имеют методы getBBox(), возвращающий bounding box в координатах SVG.
const svgRect = document.querySelector('rect');
const bbox = svgRect.getBBox();
console.log(`SVG Rect: ${bbox.width} x ${bbox.height}`);