← Назад к вопросам
Входит ли в размер viewport вертикальный скролл
1.6 Junior🔥 142 комментариев
#HTML и CSS
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Входит ли вертикальный скролл в размер viewport
Краткий ответ
Нет, вертикальный скролбар НЕ входит в размер viewport, но это зависит от операционной системы и браузера. На макете есть нюансы, которые нужно учитывать при дизайне.
Размер viewport в JavaScript
window.innerWidth — это ширина viewport ВКЛЮЧАЯ вертикальный скролбар. Нет, погодите — это сложнее.
// window.innerWidth НЕ включает вертикальный скролбар
// window.innerWidth — это ширина видимой области (viewport)
console.log(window.innerWidth); // Например: 1920
// window.outerWidth — это ширина окна браузера ВСЕ (с боковыми панелями)
console.log(window.outerWidth); // Например: 1920
// документ может быть шире viewport (если есть горизонтальный скролл)
console.log(document.documentElement.clientWidth); // Ширина БЕЗ скролбара
Практическое объяснение
Вертикальный скролбар занимает место в окне браузера и уменьшает доступную ширину:
// На типичном браузере:
// Окно браузера: 1920px
// Вертикальный скролбар: примерно 15-17px
// Доступная ширина для контента: примерно 1903-1905px
const screenWidth = window.innerWidth; // 1920
const scrollbarWidth = window.innerWidth -
document.documentElement.clientWidth;
console.log('Ширина скролбара:', scrollbarWidth); // примерно 15px
console.log('Ширина контента:', document.documentElement.clientWidth); // 1905px
Разница между метриками
// window.innerWidth / window.innerHeight
// - Размер видимой области браузера
// - ИСКЛЮЧАЕТ все панели браузера, адресную строку
// - ВКЛЮЧАЕТ вертикальный/горизонтальный скролбар
// document.documentElement.clientWidth / clientHeight
// - Размер видимой области внутри скролбара
// - НЕ ВКЛЮЧАЕТ скролбар
// - Это реальная ширина доступная для контента
// document.body.clientWidth
// - То же самое что documentElement.clientWidth
// - Зависит от DOCTYPE
window.addEventListener('resize', () => {
console.log('innerWidth:', window.innerWidth);
console.log('clientWidth:', document.documentElement.clientWidth);
console.log('Разница (скролбар):',
window.innerWidth - document.documentElement.clientWidth
);
});
Скролбар на разных ОС
Windows/Linux:
- Скролбар ширина: примерно 15-17px
- Положение: с правой стороны
- Всегда видимый (когда есть контент для скролла)
/* Стиль скролбара Windows */
body {
scrollbar-width: 15px;
}
macOS:
- Скролбар ширина: переменная (7-15px)
- Появляется только при скролле
- Полупрозрачный
/* На macOS скролбар появляется только при скролле */
body {
overflow-y: scroll; /* Всегда показывать скролбар, даже на macOS */
}
Mobile (iOS, Android):
- Скролбар почти невидимый
- Занимает минимум места
- Не влияет на viewport
Практическое влияние на дизайн
Проблема:
Когда скролбар появляется/исчезает, контент смещается. Это особенно видно на macOS, где скролбар появляется только при наличии скролла.
// Пример проблемы: контент прыгает при появлении скролбара
const initialWidth = window.innerWidth; // 1920px
// Когда есть контент для скролла — скролбар появляется
const widthWithScrollbar = document.documentElement.clientWidth; // 1905px
// Контент смещается на 15px!
// Решение: всегда резервировать место для скролбара
body {
scrollbar-gutter: stable; /* Резервирует место для скролбара */
}
Правильный способ работать с viewport
// ✅ ПРАВИЛЬНО: используй clientWidth
const containerWidth = document.documentElement.clientWidth;
const containerHeight = document.documentElement.clientHeight;
// ❌ НЕПРАВИЛЬНО: используешь innerWidth (включает скролбар)
// const containerWidth = window.innerWidth;
// Для элемента внутри страницы
const element = document.querySelector('.container');
const elementWidth = element.clientWidth; // Без скролбара
const elementHeight = element.clientHeight; // Без скролбара
CSS решение для скролбара
/* Новый способ (Modern Browsers) */
body {
scrollbar-gutter: stable;
}
/* Это резервирует место для скролбара, чтобы контент не прыгал */
/* Старый способ (всегда показывать скролбар) */
body {
overflow-y: scroll;
}
/* Но это может выглядеть странно на macOS */
Полный пример проверки
function analyzeViewport() {
const isScrollbarVisible = window.innerWidth !==
document.documentElement.clientWidth;
const scrollbarWidth = window.innerWidth -
document.documentElement.clientWidth;
const viewportInfo = {
innerWidth: window.innerWidth,
innerHeight: window.innerHeight,
clientWidth: document.documentElement.clientWidth,
clientHeight: document.documentElement.clientHeight,
scrollbarWidth: scrollbarWidth,
isScrollbarVisible: isScrollbarVisible,
devicePixelRatio: window.devicePixelRatio
};
console.log('Viewport Info:', viewportInfo);
if (isScrollbarVisible) {
console.log(`Скролбар занимает ${scrollbarWidth}px`);
} else {
console.log('Видимого скролбара нет');
}
}
analyzeViewport();
window.addEventListener('resize', analyzeViewport);
Измерение реального viewport
// Используй Intersection Observer для точного viewport
const observer = new IntersectionObserver(
(entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
console.log('Элемент видимый в viewport');
console.log('Viewport координаты:', {
top: entry.intersectionRect.top,
left: entry.intersectionRect.left,
width: entry.intersectionRect.width,
height: entry.intersectionRect.height
});
}
});
}
);
observer.observe(document.querySelector('.element'));
На мобильных устройствах
// На мобильных скролбар практически не влияет
const isMobile = window.innerWidth < 768;
if (isMobile) {
// На мобильных скролбар почти невидимый и не влияет на layout
console.log('Скролбар не влияет на мобильном');
} else {
// На десктопе нужно учитывать скролбар
const scrollbarWidth = window.innerWidth -
document.documentElement.clientWidth;
console.log('Учитываем скролбар:', scrollbarWidth);
}
Ответ на вопрос
Входит ли вертикальный скролл в размер viewport?
- window.innerWidth — НЕ входит скролбар в измерение, но скролбар физически занимает место
- document.documentElement.clientWidth — это реальная ширина доступная контенту (БЕЗ скролбара)
- Скролбар ширина примерно 15-17px на Windows/Linux
- На macOS скролбар появляется только при скролле
- Решение: используй
scrollbar-gutter: stableв CSS, чтобы резервировать место
Дизайнеры должны учитывать, что на десктопе контент будет уже примерно на 15-17px из-за скролбара.