Почему overflow-x: hidden не скрывает полосы прокрутки на мобильном устройстве? - PullRequest
1 голос
/ 06 мая 2020

Было несколько вопросов , подобных этому , по поводу inte rnet для работы с горизонтальными полосами прокрутки. Я читал много из них, и люди объясняют, как это исправить, но я не могу найти ответа на , почему это вообще происходит.

SP c говорит следующее о значении переполнения hidden:

Это значение указывает, что содержимое блока отсекается до его поля заполнения и что UA не должен предоставляют любой пользовательский интерфейс с прокруткой для просмотра содержимого за пределами области отсечения, и не позволяют прокручивать при прямом вмешательстве пользователя, таком как перетаскивание на сенсорном экране или использование колеса прокрутки мыши. Тем не менее, содержимое должно быть прокручено программно, например, с использованием механизмов, определенных в [CSSOM-VIEW], и ​​поэтому поле все еще является контейнером прокрутки.

Я сделал эту очень простую страницу который намеренно имеет переполненное содержимое и overflow-x: hidden на <body>:

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body style="overflow-x: hidden">
    <div style="width: 150%">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec maximus magna odio, vel eleifend nulla
            ullamcorper eget. Nulla vel mi facilisis, facilisis mi non, lacinia libero. Cras eros orci, tristique id
            orci et, finibus convallis libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
            inceptos himenaeos. Quisque vehicula mauris at ex placerat fermentum sed eget erat. Nulla eleifend sodales
            dolor, ac luctus eros malesuada et. Sed ut lobortis eros. Vestibulum eget tortor nibh. Mauris vulputate
            sapien id faucibus molestie. Proin commodo efficitur purus, vitae auctor libero luctus eu. Donec nec ipsum
            libero. Duis tincidunt dapibus ex, vel facilisis sapien interdum id.</p>

        <p>Nunc faucibus, velit at aliquet condimentum, felis urna tristique sapien, sed volutpat nibh turpis nec dolor.
            Sed feugiat at justo eget auctor. Cras pellentesque dapibus orci non egestas. Nulla pulvinar rhoncus nulla
            vel tempus. Sed id ultrices nisi. Cras sit amet augue eget tellus convallis condimentum a non massa. Ut a
            justo in felis interdum tempus vitae vitae orci. Praesent efficitur mi dui, quis porttitor tellus
            pellentesque suscipit. In posuere volutpat scelerisque. Donec semper sapien at elit egestas, sit amet
            fringilla risus ultricies. Maecenas congue posuere velit, eu tristique metus cursus quis. In urna lorem,
            mollis non quam ac, consectetur laoreet ante.</p>

        <p>Pellentesque nec sem pellentesque, interdum dui id, pretium ipsum. Aenean at augue placerat, rutrum mauris
            quis, vehicula nibh. Vestibulum at augue mi. Sed laoreet enim et augue dapibus vestibulum. Curabitur
            pellentesque dignissim ante quis elementum. Phasellus pretium tortor molestie libero tincidunt eleifend vel
            sed mi. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nunc eu finibus dui, non mattis
            sapien. Pellentesque at tortor lacus. Donec enim nulla, lacinia a risus id, congue sollicitudin dolor. Fusce
            non imperdiet magna. Nunc vehicula scelerisque aliquet. Mauris pellentesque quis enim vitae finibus.</p>

        <p>Nulla facilisi. Maecenas vitae ipsum quam. Cras eleifend facilisis dolor vel blandit. Praesent commodo ex
            arcu, id varius felis condimentum et. Nulla lobortis, augue ut ultricies tincidunt, dolor dui tristique
            libero, nec lacinia tellus nunc ut risus. Phasellus et egestas arcu. Vestibulum lobortis vel erat sit amet
            fringilla. Proin fringilla urna libero, eget cursus sem laoreet sed. Nunc vitae mauris et elit mollis
            volutpat eu eget velit. Mauris fringilla viverra ex, nec ornare arcu consequat id. Cras sed erat elit.
            Mauris euismod, sapien eu iaculis finibus, massa risus convallis eros, sit amet lacinia lacus velit
            elementum arcu. Etiam ut lacus convallis, euismod enim eu, bibendum libero.</p>

        <p>Maecenas auctor sapien auctor lobortis auctor. Praesent vel lacus dictum, rutrum dui vitae, vehicula arcu.
            Aenean sapien ante, dignissim ut lacinia quis, interdum faucibus lacus. Mauris facilisis dolor non orci
            interdum, eget suscipit orci cursus. Quisque a eros quam. Etiam tempor nisi vel iaculis luctus. Fusce sit
            amet pellentesque erat. In lorem mi, mattis ut maximus semper, efficitur eget eros. Suspendisse ac nulla
            tincidunt enim tincidunt convallis sit amet ac nisl. In eu magna libero. Aliquam erat volutpat. In egestas
            sit amet mauris a rhoncus. Aliquam aliquet mauris nec venenatis dignissim. Aenean faucibus tortor vitae
            lacus malesuada, id fringilla nunc tincidunt.</p>
    </div>
</body>

</html>

... и на рабочем столе горизонтальная полоса прокрутки правильно скрыта:

horizontal scrollbar on desktop

Однако на мобильном устройстве вы можете прокручивать контент:

scrollbar on mobile

Вы даже получаете полосу прокрутки в DevTools при просмотре страницы в «Мобильном» режиме. :

scrollbar in mobile devtools


Вопрос: почему ? У меня есть мета-тег области просмотра на странице:

<meta name="viewport" content="width=device-width, initial-scale=1.0">

... который является намеком на то, что страница удобна для мобильных устройств. Поэтому если у меня есть overflow-x: hidden, , я имею в виду . Почему браузер не учитывает это?

Я знаю, что могу обойти это, например, заключив всю страницу в элемент <div> и установив вместо него overflow-x: hidden. Но если у меня где-то в содержимом есть элемент position: sticky, он больше не будет работать, потому что он привязан к своему контейнеру прокрутки, который является элементом оболочки, и фактическая прокрутка происходит в теле. Или, если я также установлю overflow-y: auto в оболочке, липкий элемент будет работать, как ожидалось, но теперь все JavaScript сломаются, потому что он использует document.scrollingElement, а фактический элемент прокрутки - это эта оболочка.

Так что обойти это может быть сложно, и я не понимаю, зачем нам эти хаки. Мне кажется, что браузеры не могут правильно реализовать spe c.

1 Ответ

0 голосов
/ 07 мая 2020

<meta name="viewport" content="width=device-width, initial-scale=1.0">

При настройке ViewPort для документа HTML описанным выше способом initial-scale=1.0 устанавливает начальный уровень масштабирования при первой загрузке страницы браузером.

Учитывая, что, когда этот уровень масштабирования применяется к странице, пока этот конкретный div не переполняется, html и body вызваны тем, что вы установили ширину div равной 150%.

Этот масштаб ViewPort по существу меняет опорную точку, а не поведение в отношении этого конкретного c случая.

Вы также устанавливаете свойство width=device-width, которое назначает ширину страницы в соответствии с screen-width из устройство (которое будет различаться в зависимости от устройства), которое действует как еще одна точка отсчета для «элементов масштаба» (макета страницы).

Причина, по которой переполнение не работает должным образом, заключается в том, что оно применяется в div, правильно, так что содержимое ведет себя так, как ожидалось, за исключением случаев, когда теперь измененный размер html / body расширился от эталонного размера до device-width и scale чтобы они затем переполняли ViewPort.

Чтобы преодолеть это, вы можете адаптировать свой тег <meta> к следующему:

<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">

Это устраняет проблему, потому что minimum-scale определяет, насколько далеко вы можете масштабировать, это предотвращает «вмешательство» от initial-scale в отношении ожидаемого результата, учитывая, что масштабируемые «размеры страницы» теперь привязаны к ViewPort, как вы видите его физически, с соответствующим масштабом любого начальное значение было установлено на.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...