Миграция с фиксированной вёрстки на адаптивную
Чтобы переделать сайт с фиксированным дизайном в сайт с адаптивным дизайном, достаточно (но не обязательно) изменить только таблицу стилей CSS, не меняя код HTML.
Первый шаг — гибкие шрифты
Размер шрифтов указываем не в абсолютных единицах — пикселях, а в относительных — em.
Например, размер 2em означает, что размер шрифта должен быть в 2 раза больше размера шрифта контекста (шрифта родительского контейнера).
Второй шаг — гибкая сетка
Ширину блочных элементов и ширину внешних полосок (margin) указываем не в абсолютных единицах — пикселях, а в относительных — в % от ширины родительского контейнера. Если высоту блочного элемента задать в %, то она тоже будет рассчитываться относительно ширины родительского контейнера, а не высоты.
Высоту блочных элементов и внешних полосок (margin), размеры внутренних (padding) полосок указываем не в абсолютных единицах — пикселях, а в относительных — в em.
Пример
article {
width: 50%;
margin: 1em 5%;
padding: 1em 2em;
}
Третий шаг — гибкие картинки
Для картинок необходимо задать правило, которое запретит картинкам выходить за пределы родительского контейнера:
img {
max-width: 100%;
}
Это правило сжимает большие картинки до размера маленького контейнера, но не увеличивает маленькие картинки до размера большого контейнера.
Поэтому картинки необходимо изначально создавать с большим разрешением, чтобы на больших экранах они полностью заполняли свой родительский контейнер.
Четвёртый шаг — медиа запросы (Media Queries)
С помощью медиа запросов сайт узнаёт у браузера медиа тип устройства и его характеристики, и подбирает подходящие стили.
Медиа тип | Описание | |||
---|---|---|---|---|
all | все типы устройств | |||
принтеры | ||||
screen | экраны ПК | |||
speech | голосовые браузеры | |||
Нерекомендуемые | ||||
braille | устройства Брайля для слепых | |||
embossed | принтеры Брайля | |||
handheld | мобильные устройства | |||
projection | проекторы | |||
tty | устройства с фиксированным размером символов (телетайпы и терминалы) | |||
tv | телевизоры |
Характеристики | Описание | Значение | Префиксыmin-/max- |
Пример |
---|---|---|---|---|
width | ширина окна браузера | длина | + | 1920px |
height | высота окна браузера | длина | + | 1024px |
device-width | ширина дисплея | длина | + | 10cm |
device-height | высота дисплея | длина | + | 25cm |
orientation | ориентация устройства | portrait или landscape | ||
aspect-ratio | соотношение ширины и высоты окна | отношение | + | 16/9 |
device-aspect-ratio | соотношение ширины и высоты дисплея | отношение | + | 1280/720 |
color | количество битов на цвет | количество цветов | + | |
color-index | количество цветов | целое число | + | 256 |
monochrome | количество бит на пиксель для устройств с монохромными экранами | целое число (0 — для цветных дисплеев) | + | |
resolution | плотность пикселей | разрешение | + | 300dpi, 118dpcm |
scan | тип развёртки для телевизионных устройств | progressive (прогрессивная) или interlace (чересстрочная) | ||
grid | тип устройства: grid или bitmap | 1 — если устройство поддерживает только один шрифт (телетайп) 0 — для всех других устройств |
Синтаксис медиа запросов
@media not|only mediatype and (expressions){
CSS-Code;
}
Пример кода CSS
/*Маленькие экраны c вертикальной ориентаций*/
@media screen and (max-width: 768px) and (orientation: portrait){
#wrapper{width: 100%;}
body{font: normal 80% verdana, sans-serif;}
aside{display: none;}
section{width: 95%;}
nav li, ul {display: block;}
}
/*Маленькие экраны c горизонтальной ориентаций*/
@media screen and (max-width: 768px) and (orientation: landscape){
#wrapper{width: 100%;}
body{font: normal 90% verdana, sans-serif;}
aside{display: none;}
section{width: 95%;}
nav li, ul{display: inline-block;}
}
/*Средние экраны*/
@media screen and (min-width: 769px) and (max-width: 1279px){
#wrapper{width: 80%;}
body{font: normal 90% verdana, sans-serif;}
aside{width: 20%;}
section{width: 75%;}
nav li, ul{display: inline-block;}
}
/*Большие экраны*/
@media screen and (min-width: 1280px){
#wrapper{width: 70%;}
body{font: normal 100% verdana, sans-serif;}
aside{width: 25%;}
section{width: 70%;}
nav li, ul{display: inline-block;}
}