Overflow-x: hidden не предотвращает переполнение контента в мобильных браузерах
у меня есть сайт здесь.
просмотренный в настольном браузере, черная строка меню правильно распространяется только на край окна, так как body
и overflow-x:hidden
.
в любом мобильном браузере, будь то Android или iOS, черная строка меню отображает его полную ширину, которая приносит пробелы справа от страницы. Насколько я могу судить, этот пробел даже не является частью html
или body
теги.
даже если я установил viewport в a специфическая ширина в <head>
:
<meta name="viewport" content="width=1100, initial-scale=1">
сайт расширяется до 1100px, но по-прежнему имеет пробелы за пределами 1100.
что я упустил? Как сохранить видовое окно до 1100 и отключить переполнение?
15 ответов
создание обертки сайта div внутри body
и применении overflow-x:hidden
к оболочке вместо body
или html
Исправлена проблема.
похоже, что браузеры, которые анализируют <meta name="viewport">
тег просто игнорировать overflow
атрибуты html
и body
теги.
победителикомментарий к принято отвечать заслуживает быть собственным ответом, потому что это очень элегантное решение, которое действительно работает. И я добавлю немного пользы.
Виктор отмечает, добавив position:fixed
строительство.
body.modal-open {
overflow: hidden;
position: fixed;
}
и это действительно так. Тем не менее, он также имеет небольшой побочный эффект прокрутки вверх. position:absolute
разрешает это, но повторно вводит возможность прокрутки на мобильном телефоне.
если вы знаете тега (мой плагин для добавления окна <body>
) вы можете просто добавить переключатель css для position
.
body.modal-open {
// block scroll for mobile;
// causes underlying page to jump to top;
// prevents scrolling on all screens
overflow: hidden;
position: fixed;
}
body.viewport-lg {
// block scroll for desktop;
// will not jump to top;
// will not prevent scroll on mobile
position: absolute;
}
Я также добавляю это, чтобы предотвратить переход базовой страницы влево/вправо при отображении / скрытии модалов.
body {
// STOP MOVING AROUND!
overflow-x: hidden;
overflow-y: scroll !important;
}
Как состояния @Indigenuity, это, по-видимому, вызвано браузерами, анализирующими <meta name="viewport">
тег.
чтобы решить эту проблему в источнике, попробуйте следующее:
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
.
в моих тестах это предотвращает масштабирование пользователя для просмотра переполненного контента и, как результат, предотвращает панорамирование/прокрутку к нему.
это самое простое решение для решения горизонтальной прокрутки в Safari.
html, body {
position:relative;
overflow-x:hidden;
}
ни одно предыдущее решение не работало для меня, мне пришлось смешивать их и исправлять проблему также на старых устройствах (iphone 3).
во-первых, мне пришлось обернуть содержимое html во внешний div:
<html>
<body>
<div id="wrapper">... old html goes here ...</div>
</body>
</html>
затем мне пришлось применить переполнение, скрытое в оболочке, потому что overflow-x не работал:
#wrapper {
overflow: hidden;
}
и это решило проблему.
сохранить нетронутым просмотра: <meta name="viewport" content="width=device-width, initial-scale=1.0">
предполагая, что вы хотели бы достичь эффекта непрерывной черной полосы с правой стороны:#menubar
не должен превышать 100% отрегулируйте радиус границы таким образом, чтобы правая сторона была квадратной и отрегулировала прокладку так, чтобы она немного расширялась вправо. Измените следующий код #menubar
:
border-radius: 30px 0px 0px 30px;
width: 100%; /*setting to 100% would leave a little space to the right */
padding: 0px 0px 0px 10px; /*fills the little gap*/
настройка padding
к 10px конечно выходит левое меню к краю бар, вы можете поставить оставшиеся 40 пикселей для каждого li
, в 20px С каждой стороны слева и справа:
.menuitem {
display: block;
padding: 0px 20px;
}
при изменении размера браузера меньше, вы найдете еще белый фон: поместите текстуру фона вместо div в body
. Или же измените ширину меню навигации со 100% на меньшее значение с помощью запросов мультимедиа. Есть много корректировок в ваш код, чтобы создать правильный макет, я не уверен то, что вы намерены сделать, но приведенный выше код каким-то образом исправит ваш переполненный бар.
добавление фантик <div>
вокруг всего вашего контента действительно будет работать. Хотя семантически "icky", я добавил div с классом overflowWrap прямо внутри body
тег, а затем установите set my CSS следующим образом:
html, body, .overflowWrap {
overflow-x: hidden;
}
может быть сейчас перебор, но работает как шарм!
Я столкнулся с той же проблемой с устройствами Android, но не iOS устройств. Удалось решить, указав положение: относительное во внешнем div абсолютно расположенных элементов (с переполнением:скрыто для внешнего div)
я решил проблему, используя overflow-x: hidden; следующим образом
@media screen and (max-width: 441px){
#end_screen { (NOte:-the end_screen is the wrapper div for all other div's inside it.)
overflow-x: hidden;
}
}
структура выглядит следующим образом
1st div end_screen >> inside it >> end_screen_2(div) >> inside it >> end_screen_2.
'end_screen is the wrapper of end_screen_1 and end_screen_2 div's
Как сказал subarachnid переполнение-X скрыто для тела и html работал Вот рабочий пример
**HTML**
<div class="contener">
<div class="menu">
das
</div>
<div class="hover">
<div class="img1">
First Strip
</div>
<div class="img2">
Second Strip
</div>
</div>
</div>
<div class="baner">
dsa
</div>
**CSS**
body, html{
overflow-x:hidden;
}
body{
margin:0;
}
.contener{
width:100vw;
}
.baner{
background-image: url("http://p3cdn4static.sharpschool.com/UserFiles/Servers/Server_3500628/Image/abstract-art-mother-earth-1.jpg");
width:100vw;
height:400px;
margin-left:0;
left:0;
}
.contener{
height:100px;
}
.menu{
display:flex;
background-color:teal;
height:100%;
justify-content:flex-end;
align:content:bottom;
}
.img1{
width:150px;
height:25px;
transform:rotate(45deg);
background-color:red;
position:absolute;
top:40px;
right:-50px;
line-height:25px;
padding:0 20px;
cursor:pointer;
color:white;
text-align:center;
transition:all 0.4s;
}
.img2{
width:190px;
text-align:center;
transform:rotate(45deg);
background-color:#333;
position:absolute;
height:25px;
line-height:25px;
top:55px;
right:-50px;
padding:0 20px;
cursor:pointer;
color:white;
transition:all 0.4s;
}
.hover{
overflow:hidden;
}
.hover:hover .img1{
background-color:#333;
transition:all 0.4s;
}
.hover:hover .img2{
background-color:blue;
transition:all 0.4s;
}
создание обертки сайта div внутри тела и применение переполнения - >x: hidden к обертке вместо тела или html Исправлена проблема.
это сработало для меня после добавления position: relative
в обертке.
единственный способ исправить эту проблему для моего модального bootstrap (содержащего форму) - добавить следующий код в мой CSS:
.modal {
-webkit-overflow-scrolling: auto!important;
}
Я просто работал над этим в течение нескольких часов, пробуя различные сочетания вещей из этой и других страниц. В конце концов, мне удалось сделать оболочку сайта div, как было предложено в принятом ответе, но установить оба переполнения в hidden вместо переполнения X. Если я оставляю overflow-y при прокрутке, я получаю страницу, которая прокручивается вертикально только на несколько пикселей, а затем останавливается.
#all-wrapper {
overflow: hidden;
}
всего этого было достаточно, не устанавливая ничего на тело или html элементы.