Высота 100vh при отображении адресной строки - Chrome Mobile

Я сталкивался с этой проблемой несколько раз и задавался вопросом, было ли решение этой проблемы. Моя проблема возникает в мобильном приложении Chrome. Там вы можете прокрутить немного вниз, и адресная строка исчезнет. Пока все хорошо, давайте сделаем пример:
Контейнеры height установлен в 100vh,

Как это выглядит с адресной строкой

Как видите, нижняя часть отрезана.

Когда я прокручиваю вниз, это выглядит так:

Теперь это выглядит хорошо. Очевидно, что Chrome вычисляет высоту адресных строк в высоту области просмотра. Итак, мой вопрос:

Есть ли способ, чтобы он выглядел одинаково с адресной строкой или без нее? Так что контейнер расширяется или как?

13 ответов

Согласно этой официальной статье в сети Chrome, правильный способ установить высоту для заполнения видимого окна просмотра:height: 100%, либо на <html> элемент или на position: fixedэлемент. Как описано в документе, это обеспечивает совместимость с мобильным Safari и не зависит от размера строки URL.

В сообществе до сих пор нет четкого соглашения о том, как должны вести себя браузеры при перемещении верхней, нижней и боковых панелей с точки зрения разработчиков.

Упомянутая проблема в вопросе хорошо известна:

&amp;lt;img alt="введите описание изображения здесь" src="https://i.stack.imgur.com/qpW3Y.png"/&amp;gt;

  1. Все началось с выпуска Apple Webkit . Одна из проблем заключалась в том, что разработчики сайта использовали для расчета размер шрифта (calc(100/vh*something)). Если 100vh будет динамическим, когда пользователь прокручивает страницу вниз, а адресная строка скрыта, то размер шрифта, как и любых других связанных элементов, будет искажен, что приведет к очень плохому взаимодействию с пользователем, не говоря уже о нагрузке на CPU/GPU.
    Решением Apple было постоянное соответствие большего размера экрана (без адресной строки) 100vh . Итак, когда отображается адресная строка и вы используете 100vhвысота, при которой нижняя часть будет выходить за пределы экрана. Многие разработчики не согласны с таким решением и считают единицы области просмотра динамическими и в точности равными видимому «порту просмотра».

  2. Команда Google Chrome решила обеспечить совместимость с браузером Apple и придерживаться того же решения.

  3. height: 100%в большинстве современных браузеров равна реальной видимой части, т.е. высота варьируется и зависит от того, видна или скрыта адресная строка во время прокрутки.

  4. Полосы могут появляться не только вверху экрана, но и внизу (современная iOS), а экранная клавиатура может укорачивать вид. Существует хорошая демонстрация для проверки на мобильных устройствах фактического размера &amp;lt;tcode id="118851789"&amp;gt;&amp;lt;/tcode&amp;gt;.&amp;lt;br/&amp;gt; &amp;lt;ahref="https: ho6ssl.jpg"="" i.stack.imgur.com="" rel="nofollow noopener noreferrer"&amp;gt;&amp;lt;img alt="введите описание изображения здесь" src="https://i.stack.imgur.com/HO6SSl.jpg"/&amp;gt;&amp;lt;/ahref="https:&amp;gt;


Решение 1

      html, body { height: 100%; }
.footer-element { 
  position: fixed; 
  bottom: 10px;
}

Решение 2.
Компенсируйте некоторую зависимость от vhс видимой высотой бара, равной "100vh - 100%", когда бар скрыт, разница будет равна 0.

      html, body { height: 100vh; }
.footer-element { 
  position: fixed; 
  bottom: calc(10px + (100vh - 100%));
}

Попробуйте использовать min-height: -webkit-fill-available. Вы также можете добавить его нижеheight: 100vh как запасной вариант.

Теперь есть три новых блока просмотра:

  • sv*- Минимально возможное окно просмотра, размер без адресной строки
  • lv*- Максимально возможное окно просмотра, включая адресную строку.
  • dv*- Динамическое окно просмотра, размер которого зависит от того, видна ли адресная строка

Применение

Поскольку вы хотите, чтобы размер контейнера менялся в зависимости от того, видна ли адресная строка, вам нужна единица измерения:dvh.

      .container {
    height: 100dvh;
}

Надеюсь, это помогло!

дальнейшее чтение

      .my-element {
  height: 100vh; /* Fallback for browsers that do not support Custom Properties */
  height: calc(var(--vh, 1vh) * 100);
}

Теперь давайте получим внутреннюю высоту области просмотра в JavaScript:

      // First we get the viewport height and we multiple it by 1% to get a value for a vh unit
let vh = window.innerHeight * 0.01;
// Then we set the value in the --vh custom property to the root of the document
document.documentElement.style.setProperty('--vh', `${vh}px`);

источник: https://css-tricks.com/the-trick-to-viewport-units-on-mobile/

Вы можете исправить проблему с адресной строкой, установив высоту: 100% для html и тега body, а также для разницы между курсом и отступом тела к нулю, а также вы можете управлять прокруткой в ​​главном div для лучшего контроля

Я столкнулся с аналогичной проблемой и использовал это решение с ReactJS: `import {useLayoutEffect, useState} from 'react';

function useWindowSize() {
  const [size, setSize] = useState([0, 0]);
  useLayoutEffect(() => {
    function updateSize() {
      setSize([window.innerWidth, window.innerHeight]);
    }
    window.addEventListener('resize', updateSize);
    updateSize();
    return () => window.removeEventListener('resize', updateSize);
  }, []);
  return size;
}

`

этот useWindowSizeфункция взята из представления Rerender при изменении размера браузера с помощью React

когда я использовал его в своем коде, он выглядел так:

const MessageList = () => {
      const { messages } = useContext(ChatContext);
      const [, windowHeight] = useWindowSize();
      return (
        <div
          className="messages"
          style={{
            height: windowHeight - 80 - 48, // window - message form - navbar
          }}
        >
          {messages.map((m, i, list) => ( <Message ... /> )}
        </div>
      );
    };

`

Я только что придумал, как изменить размер элемента, чтобы высота не включала в себя smarthpones без домашней кнопки Android с экранной навигационной панелью И верхней панелью браузера. Если содержимое больше экрана, элемент должен вырасти до размера, в который поместится все, поэтому я использую min-height.

<script>
  window.addEventListener("resize", handleResize);
  function handleResize() {
    document.querySelectorAll(".header")[0].style.position = "fixed";
    document.querySelectorAll(".header")[0].style.top = "0";
    document.querySelectorAll(".header")[0].style.bottom = "0";
    document.querySelectorAll(".header")[0].style.minHeight = "auto";
    var h = document.querySelectorAll(".header")[0].clientHeight;
    document.querySelectorAll(".header")[0].style.position = "relative";
    document.querySelectorAll(".header")[0].style.minHeight = h + "px";
  }
  handleResize();
</script>

Попробуйте использовать высоту динамического просмотра (dvh), например 100dvh. Это относительно новое свойство, и некоторые браузеры все еще могут его не поддерживать, но оно решает проблему адресной строки.

https://dev.to/frehner/css-vh-dvh-lvh-svh-and-vw-units-27k4

Я нашел хорошее решение...

.page-header {
  @supports (-webkit-appearance:none) {
    .os-android & {
      min-height: calc(100vh - 56px);
    }
  }
}

Взято отсюда

Просто хотел немного расширить верхний ответ здесь - я обнаружил, что, как упоминал Росс Лайт выше, вы хотите использовать для учетной записи в адресной строке веб-браузера. Однако, чтобы это работало, вы должны установить высоту для тега html и тега body, равную или ваши div не будут расширяться должным образом:

      <!DOCTYPE html>
<html>
  <head>

    <style>

      html, body {
        height: 100%;
      }

      .fillViewport {
        height: 100%;
      }

      .redBackground {
        background-color: red;
      }

    </style>

  </head>
  <body>

    <div class="fillViewport redBackground"></div>

  <body>
</html>

Следующий фрагмент работал для меня. Я вставил рамку в основной тег в качестве примера обертки.

... так что насчет этого?

html,
body {
  width: 100vw;
  height: 100vh;
}
@media (max-width: 480px) {
  html,
  body {
    height: calc(100vh - 56px);
  }
}
Другие вопросы по тегам