Управляемое чтение
Проблема адаптации часто встречается при фронтенд-разработке, и проблем может быть много, например:
-
1px
вопрос -
UI
Фигура идеально подходит -
iPhone
Схема адаптации - Горизонтальная экранная адаптация
- Проблема с размытием изображения на HD-экране
- ...
Некоторые из вышеперечисленных задач, возможно, уже знают, как их решать, но принцип задачи и принцип решения могут быть неясны или непонятны. В процессе изучения этих проблем мы столкнемся со многими понятиями, такими как: пиксель, разрешение, PPI, DPI, DP, DPR, вьюпорт и т. д. Эти понятия часто неясны.
Эта статья стремится решать вышеуказанные проблемы.
1 дюйм
В жизни мы часто говорим, сколько дюймов в мобильных телефонах и мониторах.寸
то есть英寸
, например: Мой мобильный телефон имеет экран 6,5 дюймов, это означает, что длина диагонали экрана мобильного телефона составляет 6,5 дюймов.
дюйм(inch
,сокращенноin
) по-голландски означает большой палец, а дюйм - это ширина большого пальца среднего человека в нижней части ногтя, кэш для дюймов и сантиметров составляет:1英寸 = 2.54厘米
.
2 Разрешение
Обычно мы говорим о двух разрешениях, одно — разрешение экрана, другое — разрешение изображения; давайте посмотрим, прежде чем говорить о разрешении.像素
2,1 пикселя
Пиксель можно понимать как небольшой квадрат с определенным положением и цветом.
Картинки и электронные экраны, которые мы обычно видим (дисплеи мобильных телефонов, компьютеров и телевизоров), состоят из множества блоков пикселей с определенными цветами и позициями; пиксель является их наименьшей единицей.
Вы можете открыть изображение через эскиз, а затем увеличить изображение, вы можете увидеть эти пиксели
2.2 Разрешение экрана
Разрешение экрана – это количество пикселей, из которых состоит экран. Мы часто настраиваем разрешение мониторов наших компьютеров, например,
Это интерфейс для windows для установки разрешения экрана, рекомендуется 1366*768, это число обозначает количество пикселей по горизонтали и вертикали.
Конечно, следует отметить, что分辨率
Высокий уровень не означает, что экран четкий, а четкость экрана остается такой же, как尺寸
Связанный.
2.3 Разрешение изображения
обычно говорят图片分辨率
Относится к количеству пикселей в изображении, например, разрешение изображения800 * 400
, где 800 означает 800 пикселей по горизонтали, а 400 — 400 пикселей по вертикали.
同一尺寸
картинка, экран, чем выше разрешение, тем четче
2.4 PPI
PPI (Pixel Per Inch)
, который представляет количество пикселей на дюйм.
просто сказал,同一尺寸的屏幕、图片,分辨率越高就越清晰
,фактическиPPI
Может также использоваться для описания резкости (качества) экранов и изображений, поскольку同一尺寸
Описывает количество пикселей при предварительном условии .
PPI
Формула расчета:
2.4 DPI
DPI (Dot Per Inch)
, что означает количество точек на дюйм, это абстрактная единица, это может быть точка пикселя при описании экрана или изображения, или точка чернил принтера.
когдаDPI
Когда используется для описания изображений и экранов,DPI
а такжеPPI
эквивалентны, но на самом деле чаще всего он используется для описания принтера, указывающего количество точек, которое принтер может напечатать на дюйм.
Когда принтер печатает лист, если DPI выше, это означает, что плотность печатаемых точек больше, качество напечатанного изображения лучше, и, конечно, это будет потреблять больше чернильных точек и времени печати.
3 независимых от устройства пикселя
На самом деле пиксели, о которых мы упоминали выше, относятся к物理像素
, то есть фактический физический блок на устройстве.
Давайте взглянем设备独立像素 (Device Indpendent Pixels, DIP or DP)
как он производится.
Смартфоны развиваются быстрее, чем мы можем себе представить. В прошлом мы начинали с телефонов с очень низким разрешением, таких как белый телефон ниже, который имел разрешение320 * 480
, мы можем просматривать на нем обычный текст, картинки и т.д.
Однако с развитием технологий вскоре мобильные телефоны с низким разрешением уже не могут удовлетворять наши потребности. Позже и вскоре появились мобильные телефоны с высоким разрешением, такие как черный мобильный телефон ниже, который имеет разрешение640 * 940
, что ровно в два раза превышает разрешение белого телефона.
По идее, картинки и текст одинакового размера и разрешения (одинакового DPI) должны дублироваться на черном телефоне, потому что его разрешение удваивается, так что это не так, более высокое разрешение появится позже Станут ли элементы страницы меньше и меньше?
Однако это не так, независимо от того, насколько высокое разрешение, доля отображаемого контента в основном одинакова. ДжобсiPhone4
впервые представлен на пресс-конференцииRetina Display (视网膜屏幕)
Концепция решает вышеуказанные проблемы, что также делает его мобильным телефоном разных поколений.
существуетiPhone4
Используя экран Retina, поместите2 * 2
пикселей, когда1
используются пиксели, что делает экран более изысканным, но размер элементов не меняется.
Если черный телефон, о котором мы упоминали выше, используется视网膜屏幕
Техника, то результат является следующим, таким как ширина списка300
пикселей, то в горизонтальном направлении белый телефон будет использовать300
физические пиксели для его рендеринга, а черный телефон на самом деле использовал бы600
рендеринг физических пикселей.
В это время возникает вопрос, как развиваются разработчики? Как унифицировать экраны с разным разрешением?
Необходимо использовать единый блок, чтобы сообщать разработчикам и устройствам с разным разрешением размер элементов, отображаемых в интерфейсе.设备独立像素 (Device Independent Pixels)
, именуемыйDIP
илиDP
. Выше мы сказали, что ширина списка равна300
пикселей, на самом деле мы можем сказать, что ширина списка300
независимые от устройства пиксели.
Открытьchrome
Инструмент разработчика, мы можем имитировать удачную ситуацию с отображением каждого мобильного телефона, каждая модель будет отображать размер, напримерiPhone X
Размер дисплея375 * 812
, по фактуiPhone X
Разрешение намного выше этого, и то, что здесь показано, — это независимые от устройства пиксели.
Когда мы обычно разрабатываем, пиксели, которые мы пишем, на самом деле设备独立像素
, чтобы было единое целое между разработчиками и устройствами разного разрешения.
3.1 Соотношение пикселей устройства
соотношение пикселей устройстваDevice Pixel Ratio
короткое имяDPR
,Прямо сейчас物理像素
/ 设备独立像素
ценность .
В браузере можноwindow.devicePixelRatio
получитьDPR
.
В CSS вы можете использовать медиа-запросыmin-device-pixel-ratio
, получитьDPR
.
@media (-webkit-min-device-pixel-ratio: 2), (min-device-pixel-ratio: 2) {}
существуетReact Native
Вы можете пройтиPixelRatio.get()
получитьDPR
.
Конечно, есть исключения из вышеперечисленных правил, например,iPhone 6、7、8 Plus
Фактические физические пиксели1080 * 1920
, в инструментах разработчика мы видим, что его независимый от устройства пиксель414 * 736
, соотношение пикселей устройства (DPR) составляет3
, Независимые от оборудования пиксели и пиксели оборудования не равны1080 * 1920
, но1242 * 2208
.
На самом деле, телефон автоматически1242 * 2208
пикселей в1080 * 1920
физические пиксели для рендеринга, нам не нужно заботиться об этом процессе, и1242 * 2208
Его называют пикселем дизайна экрана, который задается в прототипе пользовательского интерфейса.像素
, конечно, мы также используем это в процессе разработки设计像素
преобладать.
Он появился только после того, как Apple предложила экран Retina.设备像素比(DIP)
Эта концепция, потому что раньше мобильные устройства напрямую отображались с использованием физических пикселей.
Незамедлительно после,Android
Другие методы также используются для достиженияDPR
больше, чем1
экран, но принцип тот же. Потому что Android имеет множество размеров экрана и широкий диапазон разрешений, в отличие от Apple, у которой есть только несколько фиксированных устройств и собственных размеров. Поэтому, чтобы обеспечить эффект отображения различных устройств, Android-устройство делит устройство на несколько интервалов в соответствии с плотностью пикселей устройства:
Конечно, все устройства Android не могут строго следовать вышеуказанным разрешениям, и каждый тип может соответствовать нескольким различным разрешениям, поэтому каждый телефон Android может определять свой собственный DPR в соответствии с заданным диапазоном, чтобы иметь одинаковый дисплей. Конечно, это просто похоже.Из-за различий в размере и разрешении каждого устройства аппаратно-независимые пиксели не будут точно такими же, поэтому отображение на различных устройствах Android все еще не может быть полностью согласованным.
3.2 Разработка мобильного терминала
существуетIOS
,Android
,React Native
При разработке в единицах стиля используются аппаратно-независимые пиксели.
IOS
Единицей размера являетсяpt
,Android
Единицей размера являетсяdp
,React Native
В , не указана явная единица измерения, на самом деле это независимые от устройства пиксели.dp
.
В использованииReact Native
развиватьAPP
час,UI
Предоставленные нам схемы прототипов обычно основаны наiPhone 6
дается в физических пикселях.
Чтобы адаптироваться ко всем моделям, нам нужно преобразовать физические пиксели в независимые от устройства пиксели при написании стилей, например: если высота данного элемента равна200px
(это физические пиксели, а не пиксели CSS),iPhone 6
Соотношение пикселей устройства (DPR) составляет2
, когда мы разрабатываемheight
Должно быть200px / 2 = 100dp
.
Конечно, лучше всего хорошо общаться с дизайном, всеUI
Рисунки создаются в аппаратно-независимых пикселях.
Мы также можем преобразовать px и dp в код (React Native):
import {PixelRatio } from 'react-native';
const dpr = PixelRatio.get();
/**
* px转换为dp
*/
export function pxConvertTodp(px) {
return px / dpr;
}
/**
* dp转换为px
*/
export function dpConvertTopx(dp) {
return PixelRatio.getPixelSizeForLayoutSize(dp);
}
3.3 Разработка веб-терминала
пишуCSS
, единицей, которую мы используем чаще всего, являетсяpx
,Прямо сейчасCSS 像素
, когда коэффициент масштабирования страницы100%
когдаCSS 像素
Равен одному независимому от устройства пикселю. Смысл этого предложения в том, что мы можем непосредственно следоватьUI
Рисунок заданных пикселей для разработки.
ноCSS 像素
легко меняется, когда пользователь увеличивает масштаб браузера,CSS 像素
будет увеличиваться, что являетсяCSS 像素
В доменах будет больше физических пикселей, и вы обнаружите, что текст становится больше и четче.
页面的缩放系数 = CSS 像素 / 设备独立像素
3.4 Об экране
Еще два слова здесьRetina
скрин, как я видел во многих статьях правильныйRetina
Экран неправильно понял.
Экран Retina — это просто маркетинговый термин, который придумала Apple:
На обычных расстояниях человеческий глаз не может различить отдельные пиксели.
почему стресс普通的使用距离下
Шерстяная ткань? Давайте посмотрим на формулу его расчета:
a
репрезентативная точка зрения,h
представляет расстояние между пикселями,d
Представляет собой расстояние между невооруженным глазом и экраном. Экран, отвечающий вышеуказанным условиям, может сделать один физический пиксель невидимым для невооруженного глаза.
Он не может просто выразить резолюцию иPPI (Pixel Per Inch)
, может выражать только один визуальный эффект.
Наличие нескольких физических пикселей, отображающих один пиксель, простоRetian
Прием, используемый экраном для достижения эффекта, не всеDPR > 1
экранRetina
Экран.
Например: дать вам экран большого размера, даже если егоPPI
очень высоко,DPR (Device Pixel Ratio)
Он тоже высокий, но с близкого расстояния четко видны его пиксели, это неRetina
Экран.
мы часто видимK
а такжеP
Эти две единицы используются для описания экрана:
P
Представляет количество пикселей в вертикальном направлении экрана,1080P
то есть вертикальный1080
пикселей, разрешение1920 * 1080
экран принадлежит1080 P
Экран.
То, что мы обычно называем экраном высокой четкости, на самом деле означает, что физическое разрешение экрана достигает или превышает1920 * 1080
экран.
K
От имени экрана по горизонтали есть несколько1024
пиксели, как правило, количество горизонтальных пикселей превышает2048
принадлежать2 K
экрана, горизонтальные пиксели превышают4096
что касается терминологии4 K
Экран.
Вышеприведенный контент взят изЧто нужно знать о мобильной адаптации+ некоторое собственное понимание
4 окна просмотра
Область просмотра(viewport)
Относится к окну браузера, то есть к части браузера, используемой для отображения веб-страницы, за исключением пользовательского интерфейса браузера, строки меню и т. д. — это видимая область веб-страницы пользователя, то есть часть документа, который вы просматриваете. можно понять для размещенияhtml
Контейнер для элементов.
Окно просмотра отличается на мобильном телефоне и ПК. Область просмотра на стороне ПК — это область окна браузера, а на стороне мобильных устройств есть три разных концепции области просмотра:布局视口
,视觉视口
,理想视口
.
viewport
Настройки не повлияют на страницу ПК, но важны для мобильной страницы.
4.1 окно просмотра макета
Базовое окно макета веб-страницы в браузерах ПК эквивалентно размеру окна текущего браузера (за исключением границ, полей и полос прокрутки).Это значение также может динамически изменяться в зависимости от размера окна. На мобильной стороне области просмотра макета присваивается значение по умолчанию, большая часть которого составляет 980 пикселей, что гарантирует, что веб-страница ПК может отображаться в браузере мобильного телефона, но содержимое веб-страницы станет меньше, и пользователь может вручную увеличить веб-страницу, конечно же, при увеличении масштаба. Браузер также имеет полосы прокрутки. в состоянии пройтиdocument.documentElement.clientWidth / clientHeight
Получает размер области просмотра макета веб-страницы в стандартном режиме, и это значение неизменяемо.
4.2 визуальное окно просмотра
Часть экрана, которую пользователь может видеть на мобильном устройстве. в состоянии пройтиwindow.innerWidth / innerHeight
чтобы получить размер визуального окна просмотра. Визуальное окно можно изменить как на стороне ПК, так и на стороне мобильного устройства.При изменении размера окна на стороне ПК изменяется размер визуального окна просмотра; на мобильной стороне, например, когда появляется клавиатура, визуальное область просмотра станет меньше.
4.3 идеальное окно просмотра (идеальное окно)
Идеальный размер страниц веб-сайта для отображения на мобильных устройствах. Ширина страницы такая же, как и ширина устройства, как описано выше.CSS 像素
упомянул页面的缩放系数 = CSS像素 / 设备独立像素
, на самом деле говоря页面的缩放系数 = 理想视口宽度 / 视觉视口宽度
является более точным, поэтому, когда страница увеличена до 100 %,CSS像素 = 设备独立像素
,布局视口 = 视觉视口 = 理想视口
, мы видим на экране нормальную и удобную страницу, доступ к которой возможен черезscreen.width / height
чтобы получить идеальный размер области просмотра.
4.4 Meta Viewport
4.4.1 Введение в атрибут
Атрибуты | имея в виду | стоимость |
---|---|---|
width | Определяет ширину области просмотра в пикселях. | Ширина устройства или положительное целое число |
height | Определяет высоту области просмотра в пикселях. | положительное целое число или высота устройства |
initial-scale | Определите начальное значение масштабирования | Целое или десятичное |
minimum-scale | Определяет минимальный масштаб для уменьшения, он должен быть меньше или равен настройке максимального масштаба. | Целое или десятичное |
maximum-scale | Определяет максимальный масштаб масштабирования, он должен быть больше или равен настройке минимального масштаба. | Целое или десятичное |
user-scalable | Определяет, разрешать ли пользователю вручную масштабировать страницу, значение по умолчанию — «да». | yes/no |
4.4.2 Основное использование и функции
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0, maximum-scale = 1.0, user-scalable = no" />
Базовая установка выше:
-
width = device-width
: значит пусть布局视口
равна ширине устройства -
initial-scale = 1
: Указывает, что начальный коэффициент масштабирования страницы равен 1, что эквивалентно разрешению视觉视口 = 理想视口
, 1 пиксель CSS равен 1 независимому от устройства пикселю. -
maximum-scale = 1.0
: Максимальный коэффициент масштабирования указывает на страницу 1. -
user-scalable = no
: указывает, что пользователю не разрешено масштабировать страницу.
viewport
Роль атрибутов состоит в том, чтобы позволить布局视口
Масштабирование по ширине экрана,widht = device-width
просто позволь布局视口
Начальный размер равен ширине устройства, устанавливается позжеinitial-scale
для масштабирования布局视口
размер, а значение по умолчанию布局视口
Начальный размер равен ширине устройства, т. н.理想窗口
.
Вышеприведенный контент взят изУ меня есть проект дизайна, как мне разработать мобильный терминал?+ некоторое собственное понимание
4.5 Начальное масштабирование
упомянутый вышеmeta
на этикеткеwidth
Можно определить ширину окна просмотра макета, на самом деле это не единственный решающий фактор для окна просмотра макета, установитеinitial-scale
Это также может повлиять на окно просмотра макета, поскольку ширина окна просмотра макета занимаетwidth
а также视觉视口
максимальная ширина.
Например: если идеальная ширина области просмотра мобильного телефона400px
,настраиватьwidth = device-width
,initial-scale = 2
,В настоящее время视觉视口宽度 = 理想视口宽度 / initial-scale
который200px
, окно просмотра макета принимает максимальное значение из двух, а именноdevice-width
400px
, на самом деле, когда начальный масштаб больше 1, вьюпорт макета равен размеру идеального вьюпорта, то есть начальный размер страницы всегда равен размеру идеального вьюпорта.
Если установленоwidth=device-width
,initial-scale=0.5
,В настоящее время视觉视口宽度 = 理想视口宽度 / initial-scale
который800px
, окно просмотра макета принимает максимальное значение из двух, а именно800px
, вы обнаружите, что на странице появляется полоса прокрутки, потому что теперь布局视口 > 理想窗口
Я вот одного не понимаю, почему текст стал еще и крупнее??
личное понимание
Окно просмотра макета становится больше, а пиксель CSS будет отображаться в нескольких физических пикселях, поэтому текст станет больше.
4.6 Получить размер браузера
Браузер предоставляет нам способ получить размер окнаAPI
Много:
-
window.innerHeight
: Получить визуальную высоту окна просмотра браузера (включая вертикальную полосу прокрутки). -
window.outerHeight
: получить высоту за пределами окна браузера, это значение фиксировано,设备的分辨率 / 设备像素比
-
window.screen.availHeight
: доступная высота окна браузера -
document.documentElement.clientHeight
: получить высоту области просмотра макета браузера, включая отступы, но исключая вертикальные полосы прокрутки, границы и поля. -
document.documentElement.offsetHeight
: включает отступы, полосы прокрутки, границы и поля -
document.documentElement.scrollHeight
: минимальная ширина для размещения всего в окне просмотра без использования полос прокрутки. измерения иclientHeight
То же самое, он включает отступ элемента, но не границы, поля или вертикальные полосы прокрутки.
5 1px проблема
Чтобы адаптироваться к различным экранам, мы обычно используем аппаратно-независимые пиксели для компоновки и разработки страниц при написании кода.
в то время как отношение пикселей, независимое от устройства, больше, чем1
экран, мы пишем1px
на самом деле визуализируется несколькими физическими пикселями, это будет выглядеть1px
На некоторых экранах выглядит толстым.
5.1 border-image
на основеmedia
Запрос для определения различных соотношений пикселей устройства с учетом разныхborder-image
:
.border__1px {
border-bottom: 1px solid #000;
}
@media only screen and (-webkit-min-device-pixel-ratio:2) {
.border__1px {
border-bottom: none;
border-width: 0 0 1px 0;
border-image: url(../img/1pxline.png) 0 0 2 0 stretch;
}
}
5.2 background-image
а такжеborder-image
Точно так же подготовьте квалифицированное фоновое изображение границы для имитации фона:
.border__1px {
border-bottom: 1px solid #000;
}
@media only screen and (-webkit-min-device-pixel-ratio: 2) {
.border__1px {
background: url(../img/1pxline.png) repeat-x left bottom;
background-size: 100% 1px;
}
}
Оба вышеперечисленных изображения нужно подготавливать отдельно, а с закругленными углами не очень легко обращаться, но они справятся с большинством сценариев.
5.3 Псевдокласс + преобразование
на основеmedia
Запрос для определения соотношения пикселей разных устройств для масштабирования линии:
.border__1px:before {
content: '';
position: absolute;
top: 0;
height: 1px;
width: 100%
background-color: #000;
transform-origin: 50% 0%;
}
@media only screen and (-webkit-min-device-pixel-ratio:2) {
.border__1px:before {
transform: scaleY(0.5)
}
}
@media only screen and (-webkit-min-device-pixel-ratio:3) {
.border__1px:before {
transform: scaleY(0.33)
}
}
Этот метод может встречать различные сценарии, если вам нужны закругленные углы, вам нужно только добавить псевдоклассы.border-radius
Вот и все.
5.4 svg
выше мы проходимborder-image
а такжеbackground-image
можно смоделировать1px
Границы, но все они используют растровые изображения и должны импортироваться извне.
с помощьюPostCss
изpostcss-write-svg
мы можем напрямую использоватьborder-image
а такжеbackground-image
Создайтеsvg
из1px
Рамка:
@svg border__1px {
height: 2px;
@rect {
fill: var(--color, black);
width: 100%;
height: 50%;
}
}
.example {
border: 1px solid transparent;
border-image: svg(border__1px param(--color #00b1ff)) 2 2 stretch;
}
После компиляции:
.example { border: 1px solid transparent; border-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='2px'%3E%3Crect fill='%2300b1ff' width='100%25' height='50%25'/%3E%3C/svg%3E") 2 2 stretch; }
5.5 Настройка области просмотра
трепать установить масштаб, чтобы позволитьCSS
Пиксели равны настоящим физическим пикселям.
Например: когда соотношение пикселей устройства равно 3, мы масштабируем страницу с коэффициентом 1/3, то есть 1 пиксель равен 1 физическому пикселю.
const scale = 1 / window.devicePixelRatio
const viewport = document.querySelector('meta[name="viewport"]')
if (!viewport) {
viewport = document.createElement('meta')
viewport.setAttribute('name', 'viewport')
window.document.head.appendChild(viewport)
}
viewport.setAttribute('content', 'width=device-width, user-scalable=no, initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale)
На самом деле вышеприведенная схема является более раннейflexible
схема принята.
Конечно, за это приходится платить, а это означает, что все макеты на вашей странице должны быть написаны в физических пикселях, а это означает, что ваша страница может иметь лучший пользовательский интерфейс только на фиксированных устройствах, что, очевидно, невозможно. . В это время мы можем использоватьflexible
илиvw、vh
чтобы помочь нам адаптироваться.
6 адаптивных макетов
Хотя мы можем использовать设备独立像素
Чтобы эффект страницы, отображаемой на каждом устройстве, был одинаковым, но это не гарантирует полной согласованности отображения, нам нужно решение, позволяющее сделать проект дизайна более совершенным.
6.1 рем макет
flexible
Решение представляет собой решение для адаптации мобильного терминала, исходный код которого был открыт Alibaba ранее.flexible
После этого используем единообразно на страницеrem
Приходите к макету
6.1.1 гибкий сценарий 1
Его основной код очень прост:
// set 1rem = viewWidth / 10
function setRemUnit () {
var docEl = document.documentElement
var rem = docEl.clientWidth / 10
docEl.style.fontSize = rem + 'px'
}
setRemUnit()
rem
относительноhtml
узлаfont-size
сделать расчет.
Мы устанавливаемdocument.documentElement.style.fontSize
Он может унифицировать стандарт макета всей страницы.
В приведенном выше кодеhtml
узелfont-size
установить как страницуclientWidth
(Вьюпорт макета)1/10
,Прямо сейчас1rem
эквивалентно области просмотра макета страницы1/10
, что означает, что мы позже используемrem
Все рассчитываются в соответствии с соотношением страниц.
В этот момент нам нужно толькоUI
Выходной график преобразуется вrem
Вот и все.
кiPhone 6
Например, окно просмотра макета375px
,но1rem = 37.5px
,ЭтоUI
Ширина данного элемента75px
(независимые от устройства пиксели), нам просто нужно установить его на75 / 37.5 = 2rem
.
Конечно, вычислять каждый макет очень громоздко, мы можем использоватьPostCSS
изpx2rem
плагины, которые помогут нам завершить этот процесс.
Следующий код может гарантировать, что при изменении размера страницы макет может быть адаптивным, когда стартwindow
изresize
а такжеpageShow
Автоматическая корректировка после событияhtml
изfontSize
размер.
// reset rem unit on page resize
window.addEventListener('resize', setRemUnit)
window.addEventListener('pageShow', function (e) {
if (e.persisted) {
setRemUnit()
}
})
6.1.2 гибкий вариант 2
Приведенная выше схема 1 является более общей схемой, но ее необходимо настроитьPostCSS
изpx2rem
Плагин помогает нам завершить автоматический расчет и преобразование px -> rem, но иногда мы можем столкнуться с ситуациями, когда плагин не нужен, не нужен или не может быть использован.Например, я столкнулся с такой ситуацией сейчас. проект, нужна только одна страница响应式
Поэтому мы не можем настроить такой плагин для всего проекта, для этого можно использовать следующую схему.方便计算
function setRemUnit () {
var docEl = document.documentElement
// 假设我的设计图的独立设备像素为 375 px
var rem = docEl / 3.75
// 1rem = 100px
docEl.style.fontSize = rem + 'px'
}
На самом деле план основан на1rem = 100px
Это соотношение разработано для облегчения расчета, такого как
Мое изображение дизайна составляет 375 пикселей независимых пикселей устройства, и теперь есть div размером 75 пикселей, тогда код размера div при разработкеwidth = 0.75rem
, что очень удобно вычислять
6.1.3 гибкий вариант 3
Вышеуказанная схема была разработана с использованием удобного расчета 1: 100. На самом деле есть более удобный способ, который заключается в разработке по соотношению 1: 1.1rem = 1px
Этот способ тоже упоминался в интернете, но его все опровергали, говоря, что в браузере (хроме) установлен минимальный шрифт12px
Предел, если выhtml
изfont-size = 1px
, минимальный размер шрифта, установленный текущим браузером, составляет 12 пикселей, поэтому браузер автоматически распознает html{font-size: 1px} как html{font-size: 12px}, поэтому эффект равен 1rem = 12px.
Я пошел экспериментировать, и с этой настройкой проблем нет. Вы обнаружите, что установленный вами rem по-прежнему реагирует и размер правильный. Конечно, также возможно, что в предыдущем браузере была эта проблема, но это ушел сейчас.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html {
font-size: 1px;
}
.test {
padding: 1rem;
background: blue;
margin: 1rem;
width: 5rem;
height: 5rem;
}
.text1 {
font-size: 5rem;
}
.text2 {
font-size: 12rem;
}
</style>
</head>
<body>
<!-- div 的尺寸以及文字大小,说明 font-size 的 1px 没有被浏览器识别成 12px -->
<div class = "test"></div>
<div class = "text">我是测试文字1</div>
<div class = "t2">我是测试文字2</div>
</body>
</html>
из-заviewport
Устройство совместимо со многими браузерами, и вышеуказанное решение теперь официально устарело:
От схемы перехода lib-flexible можно отказаться, будь то текущая версия или предыдущая, есть определенные проблемы. Рекомендуется начать использовать видовые экраны вместо этого решения.
Две схемы 6.1.2 и 6.1.3 добавлены мной, если и есть ошибка, то она не имеет отношения к исходному тексту.
6.2 vw, vh схема
vw、vh
Решение состоит в том, чтобы изменить ширину визуального окна просмотра.window.innerWidth
и визуальная высота области просмотраwindow.innerHeight
Делим на 100 равных частей.
надflexible
Схема фактически имитирует эту схему, т.к. ранееvw
Пока не совсем совместим.
-
vw (viewport's width)
:1vw
равно визуальному вьюпорту1%
-
vh (viewport's height):
1vh为视觉视口高度的
1%` -
vmin
:vw
а такжеvh
меньшее значение в -
vmax
: Выбратьvw
а такжеvh
больший из
Если визуальное окно просмотра375px
,Так1vw = 3.75px
, тогдаUI
Ширина данного элемента75px
(независимый от устройства пиксель), нам просто нужно установить его на75 / 3.75 = 20vw
.
Здесь нам не нужно преобразовывать пропорциональные отношения, мы можем использовать ·PostCSS
изpostcss-px-to-viewport
Плагины помогают нам в этом процессе. При написании кода нам нужно толькоUI
Напишите чертежи конструкцииpx
Блок.
Конечно, ни одно решение не идеально.vw
Есть и определенные недостатки:
-
px
Перевести вvw
Не обязательно полностью делится, поэтому есть определенная разница в пикселях. -
при использовании контейнера
vw
,margin
использоватьpx
Легко вызвать общую ширину больше, чем100vw
, что влияет на эффект макета. Конечно, мы также можем избежать этого, например, используяpadding
заменятьmargin
,результатcalc()
использование функции, не практичноpx
единица и т. д.
7 Адаптировать к iPhoneX
Появление iPhoneX вывело внешний вид мобильного телефона на новую высоту, в нем отменили физические кнопки и заменили их небольшой черной полосой внизу, но такие изменения усложнили разработчикам адаптацию к мобильному терминалу. .
7.1 Безопасная зона
После выпуска iPhone X многие производители последовательно выпускали телефоны с боковыми экранами.
Эти мобильные телефоны и обычные мобильные телефоны претерпели три изменения во внешнем виде: закругленные углы (углы), челка (корпус датчика) и маленькие черные полосы (индикатор Home). Чтобы адаптироваться к этим мобильным телефонам, родилась концепция безопасной зоны: безопасная зона — это видимая область окна, на которую не влияют три вышеуказанных эффекта.
Чтобы обеспечить эффект отображения страницы, мы должны ограничить страницу безопасным диапазоном, но это не влияет на общий эффект.
7.2 viewport-fit
viewport-fit
разработан, чтобы соответствоватьiPhoneX
Родившееся свойство используется для ограничения отображения веб-страниц в безопасной области.
-
contain
: окно просмотра полностью содержит веб-контент -
cover
: веб-контент полностью закрывает видимое окно
По умолчанию или установленоauto
а такжеcontain
Тот же эффект.
7.3 env, постоянная
Нам нужно разумно поместить верх и низ в безопасную область iOS11 добавляет две функции CSS env и константу для установки расстояния между безопасной областью и границей.
Внутри функции может быть четыре константы:
- safe-area-inset-left: расстояние от безопасной зоны до левой границы
- Безопасная местность-встроенная справа: пограничная зона безопасное расстояние от права
- safe-area-inset-top: расстояние от верхней границы безопасной области
- safe-area-inset-bottom: расстояние от нижней границы безопасной области
Примечание. Мы должны указать viweport-fit для использования этих двух функций:
<meta name="viewport" content="viewport-fit=cover">
constant
существуетiOS < 11.2
действует в версии ,env
существуетiOS >= 11.2
, что означает, что нам часто приходится устанавливать их одновременно, чтобы ограничить страницу безопасной областью:
body {
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
При использовании нижних фиксированных навигационных панелей нам нужно установить ихpadding
стоимость:
{
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
8 Горизонтальная экранизация
Во многих окнах просмотра мы хотим отображать разные макеты для альбомных и портретных экранов, поэтому нам нужно определить разные стили, заданные в разных сценариях:
8.1 Ландшафт обнаружения JavaScript
window.orientation
: получить направление вращения экрана
window.addEventListener("resize", ()=>{
if (window.orientation === 180 || window.orientation === 0) {
// 正常方向或屏幕旋转180度
console.log('竖屏');
};
if (window.orientation === 90 || window.orientation === -90 ){
// 屏幕顺时钟旋转90度或屏幕逆时针旋转90度
console.log('横屏');
}
});
8.2 Горизонтальный экран обнаружения CSS
@media screen and (orientation: portrait) {
/*竖屏...*/
}
@media screen and (orientation: landscape) {
/*横屏...*/
}
9 Размытые картинки
9.1 Причины
Большинство изображений, которые мы обычно используем, относятся к растровым изображениям (png, jpg...), растровые изображения состоят из пикселей, каждый пиксель имеет определенное положение и значение цвета:
Теоретически каждый пиксель растрового изображения отображается на экране с использованием физического пикселя для достижения наилучшего эффекта отображения.
пока вdpr > 1
На экране растрового изображения пиксель растрового изображения может быть представлен несколькими физическими пикселями, однако этим физическим пикселям нельзя точно присвоить цвет соответствующего пикселя растрового изображения, и их можно только аппроксимировать, поэтому одно и то же изображение вdpr > 1
будет размыто на экране:
9.2 Решения
Для того, чтобы обеспечить качество картинки, мы должны сделать так, чтобы один пиксель экрана максимально отображал один пиксель картинки, поэтому для разных экранов DPR нам нужно отображать картинки разного разрешения.
например: вdpr=2
дважды отображает изображение на экране (@2x
),существуетdpr=3
Тройная диаграмма отображается на экране (@3x
).
9.3 медиа-запрос
Используйте медиа-запрос, чтобы оценить различные соотношения пикселей устройства для отображения изображений с разной точностью:
.avatar{
background-image: url(conardLi_1x.png);
}
@media only screen and (-webkit-min-device-pixel-ratio:2){
.avatar{
background-image: url(conardLi_2x.png);
}
}
@media only screen and (-webkit-min-device-pixel-ratio:3){
.avatar{
background-image: url(conardLi_3x.png);
}
}
Только для фоновых изображений
9.4 image-set
Использовать набор изображений:
.avatar {
background-image: -webkit-image-set( "conardLi_1x.png" 1x, "conardLi_2x.png" 2x );
}
Только для фоновых изображений
9.5 srcset
Используя атрибут srcset тега img, браузер автоматически подберет лучшее отображаемое изображение на основе плотности пикселей:
<img src="conardLi_1x.png"
srcset=" conardLi_2x.png 2x, conardLi_3x.png 3x">
9.6 URL-адрес мозаичного изображения JavaScript
Используйте WPONAL.DEVICEPIXELRATIO, чтобы получить соотношение пикселя устройства, перейти на все изображения и замените адрес изображения:
const dpr = window.devicePixelRatio;
const images = document.querySelectorAll('img');
images.forEach((img)=>{
img.src.replace(".", `@${dpr}x.`);
})
9.7 Использование SVG
SVG означает масштабируемую векторную графику. В отличие от растрового изображения на основе пикселей, SVG относится к описанию формы изображения, поэтому по сути это текстовый файл небольшого размера, который не будет искажаться независимо от того, сколько раз его увеличивают.
Вместо того, чтобы вручную рисовать svg в коде, мы также можем использовать изображение svg, как растровое изображение:
<img src="conardLi.svg">
<img src="data:image/svg+xml;base64,[data]">
.avatar {
background: url(conardLi.svg);
}
резюме
Я надеюсь, что вы сможете достичь следующих результатов после прочтения этой статьи:
-
Уточнение общих концепций адаптации мобильных терминалов
-
Понять принцип проблемы адаптации мобильного терминала и освоить хотя бы одно решение
Вышеприведенный контент взят изЧто нужно знать о мобильной адаптации
Приведенный выше контент взят из двух блогов + часть моего собственного понимания.