Что такое viewport?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое viewport
Viewport - это видимая область веб-страницы в браузере. Это площадь экрана, где отображается контент. На разных устройствах viewport имеет разные размеры.
Что входит в viewport
- Экран смартфона: 320px - 480px по ширине
- Планшет: 768px - 1024px
- Ноутбук: 1920px и более
- Исключает: адресная строка, панель инструментов, полосы прокрутки
Viewport meta-тег
Для правильной работы адаптивного дизайна нужно указать viewport в HTML:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
Параметры:
width=device-width- ширина viewport равна ширине устройстваinitial-scale=1.0- начальный масштаб (без зума)maximum-scale=5.0- макс зум (опционально)user-scalable=no- запретить зум (не рекомендуется)
Почему viewport важен
Без viewport тега браузер на мобильном:
<!-- БЕЗ viewport -->
<!DOCTYPE html>
<html>
<head>
<!-- НЕПРАВИЛЬНО! Нет viewport тега -->
</head>
<body>
<div style="width: 1000px">Контент</div>
</body>
</html>
Браузер попытается показать 1000px контент на 320px экране, пользователь получит горизонтальную прокрутку.
С viewport тегом:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<!-- Контент адаптируется к 320px -->
</body>
</html>
Браузер знает, что нужно масштабировать контент под размер экрана.
JavaScript и viewport
Получить размер viewport:
// Размер видимой области
const viewportWidth = window.innerWidth;
const viewportHeight = window.innerHeight;
console.log(`Viewport: ${viewportWidth}x${viewportHeight}`);
//결과: Viewport: 1920x1080
Не путай с document.documentElement:
// window.innerWidth = видимая область (viewport)
const viewportWidth = window.innerWidth; // 1920
// document.documentElement.clientWidth = viewport без scrollbar
const viewportWidthNoScroll = document.documentElement.clientWidth; // 1920
// document.body.clientWidth = ширина body (может быть меньше)
const bodyWidth = document.body.clientWidth; // зависит от контента
Слушать изменение viewport:
window.addEventListener('resize', () => {
console.log(`Новый viewport: ${window.innerWidth}x${window.innerHeight}`);
});
// Или использовать hook в React
import { useEffect, useState } from 'react';
function useWindowSize() {
const [size, setSize] = useState({ width: 0, height: 0 });
useEffect(() => {
function handleResize() {
setSize({
width: window.innerWidth,
height: window.innerHeight
});
}
window.addEventListener('resize', handleResize);
handleResize(); // Вызвать сразу
return () => window.removeEventListener('resize', handleResize);
}, []);
return size;
}
Viewport в CSS
Media queries используют viewport:
/* Мобильные (viewport < 768px) */
@media (max-width: 767px) {
.container {
padding: 10px;
}
}
/* Планшеты (768px - 1024px) */
@media (min-width: 768px) and (max-width: 1023px) {
.container {
padding: 20px;
}
}
/* Десктопы (> 1024px) */
@media (min-width: 1024px) {
.container {
padding: 40px;
}
}
Viewport units - единицы относительно viewport:
/* 100vw = 100% ширины viewport */
.fullscreen {
width: 100vw;
height: 100vh;
}
/* 50vmin = 50% от меньшего размера (width или height) */
.responsive-box {
width: 50vmin;
height: 50vmin;
}
/* 100vmax = 100% от большего размера */
.large-element {
font-size: 5vmax; /* На мобильном 5% от ширины, на ПК 5% от высоты */
}
Практические примеры
1. Адаптивная сетка
/* Меняется в зависимости от viewport */
.grid {
display: grid;
gap: 20px;
}
/* Мобильный - 1 колонка */
@media (max-width: 600px) {
.grid {
grid-template-columns: 1fr;
}
}
/* Планшет - 2 колонки */
@media (min-width: 601px) and (max-width: 1000px) {
.grid {
grid-template-columns: 1fr 1fr;
}
}
/* Десктоп - 3 колонки */
@media (min-width: 1001px) {
.grid {
grid-template-columns: 1fr 1fr 1fr;
}
}
2. Фиксированная шапка с учётом viewport
header {
position: fixed;
top: 0;
left: 0;
width: 100vw; /* На весь viewport */
height: 60px;
background: white;
z-index: 100;
}
body {
padding-top: 60px; /* Место для шапки */
}
3. Модальное окно по центру viewport
.modal {
position: fixed;
top: 50%; /* Центр viewport по вертикали */
left: 50%; /* Центр viewport по горизонтали */
transform: translate(-50%, -50%);
width: 90vw; /* 90% от ширины viewport */
max-width: 500px;
max-height: 90vh; /* 90% от высоты viewport */
overflow-y: auto;
}
Частые ошибки
Ошибка 1: Забыли viewport meta-тег
<!-- НЕПРАВИЛЬНО! Сайт не будет адаптивным -->
<head>
<!-- Нет viewport тега -->
</head>
Ошибка 2: 100vw вместо 100%
/* НЕПРАВИЛЬНО: 100vw > viewport если есть scrollbar */
body {
width: 100vw; /* Создаёт горизонтальный scrollbar */
}
/* ПРАВИЛЬНО: */
body {
width: 100%; /* Адаптируется под viewport */
}
Ошибка 3: Забыли про mobile-first
/* НЕПРАВИЛЬНО: начинаешь с десктопа */
.container {
padding: 40px; /* Десктоп */
}
@media (max-width: 768px) {
.container {
padding: 10px; /* Мобильный */
}
}
/* ПРАВИЛЬНО: mobile-first */
.container {
padding: 10px; /* Мобильный - база */
}
@media (min-width: 769px) {
.container {
padding: 40px; /* Увеличиваем для больших экранов */
}
}
Итог
- Viewport - видимая область браузера на устройстве
- Обязателен
<meta name="viewport" content="width=device-width, initial-scale=1.0">для адаптивных сайтов - Используй
window.innerWidth/innerHeightдля получения размеров - Используй media queries для адаптации к разным viewport'ам
- Mobile-first подход: начинай с мобильного, расширяй для больших экранов