Перенесено из сообщества IMWeb, автор: zzbozheng,Оригинальная ссылка
Ранним утром 13 сентября я, наконец, дождался долгожданной конференции по запуску нового продукта Apple.Я полагаю, что многие друзья с нетерпением ждут нового iPhone, чтобы подстричь челку и бороду, но чего они никогда не ожидали, так это того, что три разных размеры iphone x придут. Боже мой, так долго ждал, пока ты мне это покажешь? Фермер кода сильно запаниковал, чтобы найти логические пиксели нового iPhone, а потом задумался о том, как совместимо с челкой и бородой.
прошлая практика
Фактически, для веб-интерфейса челки можно игнорировать в большинстве сценариев, потому что строка состояния сафари или клиента (WeChat, мобильный QQ и т. д.) сгладила для нас верхние челки, нам нужно позаботиться только о нижних Эта черная борода, потому что, если бы внизу страницы была кнопка, она была бы заблокирована бородой, раньше у нас были подбородки, совместимые с iphone x, но, оглядываясь назад, это было неправильно. Вот что мы делали раньше:
первый в<html>
Добавьте соответствующее имя класса в:has-bottombar
<html class="has-bottombar">
<head></head>
<body></body>
</html>
Снова с соответствующим CSS:
@media only screen and (-webkit-device-pixel-ratio: 3) and (device-height: 812px) and (device-width: 375px) {
.has-bottombar {
height: 100%;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding-bottom: 34px;
}
.has-bottombar:after {
content: '';
z-index: 9999;
position: fixed;
left: 0;
bottom: 0;
width: 100%;
height: 34px;
background: #fff;
}
}
Метод обработки здесь заключается в использовании медиазапроса медиазапроса для специальной обработки в соответствии с размером iphone x (375px * 812px), в основном для выполнения двух задач:
1. Зарезервируйте пространство в 34 пикселя в нижней части html, чтобы содержимое страницы оставалось на расстоянии 34 пикселя от нижнего края, что позволяет избежать перекрытия бороды.
2. Создайтеafter
Псевдокласс по настройкеposition: fixed
Поместите его внизу страницы и установите белый цвет.Этот процесс в основном предназначен для блокировки цвета фона страницы.
Эффект следующий:
Это решает проблему бороды внизу, давайте попробуем горизонтальный экран, чтобы увидеть:
Здесь есть явная проблема: текст в левой части страницы перекрывается челкой.
Когда сафари скользит вверх на небольшое расстояние, вы можете видеть, что когда появляется нижняя панель действий сафари, страница по-прежнему сохраняет поле в 34 пикселя снизу.
Если эти обработки сделать до 13 сентября, это не большая проблема, но после 13 сентября у студентов фронтенд-разработки будет большая голова, потому что новые три айфона имеют разные размеры (логические пиксели xr: 375*812; xs: 414*896;xs max: 414*896 ;) Итак, я начал пересматривать медиа-запрос. . . Если в следующем году появится еще несколько размеров, изменения будут бесконечными.
правильная осанка
В iOS 11 мы можем использоватьviewport-fit=cover
+ safe-area-inset-*
.
Так нельзя ли использовать их ниже ios11? да, но видели ли вы iphone x+ с ios 11 или ниже? Так что мы можем продолжать счастливо.
Прежде чем мы начнем, давайте разберемся, что такое безопасная зона.Проще говоря, область, кроме челки и бороды, является безопасной зоной:
О подгонке окна просмотра
viewport-fit имеет 3 значения:
содержат: видимое окно полностью содержит веб-контент (левое изображение)
обложка: содержимое веб-страницы полностью закрывает видимое окно (справа)
auto: значение по умолчанию, совместимое с содержанием
Как вы определяете значения, подходящие для области просмотра? Мы должны рассмотреть ряд вопросов:
1. При установке границы области просмотра на непрямоугольном дисплее область ограничивающей рамки области просмотра больше, чем область отображения, что приводит к области отсечения.
2. Если вы хотите убедиться, что никакая часть веб-страницы не скрыта, и не хотите, чтобы веб-страница была маленькой с точки зрения удобочитаемости, лучше всего установить параметр окна просмотра, чтобы покрывать и отображать страницу в режиме реального времени при рассмотрении режущие части.
3. Еще одно соображение заключается в том, что когда мы устанавливаем viewport-fit:contain, что является значением по умолчанию, установка свойств css, таких как safe-area-inset-*, не работает.Нажмите здесь, чтобы узнать больше о подгонке окна просмотра
О безопасной области-вставка-*
Все виды iphone x имеют неправильную форму, как мы можем контролировать элементы страницы в безопасных областях? Apple предоставляет разработчикам расположение безопасной зоны через свойства css, что можно сделать с помощью функции CSS Constant():
constant(safe-area-inset-top)
: Установите сумму (пиксели CSS) внутри безопасной зоны в верхней части окна View
constant(safe-area-inset-bottom)
: Установите количество (пиксели CSS) внутри безопасной области в нижней части области просмотра.
constant(safe-area-inset-left)
: Установите количество (пиксели CSS) в безопасной области в левой части окна просмотра.
constant(safe-area-inset-right)
: Установите количество (пиксели CSS) в безопасной области в правой части окна просмотра.
Проще говоря, мы можем пройтиconstant( )
Можно получить небезопасную маржу, а потом комбинироватьpadding
илиmargin
для управления элементами страницы, чтобы избежать небезопасных областей. Webkit добавляет функции CSS в iOS11: env() заменяет константу(), env() рекомендуется в документации, а константа() будет объявлена устаревшей в Safari Technology Preview 41 и бета-версии iOS11.2. В браузерах, не поддерживающих env(), это правило стиля автоматически игнорируется и не влияет на нормальное отображение веб-страниц. Для максимальной совместимости мы можем использовать как константу(), так и env().
.yourFooterClass {
padding-bottom: constant(safe-area-inset-bottom); /* iOS 11.0 */
padding-bottom: env(safe-area-inset-bottom); /* iOS 11.2 */
}
В этой статье env() используется только для краткости.
Волна практики
1. Установите макет веб-страницы в видимой области
Добавьте атрибут viweport-fit, чтобы содержимое страницы полностью покрывало все окно:
<meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
2. Храните основной контент в безопасном месте
Предполагая, что высота нашей нижней кнопки составляет 50 пикселей:
body {
padding-top: env(safe-area-inset-top);
padding-right: env(safe-area-inset-right);
padding-bottom: 50px; /* 兼容不支持 env( ) 的设备 */
padding-bottom: calc(env(safe-area-inset-bottom) + 50px); /* 在 iphone x + 中本句才会生效 */
padding-left: env(safe-area-inset-left);
}
Есть два ключевых момента:
1. написано впередиpadding-bottom: 50px
Чтобы обеспечить совместимость с устройствами без нижних бородок, сделайте так, чтобы основное содержимое смещалось по высоте нижней кнопки, чтобы кнопка не закрывала содержимое.
2,padding-bottom: calc(env(safe-area-inset-bottom) + 50px);
рассчитать底部非安全区域距离
а также底部按钮高度
сумма, которую нужно сделатьpadding-bottom
value, если устройство поддерживает env, тогда calc рассчитает допустимое значение, это предложение имеет наивысший приоритет и перезапишет предыдущееpadding-bottom: 50px
. В противном случае calc вычислит недопустимое значение, и это утверждение не сработает. Таким образом можно добиться совместимости даже с устройствами, не поддерживающими env.
Пока что в горизонтальной сцене экрана содержимое слева не будет заблокировано челкой:
В-третьих, обработка нижней кнопки
Сначала дайте нижней кнопке внешний контейнер.btn-container
, есть несколько ключевых моментов при настройке стилей:
1. Настройкиpadding-bottom: env(safe-area-inset-bottom);
Увеличьте значение отступа, чтобы нижняя часть расширялась на небезопасное расстояние.
2. Настройкиbackground: #FFF
пусть весь.btn-container
Фон белый (включая недавно добавленную нижнюю область отступов), так что нижнее содержимое может быть скрыто.
3. Настройкиbox-sizing: content-box;
, потому что при нормальных обстоятельствах css обычно устанавливается на этапе сброса* {box-sizing: border-box;}
Таким образом, установка отступов не может увеличить расстояние наружу, поэтому здесь мы должны изменить его обратно.content-box
.
.btn-container {
box-sizing: content-box;
height: 50px;
line-height: 50px;
color: #fff;
position: fixed;
bottom: 0;
left: 0;
right: 0;
text-align: center;
background: #FFF;
padding-bottom: env(safe-area-inset-bottom);
}
.btn {
width: 100%;
height: 50px;
line-height: 50px;
background-color: #00c340;
border: none;
}
Взгляните на эффект:
В сафари страница немного скользит вверх, и после того, как появится панель управления сафари, нижняя кнопка все еще будет рядом с панелью управления, что очень духовно:
Все выглядит аккуратно, изящно и нежно.
наконец
Если вам нужно повсюду искать логические пиксели для совместимых челок и бород, и повсюду искать новые айфоны, скорее всего, вы не освоили правильную осанку.
Кроме того, я обнаружил, что в горизонтальной экранной сцене есть более интересный эффект, о нем можно узнать, но в реальных делах он не должен быть таким навороченным:
Прокрутка элементов автоматически обводит челку iPhone X с помощью фигур CSS.