Управляемое чтение
Адаптация мобильного терминала — это то, с чем мы часто сталкиваемся в разработке, и здесь может быть много проблем:
-
1px
вопрос -
UI
Фигура идеально подходит -
iPhoneX
Схема адаптации - Горизонтальная экранная адаптация
- Проблема с размытием изображения на HD-экране
- ...
Возможно, мы уже знаем, как решить вышеуказанные проблемы в разработке, но принцип проблемы и принцип решения могут быть неоднозначными. В процессе решения этих задач мы часто сталкиваемся со многими понятиями: пиксели, разрешение,PPI
,DPI
,DP
,DIP
,DPR
, область просмотра и т. д., можете ли вы действительно разобраться в этих понятиях?
Эта статья начнется с основных концепций адаптации мобильных терминалов и исследует решения и принципы реализации различных проблем адаптации мобильных терминалов.
один дюйм
Физический размер экрана обычно описывается в дюймах, например размер монитора компьютера.17
,22
, дисплей мобильного телефона4.8
,5.7
Все используемые единицы - дюймы.
Следует отметить, что приведенные выше размеры являются длиной диагонали экрана:
дюйм(inch
,сокращенноin
) по-голландски означает большой палец, а дюйм — это ширина большого пальца среднего человека у основания ногтя.
Преобразование дюймов в сантиметры:1英寸 = 2.54 厘米
2. Разрешение
2,1 пикселя
Пиксель — это небольшой квадрат с определенным положением и цветом.
Картинки, электронные экраны (мобильные телефоны, компьютеры) состоят из бесчисленных маленьких квадратов с определенными цветами и определенными позициями.
Пиксели могут использоваться как наименьшая единица изображения или электронного экрана.
Ниже мы используемsketch
Откройте изображение:
Увеличьте эти изображения, чтобы увидеть эти пиксели:
Обычно существует два типа разрешений: разрешение экрана и разрешение изображения.
2.2 Разрешение экрана
Разрешение экрана — это количество пикселей, из которых состоит экран.
Нижеapple
Описание разрешения мобильного телефона на официальном сайте:
iPhone XS Max
а такжеiPhone SE
Резолюции2688 x 1242
а также1136 x 640
. Это представляет собой количество пикселей телефона по вертикали и горизонтали.
Конечно, высокое разрешение не означает, что экран четкий, четкость экрана также связана с размером.
2.3 Разрешение изображения
что мы обычно говорим图片分辨率
На самом деле картина содержит像素数
, например, разрешение изображения800 x 400
. Это означает, что количество пикселей изображения по вертикали и горизонтали равно800
а также400
.
Для изображений одинакового размера чем выше разрешение, тем четче изображение.
2.4 PPI
PPI(Pixel Per Inch)
: количество пикселей на дюйм.
PPI
Может использоваться для описания четкости экрана и качества изображения.
использоватьPPI
При описании картинокPPI
Чем выше, тем выше качество изображения, используйтеPPI
При описании экранаPPI
Чем выше, тем четче экран.
На картинке выше, описывающей разрешение телефона, мы видим:iPhone XS Max
а такжеiPhone SE
изPPI
соответственно458
а также326
, чего достаточно, чтобы доказать, что экран первого более четкий.
Поскольку размер мобильного телефона - это длина диагональ мобильного телефона, мы обычно используем следующий метод для расчетаPPI
:
? \frac{\sqrt{горизонтальные пиксели^2+вертикальные пиксели^2}}{размер}?
iPhone 6
изPPI
для, то он содержит около326
физические пиксели.
2.5 DPI
DPI(Dot Per Inch)
: количество точек на дюйм.
Точка здесь является абстрактной единицей, это может быть пиксель экрана, пиксель изображения или точка чернил принтера.
Обычно вы можете увидеть использованиеDPI
для описания картинок и экранов, на этот разDPI
должен иPPI
эквивалентно,DPI
Чаще всего используется для описания принтера, указывающего количество точек на дюйм, которое принтер может напечатать.
Когда изображение отображается на экране, его пиксели регулярно располагаются, и каждый пиксель имеет определенное положение и цвет.
При использовании принтера для печати принтер может не печатать эти точки регулярно, а использовать точки печати одну за другой для представления изображения, и между этими точками печати будет определенный зазор, которыйDPI
Описание: плотность печатаемых точек.
На изображении выше мы можем ясно видеть, как принтер использует чернильные точки для печати изображения.
Поэтому принтерDPI
Чем он выше, тем четче будет напечатанное изображение, которое также потребует больше точек и времени.
3. Независимые от устройства пиксели
На самом деле все пиксели, которые мы описали выше,物理像素
, фактическая физическая единица на устройстве.
Давайте взглянем设备独立像素
Как именно это произошло:
Смартфоны развиваются очень быстро, и несколько лет назад мы использовали телефоны с очень низким разрешением, такие как белый телефон слева внизу, который имел разрешение320x480
, мы можем просматривать на нем обычный текст, картинки и т.д.
Однако с развитием технологий мобильные телефоны с низким разрешением уже не могут удовлетворить наши потребности. Вскоре появились экраны с более высоким разрешением, такие как черный телефон ниже, который имел разрешение640x940
, ровно в два раза больше, чем у белого телефона.
Теоретически изображения и текст одинакового размера на белом телефоне будут масштабироваться в два раза больше на черном телефоне, потому что его разрешение удваивается. Таким образом, не появятся ли позже мобильные телефоны с более высоким разрешением, а элементы страницы будут становиться все меньше и меньше?
Однако это не так: пропорции интерфейса, отображаемого на смартфонах, которые мы используем сегодня, в основном одинаковы, независимо от того, насколько высокое разрешение. ДжобсiPhone4
впервые представлен наRetina Display
(экран Retina), он решает вышеуказанные проблемы, что также делает его мобильным телефоном разных поколений.
существуетiPhone4
Используя экран Retina, поместите2x2
пикселей, когда1
используются пиксели, что делает экран более изысканным, но размер элементов не меняется.
Если черный телефон использует технологию экрана Retina, результат отображения должен быть следующим, например, ширина списка300
пикселей, то на горизонтальной линии белый телефон будет использовать300
физические пиксели для его рендеринга, а черный телефон на самом деле использовал бы600
физические пиксели для рендеринга.
Мы должны использовать единицу, чтобы одновременно сообщать телефонам с разным разрешением, какого размера они отображают элементы интерфейса, эта единица является независимым от устройства пикселем (Device Independent Pixels
) короткоDIP
илиDP
. Выше мы сказали, что ширина списка равна300
пикселей, фактически мы можем сказать: ширина списка300
независимые от устройства пиксели.
Открытьchrome
инструменты разработчика, мы можем имитировать отображение различных моделей мобильных телефонов, каждая модель будет отображать размер, напримерiPhone X
Отображаемый размер375x812
,действительныйiPhone X
Разрешение будет намного выше, и здесь показаны независимые от устройства пиксели.
3.1 Соотношение пикселей устройства
соотношение пикселей устройстваdevice pixel ratio
короткое имяdpr
, что представляет собой отношение физических пикселей к аппаратно-независимым пикселям.
существуетweb
, браузер предоставляет нам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 x 1920
, в инструментах разработчика мы видим: его независимый от устройства пиксель414 x 736
, соотношение пикселей устройства равно3
, произведение независимых от устройства пикселей и соотношений пикселей устройства не равно1080 x 1920
, но равно1242 x 2208
.
На самом деле, телефон автоматически1242 x 2208
пикселей в1080 * 1920
физические пиксели для рендеринга, нам не нужно заботиться об этом процессе, и1242 x 2208
вызываемый экран设计像素
. Мы также используем это в процессе разработки设计像素
преобладать.
На самом деле понятие соотношения пикселей устройства появилось только после того, как Apple предложила экран Retina, ведь до этого мобильные устройства использовали физические пиксели непосредственно для отображения.
Незамедлительно после,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
Предоставленные нам схемы прототипов обычно основаны наiphone6
заданных пикселей.
Чтобы адаптироваться ко всем моделям, нам нужно преобразовать физические пиксели в независимые от устройства пиксели при написании стилей: например: если высота данного элемента равна200px
(здесьpx
Относится к физическим пикселям, а неCSS
пикселей),iphone6
Соотношение пикселей устройства2
, мы даемheight
Должно быть200px/2=100dp
.
Конечно, лучше всего то, что вы можете хорошо общаться с дизайном, всеUI
Все изображения создаются в аппаратно-независимых пикселях.
Мы также можем использовать код (React Native
) вpx
а такжеdp
преобразование:
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像素
Равен одному независимому от устройства пикселю.
ноCSS像素
легко меняется, когда пользователь увеличивает масштаб браузера,CSS像素
будет увеличиваться, когдаCSS像素
охватит больше физических пикселей.
页面的缩放系数 = CSS像素 / 设备独立像素
.
3.4 Об экране
Еще два слова здесьRetina
скрин, как я видел во многих статьях правильныйRetina
Непонимание экрана.
Retina
Экран — это просто маркетинговый термин, который придумала Apple:
На обычных расстояниях человеческий глаз не может различить отдельные пиксели.
почему стресс普通的使用距离下
Шерстяная ткань? Давайте посмотрим на формулу его расчета:
? a=2arctan(h/2d) ?
a
представляет перспективу человеческого глаза,h
представляет расстояние между пикселями,d
Представляет собой расстояние между невооруженным глазом и экраном. Экран, отвечающий вышеуказанным условиям, может сделать один физический пиксель невидимым для невооруженного глаза.
Он не может просто выразить резолюцию иPPI
, только один способ выразить визуальный эффект.
Наличие нескольких физических пикселей, отображающих один пиксель, простоRetina
Техника, используемая экраном для достижения эффекта. вместо всехDPR > 1
экранRetina
Экран.
Например: дать вам экран большого размера, даже если егоPPI
очень высоко,DPR
Он также очень высокий, и его пиксели хорошо видны с близкого расстояния.Retina
Экран.
мы часто видимK
а такжеP
Этот блок для описания экрана:
P
Он представляет собой количество пикселей в вертикальном направлении экрана.1080P
то есть вертикальный1080
пикселей с разрешением1920X1080
экран принадлежит1080P
Экран.
То, что мы обычно называем экраном высокой четкости, на самом деле означает, что физическое разрешение экрана достигает или превышает1920X1080
экран.
K
От имени экрана по горизонтали есть несколько1024
пикселей, как правило, горизонтальные пиксели превышают2048
принадлежать2K
экрана, горизонтальные пиксели превышают4096
принадлежать4K
Экран.
4. Окно просмотра
Область просмотра(viewport
) представляет видимую в данный момент область компьютерной графики. существуетWeb
В терминологии браузера обычно то же самое, что и окно браузера, но за исключением окна браузера.UI
, строка меню и т. д. — та часть документа, которую вы просматриваете.
Вообще говоря, существует три вида видовых экранов: макетный видовой экран, визуальный видовой экран и идеальный видовой экран, которые играют очень важную роль в экранной адаптации.
4.1 Окно просмотра макета
видовой экран макета (layout viewport
): когда мы указываем размер элемента в процентах, его расчетное значение вычисляется из содержащего блока элемента. Когда элемент является самым верхним элементом, он рассчитывается на основе окна просмотра макета.
Таким образом, окно просмотра макета является базовым окном для макета веб-страницы.PC
В браузере область просмотра макета равна размеру окна текущего браузера (исключаяborders
,margins
,полоса прокрутки).
На мобильных устройствах видовому экрану макета присваивается значение по умолчанию, в основном980px
, что гарантируетPC
Веб-страницу можно отобразить в мобильном браузере, но она очень маленькая, и пользователь может вручную увеличить веб-страницу.
Мы можем позвонитьdocument.documentElement.clientWidth / clientHeight
чтобы получить размер области просмотра макета.
4.2 Визуальное окно просмотра
визуальное окно (visual viewport
): область, которую пользователь фактически видит через экран.
Визуальное окно просмотра по умолчанию соответствует размеру окна текущего браузера (включая ширину полосы прокрутки).
Когда пользователь масштабирует браузер, он не меняет размер окна просмотра макета, поэтому макет страницы остается прежним, но масштабирование изменяет размер визуального окна просмотра.
Например: пользователь увеличивает окно браузера200%
, то в окне браузераCSS像素
будет увеличиваться по мере увеличения визуального окна просмотра, когдаCSS
Пиксели охватывают больше физических пикселей.
Таким образом, окно просмотра макета будет ограничивать вашиCSS
Макет и визуальное окно просмотра точно определяют, что видит пользователь.
Мы можем позвонитьwindow.innerWidth / innerHeight
чтобы получить размер визуального окна просмотра.
4.3 Идеальное окно просмотра
Эффект окна просмотра макета, отображаемого на мобильном терминале, не является идеальным эффектом, поэтому идеальное окно просмотра (ideal viewport
): идеальный размер страниц веб-сайта для отображения на мобильных устройствах.
Как показано на рисунке выше, мы использовали эту картинку при описании аппаратно-независимых пикселей.Когда браузер отлаживает мобильный терминал, данный размер пикселя на странице является идеальным размером области просмотра, а его единицей является аппаратно-независимый пиксель.
Представлено вышеCSS像素时
когда-либо упоминалось页面的缩放系数 = CSS像素 / 设备独立像素
, на самом деле говоря页面的缩放系数 = 理想视口宽度 / 视觉视口宽度
более точным.
Таким образом, когда коэффициент масштабирования страницы100%
час,CSS像素 = 设备独立像素
,理想视口 = 视觉视口
.
Мы можем позвонитьscreen.width / height
чтобы получить идеальный размер области просмотра.
4.4 Meta viewport
<meta>
Элементы представляют те, которые не могут быть представлены другимиHTML
Любая информация метаданных, представленная одним из элементов, связанных с метаданными, которые сообщают браузеру, как анализировать страницу.
мы можем использовать<meta>
элементальviewport
Чтобы помочь нам настроить область просмотра, масштабирование и т. д., чтобы мобильный терминал мог получить лучший эффект отображения.
<meta name="viewport" content="width=device-width; initial-scale=1; maximum-scale=1; minimum-scale=1; user-scalable=no;">
вышеviewport
Конфигурация , давайте посмотрим на их конкретное значение:
Value |
возможное значение | описывать |
---|---|---|
width |
положительное целое число илиdevice-width
|
кpixels (в пикселях), определяет ширину области просмотра макета. |
height |
положительное целое число илиdevice-height
|
кpixels (в пикселях), определяет высоту области просмотра макета. |
initial-scale |
0.0 - 10.0 |
Определяет исходный коэффициент масштабирования страницы. |
minimum-scale |
0.0 - 10.0 |
Определяет минимальное значение для масштабирования; должно быть меньше или равноmaximum-scale ценность . |
maximum-scale |
0.0 - 10.0 |
Определяет максимальное значение для масштабирования; должно быть больше или равноminimum-scale ценность . |
user-scalable |
логическое значение (yes илиno ) |
Если установленоno , пользователь не сможет увеличивать или уменьшать масштаб страницы. По умолчанию да. |
4.5 Адаптация мобильного терминала
Чтобы страница лучше отображалась на мобильной стороне, мы должны сделать область просмотра макета и визуальную область просмотра максимально приближенными к идеальной области просмотра.
device-width
равна ширине идеального окна просмотра, поэтому установитеwidth=device-width
Это эквивалентно созданию окна просмотра макета, равного идеальному экрану просмотра.
из-заinitial-scale = 理想视口宽度 / 视觉视口宽度
, поэтому мы устанавливаемinitial-scale=1;
Это эквивалентно созданию визуального окна просмотра, равного идеальному.
В это время 1CSS
Пиксель равен 1 независимому от устройства пикселю, и мы также делаем разметку на основе идеального окна просмотра, поэтому макет отображаемой страницы может быть примерно одинаковым на разных устройствах.
4.6 Масштабирование
упомянутый вышеwidth
Можно определить ширину окна просмотра макета, на самом деле это не единственный определяющий фактор окна просмотра макета, установитеinitial-scale
Это также может повлиять на окно просмотра макета, поскольку ширина окна просмотра макета принимается заwidth
и максимальная ширина визуального окна просмотра.
Например: если идеальная ширина области просмотра мобильного телефона400px
,настраиватьwidth=device-width
,initial-scale=2
,В настоящее время视觉视口宽度 = 理想视口宽度 / initial-scale
который200px
, окно просмотра макета принимает максимальное значение из двух, а именноdevice-width
400px
.
Если установленоwidth=device-width
,initial-scale=0.5
,В настоящее время视觉视口宽度 = 理想视口宽度 / initial-scale
который800px
, окно просмотра макета принимает максимальное значение из двух, а именно800px
.
4.7 Получить размер браузера
Браузер предоставляет нам размер окнаAPI
Их много, давайте сравним их:
-
window.innerHeight
: получить высоту визуального окна просмотра браузера (включая вертикальные полосы прокрутки). -
window.outerHeight
: получить высоту за пределами окна браузера. Представляет высоту всего окна браузера, включая боковые панели, оконный хром и границы изменения размера окна. -
window.screen.Height
: Получите экран, чтобы получить идеальную высоту области просмотра, это значение фиксировано,设备的分辨率/设备像素比
-
window.screen.availHeight
: Доступная высота окна браузера. -
document.documentElement.clientHeight
: получить высоту области просмотра макета браузера, включая отступы, но исключая вертикальные полосы прокрутки, границы и поля. -
document.documentElement.offsetHeight
: включает отступы, полосы прокрутки, границы и поля. -
document.documentElement.scrollHeight
: минимальная ширина, необходимая для размещения всего в окне просмотра без использования полос прокрутки. измерения иclientHeight
То же самое: он включает заполнение элемента, но не границы, поля или вертикальные полосы прокрутки.
Пять, 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
раз, на этот раз1px
Равен одному реальному пикселю экрана.
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
к макету.
Его основной код очень прост:
// set 1rem = viewWidth / 10
function setRemUnit () {
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
Вот и все.
кiPhone6
Пример: Окно просмотра компоновки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()
}
})
из-заviewport
Устройство совместимо со многими браузерами, и вышеуказанное решение теперь официально устарело:
От схемы перехода lib-flexible можно отказаться, будь то текущая версия или предыдущая, есть определенные проблемы. Рекомендуется начать использовать видовые экраны вместо этого решения.
Давайте посмотрим на самые популярные сейчасvh、vw
строить планы.
6.2 vh, схема vw
vh、vw
Схема о визуальной ширине вьюпорта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()
использование функций и т. д.
7. Адаптируйтесь к iPhoneX
iPhoneX
Появление мобильника подняло внешний вид мобильного телефона на новую высоту, отменив физическую кнопку и заменив ее на маленькую черную полоску внизу, но такое изменение затруднило разработчикам адаптацию к мобильный терминал.
7.1 Безопасная зона
существуетiPhoneX
После релиза многие производители выпустили телефоны с боковыми экранами.
Эти мобильные телефоны и обычные мобильные телефоны внесли не более трех изменений во внешний вид: скругленные углы (corners
), челка (sensor housing
) и маленькие черные полосы (Home Indicator
). Чтобы адаптироваться к этим мобильным телефонам, родилась концепция безопасной зоны: безопасная зона — это видимая область окна, на которую не влияют три вышеуказанных эффекта.
Чтобы обеспечить эффект отображения страницы, мы должны ограничить страницу безопасным диапазоном, но это не влияет на общий эффект.
7.2 viewport-fit
viewport-fit
разработан, чтобы соответствоватьiPhoneX
Родившееся свойство используется для ограничения отображения веб-страниц в безопасной области.
contain
: окно просмотра полностью содержит веб-контент
cover
: веб-контент полностью закрывает видимое окно
По умолчанию или установленоauto
а такжеcontain
Тот же эффект.
7.3 env, постоянная
Нам нужно разумно разместить верх и низ в безопасной зоне,iOS11
добавил дваCSS
функцияenv、constant
, который используется для установки расстояния между безопасной зоной и границей.
Внутри функции может быть четыре константы:
-
safe-area-inset-left
: Расстояние от безопасной зоны до левой границы -
safe-area-inset-right
: Расстояние между безопасной зоной и правой границей -
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.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.1 Причины
Большинство изображений, которые мы обычно используем, являются растровыми изображениями (png、jpg...
), растровое изображение состоит из пикселей, каждый пиксель имеет определенное положение и значение цвета:
Теоретически каждый пиксель растрового изображения отображается на экране с использованием физического пикселя для достижения наилучшего эффекта отображения.
пока вdpr > 1
На экране растрового изображения пиксель растрового изображения может быть представлен несколькими физическими пикселями, однако этим физическим пикселям нельзя точно присвоить цвет соответствующего пикселя растрового изображения, и их можно только аппроксимировать, поэтому одно и то же изображение вdpr > 1
будет размыто на экране:
9.2 Решения
Чтобы обеспечить качество картинки, мы должны сделать так, чтобы один пиксель экрана максимально отображал один пиксель изображения, поэтому для разныхDPR
экран, нам нужно отображать картинки разного разрешения.
например: вdpr=2
дважды отображает изображение на экране(@2x)
,существуетdpr=3
на экране(@3x)
.
9.3 медиа-запрос
использоватьmedia
Запрос и оцените различные соотношения пикселей устройства для отображения изображений с различными принципами:
.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
использоватьimage-set
:
.avatar {
background-image: -webkit-image-set( "conardLi_1x.png" 1x, "conardLi_2x.png" 2x );
}
Только для фоновых изображений
9.5 srcset
использоватьimg
помеченsrcset
свойство, браузер автоматически подберет лучшее отображаемое изображение на основе плотности пикселей:
<img src="conardLi_1x.png"
srcset=" conardLi_2x.png 2x, conardLi_3x.png 3x">
9.6 JavaScript-сращивание URL-адреса изображения
использоватьwindow.devicePixelRatio
Получите соотношение пикселей устройства, просмотрите все изображения и замените адрес изображения:
const dpr = window.devicePixelRatio;
const images = document.querySelectorAll('img');
images.forEach((img)=>{
img.src.replace(".", `@${dpr}x.`);
})
9.7 Использование SVG
SVG
Полное название масштабируемой векторной графики (Scalable Vector Graphics
). В отличие от растровых изображений, основанных на пикселях,SVG
Он относится к описанию формы изображения, поэтому по сути является текстовым файлом небольшого размера и не будет искажаться, сколько бы раз его не увеличивали.
За исключением того, что мы вручную рисуем кодsvg
, мы также можем использовать то же самое, что и растровое изображениеsvg
картина:
<img src="conardLi.svg">
<img src="data:image/svg+xml;base64,[data]">
.avatar {
background: url(conardLi.svg);
}
Ссылаться на
резюме
Я надеюсь, что вы сможете достичь следующих результатов после прочтения этой статьи:
- Уточнение общих концепций адаптации мобильных терминалов
- Понять принцип проблемы адаптации мобильного терминала и освоить хотя бы одно решение
Если в статье есть ошибки, исправьте их в комментариях, если статья вам поможет, ставьте лайк и подписывайтесь.
Если вы хотите читать больше качественных статей, вы можете подписаться на меняблог на гитхабе, твоя звезда✨, лайки и внимание - движущая сила моего постоянного творчества!
Рекомендую обратить внимание на мой паблик WeChat [code secret garden], каждый день выкладывать качественные статьи, будем общаться и расти вместе.
Мы являемся научно-исследовательской командой ByteDance Interactive Entertainment, включая Douyin Short Video, Douyin Volcano, TikTok, Faceu, Qingyan, Jianying и т. д. По состоянию на январь 2020 года Douyin Daily Active (DAU) превысил 400 миллионов человек и продолжает поддерживать быстрый рост. . Вы будете поддерживать разработку продуктов и связанные с ними архитектурные работы, где каждая строка кода может повлиять на сотни миллионов пользователей.
Код набора в школу 2021:DRZUM5Z
Официальный сайт доставки:job.toutiao.com/s/JR8SthH