Overflow-x: hidden nie zapobiega przepełnieniu zawartości w przeglądarkach mobilnych


142

Mam tutaj stronę internetową .

W przeglądarce na komputerze czarny pasek menu prawidłowo rozciąga się tylko do krawędzi okna, ponieważ plik bodyma overflow-x:hidden.

W dowolnej przeglądarce mobilnej, czy to Android, czy iOS, czarny pasek menu wyświetla pełną szerokość, co powoduje pojawienie się spacji po prawej stronie strony. O ile wiem, ta biała spacja nie jest nawet częścią tagów htmllub body.

Nawet jeśli ustawię rzutnię na określoną szerokość w <head>:

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

Witryna rozwija się do 1100px, ale nadal ma białe spacje poza 1100.

czego mi brakuje? Jak ustawić rzutnię na 1100 i odciąć przepełnienie?


1
Jest to szczególnie problem w iOS9
— Chuck Le Butt

Odpowiedzi:


270

Tworzenie witryny div otoki wewnątrz <body>i stosując overflow-x:hiddensię do owijki zamiast z <body>lub <html>stałej emisji.

Wygląda na to, że przeglądarki analizujące <meta name="viewport">tag po prostu ignorują overflowatrybuty tagów htmli body.

Uwaga: może być również konieczne dodanie position: relativedo opakowującego elementu div.


44
Okazało się, że oprócz ustawienie overflowsię hidden, musiałem ustawić positionsię fixed...
— Victor S

16
Dodanie pozycji do ustalonych zatrzymuje mnie przed przewijaniem!
— teoretyzuj

5
Próbowałem, umieściłem cały kod wewnątrz div i nadałem mu overflow-x: ukryty, ale nie działa, dodaję <meta name = "viewport" content = "width = device-width, initial-scale = 1"> też ale nic się nie zmieniło: / jakieś pomysły?

4
@leepowers overflow-x: hiddennadal nie działa, nawet po dodaniu tego metatagu. Czy mógłbyś udostępnić link do swojej witryny internetowej, na której działa?
— jupiteror

3
Hej gang, kiedy odkryłem, że to też position:relativedziała.
— Thomas Valadez,

80

próbować

html, body {
  overflow-x:hidden 
} 

zamiast po prostu

body {
  overflow-x:hidden 
}

7
Dzięki, ale zastosowanie overflowczegokolwiek do htmli / lub bodyw dowolnej kombinacji nie rozwiązało problemu.
— Indigenuity

Przepraszam, że ci się nie udało. Zanim odpowiedziałem, wykonałem szybki test z wykorzystaniem Twojej witryny i zastosowałem moją sugestię do Twojego css. Naprawiono problem przynajmniej ze standardową i delfinową przeglądarką na moim telefonie z Androidem.
— podpajęczynówkowy

3
Pracował dla mnie. eduardd.eu/projects/ezo ( stopka między 480 a 992 pikseli miała problem z przepełnionym obrazem kobiety i ręcznikami)
— Eduard

2
Czy ktoś wie, dlaczego to działa, skoro osobne określenie body {} i html {} nie działa?
— hamncheez

1
Konieczne jest również dodanie height:100%;, w przeciwnym razie przewijanie w pionie nie działałoby poprawnie na stronach z ładowanymi obrazami (co powoduje wzrost wysokości strony).
— Arno van Oordt

69

Komentarz VictorSa na temat zaakceptowanej odpowiedzi zasługuje na to, by być jego własną odpowiedzią, ponieważ jest to bardzo eleganckie rozwiązanie, które rzeczywiście działa. I dodam odrobinę do jego użyteczności.

Victor zauważa, że ​​dodaje position:fixedprace.

body.modal-open {
    overflow: hidden;
    position: fixed;
}

I rzeczywiście tak jest. Jednak ma również niewielki efekt boczny polegający na przewijaniu do góry. position:absoluterozwiązuje ten problem, ale ponownie wprowadza możliwość przewijania na telefonie komórkowym.

Jeśli znasz swój widok ( moja wtyczka do dodawania widoku do<body> ), możesz po prostu dodać przełącznik css dla 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; 
}

Dodam to również, aby zapobiec przeskakiwaniu podstawowej strony w lewo / w prawo podczas pokazywania / ukrywania modali.

body {
    // STOP MOVING AROUND!
    overflow-x: hidden;
    overflow-y: scroll !important;
}

2
Czy w ogóle jest możliwość, aby część mobilna nie wskakiwała na górę?
— WraithKenny

1
U mnie zadziałało obrócenie elementu, który miał być ukryty przez przepełnienie z pozycji: absolutnej do pozycji: ustalona. Na szczęście.
— Chuck Le Butt

1
@WraithKenny - jeśli chcesz, aby strona zapobiegała przeskakiwaniu na górę na urządzeniu mobilnym, możesz zastosować następujące hack'ish / brzydkie podejście. Wewnątrz swojej funkcji modalnej upewnij się, że otrzymałeś aktualne przesunięcie przewijania, zanim cokolwiek zrobisz, niż zastosuj styl modalny razem, a także ustaw górny margines ciała równy minusowi bieżącego przesunięcia. Upewnij się, że po usunięciu modalu ustaw margines z powrotem na 0 i przewiń stronę z powrotem do oryginalnego przesunięcia.
— Emil Borconi,

2
To rozwiązanie działa tylko w przypadku, gdy zawartość twojego modalu mieści się na ekranie, tj. Nie musisz przewijać samego modalu.
— Tobias

Na mojej stronie są również inne elementy o stałej i bezwzględnej pozycji. Sprawia, że ​​ciało position:fixed or absolutezaburza również ich pozycję. Nie nadaje się / działa w moim przypadku :(
— sohaiby

31

To najprostsze rozwiązanie do rozwiązywania problemów z przewijaniem poziomym w Safari.

html, body {
  position:relative;
  overflow-x:hidden;
}

1
Wydaje się, że działa. Ale czy masz wyjaśnienie, dlaczego to działa?
— LarS,

Nie, to w końcu nie zadziałało. Skończyło się na tym, że wykonałem obliczenia i upewniłem się, że elementy div nie są szersze niż dozwolone, css calc () bardzo mi tutaj pomogło, ponieważ pozwala na połączenie względnych szerokości (vw lub%) i bezwzględnych (px).
— LarS

Oczywiście jest to coś w rodzaju obejścia. Nadal gdzieś coś przepełnia, po prostu jest teraz odcięte. Spróbuj dodać regułę CSS: * {konspekt: ​​1px ciągły czerwony; } Jeśli nadal nie możesz znaleźć przepełnionego elementu, prawdopodobnie jest to spowodowane gdzieś marginesem. Spróbuj dodać * {margin: 0! WAŻNE; } i zobacz, czy przepełnienie zniknie.
— Waltur Buerk

Pracuje dla mnie. Ciekawe, że ukryty element zmienia szerokość ciała. U mnie dotyczy to jednak WSZYSTKICH przeglądarek Safari, nie tylko mobilnych. Musiałem tylko naprawić table-responsivebłąd Bootstrap 4 . To było rozwiązanie.
— CunningFatalist

2
Nie mogę uwierzyć, że to nadal jest problem w 2019 roku. Ale powyższe rozwiązanie całkowicie zadziałało. Dzięki.
— staxim

28

Jak stwierdza @Indigenuity, wydaje się, że jest to spowodowane analizowaniem <meta name="viewport">tagu przez przeglądarki .

Aby rozwiązać ten problem u źródła, wykonaj następujące czynności:

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

W moich testach uniemożliwia to użytkownikowi zmniejszenie powiększenia w celu wyświetlenia przepełnionej treści, a w rezultacie zapobiega również przesuwaniu / przewijaniu do niej.


Dodanie initial-scale=1do istniejącego metatagu rzutni rzeczywiście rozwiązuje problem. Dzięki!
— JamesWilson

6
Dla mnie to minimum-scale=1naprawiło
— jpenna

To właśnie zadziałało dla mnie po wypróbowaniu wszystkiego innego. Wielkie dzięki !
— Harsh Limaye

16
body{
height: 100%;
overflow: hidden !important;
width: 100%;
position: fixed;

działa na iOS9


3
To działa, ale umieszczenie pozycji: przymocowana do ciała powoduje, że przewijasz do góry
— ThaoD5

1
Dziwne, ale zadziałało dla mnie również bez stałej pozycji. Tylko jedno ze wszystkich dostępnych tutaj rozwiązań!
— Garavani,

Tylko jeden, który zadziałał dla mnie, używając chromu i boostrapa + kątowegoJS
— kiwicomb123

6

Pozostaw rzutnię nietkniętą: <meta name="viewport" content="width=device-width, initial-scale=1.0">

Zakładając, że chciałbyś uzyskać efekt ciągłego czarnego paska po prawej stronie: #menubarnie powinien przekraczać 100% , dostosuj promień obramowania tak, aby prawa strona była kwadratowa i wyreguluj wyściółkę tak, aby rozciągała się trochę bardziej w prawo . Zmień następujące elementy na #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*/

Regulacja paddingdo 10px liści oczywiście menu po lewej krawędzi paska, można umieścić pozostałą 40px na każdym li, 20px na każdej stronie lewej i prawej:

.menuitem {
display: block;
padding: 0px 20px;
}

Gdy zmniejszysz rozmiar przeglądarki, zobaczysz nadal białe tło: zamiast tego umieść teksturę tła z elementu div na body. Możesz też zmienić szerokość menu nawigacyjnego ze 100% na niższą wartość za pomocą zapytań o media. Jest wiele zmian, które należy wprowadzić w swoim kodzie, aby stworzyć odpowiedni układ, nie jestem pewien, co zamierzasz zrobić, ale powyższy kod w jakiś sposób naprawi przepełniony pasek.


jeśli używasz box-sizing: border-box;, możesz dodać dopełnienie do elementu div o szerokości 100%.
— Charles John Thompson III

6

Utworzenie opakowującego elementu div witryny wewnątrz treści i zastosowanie przepełnienia-> x: ukryty do opakowania ZAMIAST treści lub html rozwiązało problem.

To zadziałało dla mnie po dodaniu również position: relativedo opakowania.


To zadziałało dla mnie. Efektem ubocznym było to, że zamiast jednego mam dwa paski przewijania. Rozwiązaniem było zrobić to overflow: hiddenzamiast overflow-x: hidden. Działa na mobilnych przeglądarkach Safari, Chrome, IE11 na OSX i Win.
— pop

4

Dodanie otoki <div>wokół całej zawartości rzeczywiście zadziała. Chociaż semantycznie „icky”, dodałem div z klasą overflowWrap bezpośrednio wewnątrz bodytagu, a następnie ustawiłem mój CSS w ten sposób:

html, body, .overflowWrap {
overflow-x: hidden;
}

Teraz może być przesadą, ale działa jak urok!


4

Napotkałem ten sam problem z urządzeniami z Androidem, ale nie z urządzeniami iOS. Zarządzane do rozwiązania przez określenie pozycji: względna w zewnętrznym div elementów pozycjonowanych absolutnie (z przepełnieniem: ukryty dla zewnętrznego elementu div)


4

Żadne poprzednie rozwiązanie nie działało dla mnie, musiałem je miksować i naprawiono problem również na starszych urządzeniach (iPhone 3).

Najpierw musiałem zawinąć zawartość html do zewnętrznego div:

<html>
  <body>
    <div id="wrapper">... old html goes here ...</div>
  </body>
</html>

Potem musiałem zastosować przepełnienie ukryte w opakowaniu, bo overflow-x nie działał:

  #wrapper {
    overflow: hidden;
  }

i to rozwiązało problem.


Czym to się różni od odpowiedzi @ Indigenuity?
— Ian Kemp

3
@ian Kemp overflow: hidden! = overflow-x: hidden
— spaghetticode

3

Rozwiązałem problem za pomocą overflow-x: hidden; następująco

@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;
   }
 }

struktura jest następująca

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


3

Jak powiedział subarachnid, overflow-x ukryty zarówno dla body, jak i html działał. Oto roboczy przykład

**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;
}

Połączyć


1

Pracowałem nad tym od kilku godzin, próbując różnych kombinacji rzeczy z tej i innych stron. Ostatecznie pomogło mi utworzenie opakowującego elementu div witryny, jak zasugerowano w zaakceptowanej odpowiedzi, ale ustawienie obu przepełnień na ukryte, a nie tylko przepełnienie x. Jeśli zostawię overflow-y przy przewijaniu, otrzymam stronę, która przewija się w pionie tylko o kilka pikseli, a następnie zatrzymuje się.

#all-wrapper {
  overflow: hidden;
}

Po prostu to wystarczyło, bez ustawiania czegokolwiek na elementach body ani html.


1

Wypróbowałem wiele sposobów odpowiedzi w tym temacie, głównie działa, ale dostałem efekt uboczny, na przykład użycie overflow-x, body,htmlktóre może spowolnić / zawiesić stronę, gdy użytkownicy przewijają w dół na telefonie komórkowym.

użycie position: fixedna wrapper / div wewnątrz ciała jest również dobre, ale kiedy mam menu i używam animacji JavaScript kliknij animowane przewijanie do jakiejś sekcji, to nie działa.

Więc zdecydowałem się użyć touch-action: pan-y pinch-zoomna wrapper / div wewnątrz ciała. Problem rozwiązany.


0

Jedynym sposobem rozwiązania tego problemu w przypadku mojego modalnego ładowania początkowego (zawierającego formularz) było dodanie następującego kodu do mojego CSS:

.modal {
    -webkit-overflow-scrolling: auto!important;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.