предисловие
iPhoneXФизические кнопки были заменены маленькими черными полосами внизу, что привело к неприятной проблеме адаптации экрана на веб-странице. Для веб-страниц браузер уже разобрался с проблемой адаптации вверху (челка), поэтому нам нужно обратить внимание только на проблему адаптации между низом и маленькой черной полосой (то есть обычная навигация по низу, возврат наверх и т. д. элементы, расположенные относительно нижнего фиксированного положения).
Автор собрал набор простых планов адаптации, чтобы поделиться с вами, ознакомившись с некоторыми официальными документами и объединив некоторый опыт обработки в реальных проектах. Надеюсь, это будет вам полезно. Ниже приведены изображения до и после обработки:
Всем известно, что у iPhoneX есть вырез в верхней части экрана. iPhoneX отменяет физическую кнопку и заменяет ее на маленькую черную полосу внизу. Если не адаптировать, эти места будут заблокированы. Поэтому в этой статье описывается вырез. и черный внизу метод адаптации бара.
несколько новых концепций
безопасный район
Безопасная область относится к видимому диапазону окон. Содержимое в безопасной области не зависит от углов, корпуса датчика и индикатора исходного положения, как показано на следующем рисунке:
viewport-fit
Новые функции iOS11, Apple, чтобы адаптироваться к существующему iPhoneX
viewport meta
Расширение метки, используемое для установки макета веб-страницы в визуальном окне, может быть установленотри значения:
ценность | описывать |
---|---|
auto | значение по умолчанию, за которым следуетcontain Стабильная производительность. Содержимое страницы отображается в безопасной области.viewprot-fit:auto Эквивалентноviewport-fit:contain
|
contain | Видимое окно полностью содержит веб-контент (левое изображение). Содержимое страницы отображается вsafe area Внутри.viewport-fit:contain
|
cover | Веб-контент полностью закрывает видимое окно (справа). Содержимое страницы заполняет экран.viewport-fit:cover
|
постоянная функция
Новая функция iOS11, CSS-функция Webkit, используется для установки расстояния между безопасной зоной и границей.Есть четыре предопределенных переменных (единица измерения — px):
-
safe-area-inset-left
: Расстояние от безопасной зоны до левой границы -
safe-area-inset-right
: Расстояние от безопасной зоны до правой границы -
safe-area-inset-top
: Расстояние от безопасной зоны до верхней границы -
safe-area-inset-bottom
: Расстояние от безопасной зоны до нижней границы
Уведомление: поведение веб-страницы по умолчанию без добавления расширений: viewport-fit=contain. Если вам нужно адаптироваться к iPhoneX, вы должны установить viewport-fit=cover, иначеconstant
Функция не работает, что является необходимым условием адаптации.
- В официальной документации упоминается будущее
env()
заменитьconstant ()
, пока недоступно - Эти две функции являются функциями css в webkit, которые могут напрямую использовать переменные функции, которые поддерживаются только в ядре webkit.
-
constant
: Для систем ниже iOS -
env
: Для систем с iOS >= 11.2
Примечание. Производительность веб-страницы без добавления расширений по умолчанию составляет
viewport-fit=contain
, нужно адаптироватьiPhone
должен быть установлен
viewport-fit=cover
, что является ключевым этапом адаптации.
Пример адаптации
Шаг 1: Установите макет веб-страницы в видимом окне
<meta name='viewport' content="width=device-width, viewport-fit=cover" />
Шаг 2: Основное содержимое страницы ограничено безопасной областью
body {
/* 适配齐刘海*/
padding-top: constant(safe-area-inset-top);
/* 适配底部黑条*/
padding-bottom: constant(safe-area-inset-bottom);
}
Шаг 3: Адаптация фиксированных элементов
- Низ не 0
/* bottom 不是0的情况 */
.fixed {
bottom: calc(50px(原来的bottom值) + constant(safe-area-inset-bottom));
}
- Нижнее всасывание (нижнее=0)
/* 方法1 :设置内边距 扩展高度*/
/* 这个方案需要吸底条必须是有背景色的,因为扩展的部分背景是跟随外容器的,否则出现镂空情况。*/
.fix {
padding-bottom: constant(safe-area-inset-bottom);
}
/* 直接扩展高度*/
.fix {
height: calc(60px(原来的高度值) + constant(safe-area-inset-bottom));
}
/* 方法2 :在元素下面用一个空div填充, 但是背景色要一致 */
.blank {
position: fixed;
bottom: 0;
height: 0;
width: 100%;
height: constant(safe-area-inset-bottom);
background-color: #fff;
}
/* 吸底元素样式 */
.fix {
margin-bottom: constant(safe-area-inset-bottom);
}
- Наконец: используйте @supports
Поскольку адаптироваться к стилю нужно только моделям с аккуратной челкой и черными полосами внизу, вы можете использовать @support вместе:
@supports (bottom: constant(safe-area-inset-bottom)) {
body {
padding-bottom: constant(safe-area-inset-bottom);
}
}
Полный код обнаружения
- @supports Изолированный режим совместимости
Поскольку адаптироваться к стилю нужно только моделям с аккуратной челкой и черными полосами внизу, вы можете использовать @support вместе:
@mixin iphonex-css {
padding-top: constant(safe-area-inset-top); //为导航栏+状态栏的高度 88px
padding-top: env(safe-area-inset-top); //为导航栏+状态栏的高度 88px
padding-left: constant(safe-area-inset-left); //如果未竖屏时为0
padding-left: env(safe-area-inset-left); //如果未竖屏时为0
padding-right: constant(safe-area-inset-right); //如果未竖屏时为0
padding-right: env(safe-area-inset-right); //如果未竖屏时为0
padding-bottom: constant(safe-area-inset-bottom); //为底下圆弧的高度 34px
padding-bottom: env(safe-area-inset-bottom); //为底下圆弧的高度 34px
}
@mixin iphonex-support {
@supports (bottom: constant(safe-area-inset-top)) or (bottom: env(safe-area-inset-top)) {
body.iphonex {
@include iphonex-css;
}
}
}
- @media запросы СМИ
@mixin iphonex-css {
padding-top: constant(safe-area-inset-top); //为导航栏+状态栏的高度 88px
padding-top: env(safe-area-inset-top); //为导航栏+状态栏的高度 88px
padding-left: constant(safe-area-inset-left); //如果未竖屏时为0
padding-left: env(safe-area-inset-left); //如果未竖屏时为0
padding-right: constant(safe-area-inset-right); //如果未竖屏时为0
padding-right: env(safe-area-inset-right); //如果未竖屏时为0
padding-bottom: constant(safe-area-inset-bottom); //为底下圆弧的高度 34px
padding-bottom: env(safe-area-inset-bottom); //为底下圆弧的高度 34px
}
/* iphonex 适配 */
@mixin iphonex-media {
@media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) {
body.iphonex {
@include iphonex-css;
}
}
}
Пополнить
Примечания
-
env
иconstant
только вviewport-fit=cover
Консоль Safari, использованная выше, может обнаружить веб-страницу в эмуляторе и открыть веб-инспектор.