Problem polega na tym, że kiedy musisz używać ramek iFrame do wstawiania treści do strony internetowej, to we współczesnym świecie internetowym oczekuje się, że ramka iFrame również będzie responsywna. W teorii to proste, po prostu użyj pomocy <iframe width="100%"></iframe>
lub ustaw szerokość CSS na, iframe { width: 100%; }
jednak w praktyce nie jest to takie proste, ale może być.
Jeśli iframe
zawartość jest w pełni responsywna i może zmieniać swój rozmiar bez wewnętrznych pasków przewijania, iOS Safari zmieni rozmiar iframe
bez żadnych rzeczywistych problemów.
Jeśli weźmiesz pod uwagę następujący kod:
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9,10,11" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Iframe Isolation Test</title>
<style type="text/css" rel="stylesheet">
#Main {
padding: 10px;
}
</style>
</head>
<body>
<h1>Iframe Isolation Test 13.17</h1>
<div id="Main">
<iframe height="950" width="100%" src="Content.html"></iframe>
</div>
</body>
</html>
Z Content.html :
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9,10,11" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Iframe Isolation Test - Content</title>
<style type="text/css" rel="stylesheet">
#Main {
width: 100%;
background: #ccc;
}
</style>
</head>
<body>
<div id="Main">
<div id="ScrolledArea">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc malesuada purus quis commodo convallis. Fusce consectetur mauris eget purus tristique blandit. Nam nec volutpat augue. Aliquam sit amet augue vitae orci fermentum tempor sit amet gravida augue. Pellentesque convallis velit eu malesuada malesuada. Aliquam erat volutpat. Nam sollicitudin nulla nec neque viverra, non suscipit purus tincidunt. Aenean blandit nisi felis, sit amet ornare mi vestibulum ac. Praesent ultrices varius arcu quis fringilla. In vitae dui consequat, rutrum sapien ut, aliquam metus. Proin sit amet porta velit, suscipit dignissim arcu. Cras bibendum tellus eu facilisis sodales. Vestibulum posuere, magna ut iaculis consequat, tortor erat vulputate diam, ut pharetra sapien massa ut magna. Donec massa purus, pharetra sed pellentesque nec, posuere ut velit. Nam venenatis feugiat odio quis tristique.
</div>
</div>
</body>
</html>
Wtedy działa to bez problemów w iOS 7.1 Safari. Możesz bez problemu przełączać się między orientacją poziomą i pionową.
Jednak po prostu zmieniając Content.html CSS, dodając:
#ScrolledArea {
width: 100%;
overflow: scroll;
white-space: nowrap;
background: #ff0000;
}
Otrzymujesz to:
Jak widać, mimo że zawartość Content.html jest w pełni responsywna ( div # ScrolledArea maoverflow: scroll
ustawione) i iframe szerokość wynosi 100% iframe nadal trwa pełną szerokość div # ScrolledArea jakby przelewowy nawet nie istnieje. Próbny
W takich przypadkach, czy iframe
treść ma przewijane obszary, pojawia się pytanie, jak uzyskać iframe
responsywność, kiedy zawartość iframe ma obszary przewijane w poziomie? Problem tutaj nie polega na tym, że Content.html nie jest responsywny, ale na fakcie, że iOS Safari po prostu zmienia rozmiar iframe tak, div#ScrolledArea
aby był w pełni widoczny.
white-space: nowrap
stylową treść ?white-space: nowrap
samo w sobie nie jest problemem. Po prostu używam go, aby uzyskać ekstremalną szerokośćdiv#ScrolledArea
. Problem pojawia się, gdy zawartość iFrame zawiera obszary przewijalne w poziomie. W takim przypadku iOS Safari po prostu ignoruje ustawienia szerokości i pokazuje zawartość dziury oraz przerywa czas reakcji witryny.Odpowiedzi:
Rozwiązanie tego problemu jest w rzeczywistości dość proste i można to zrobić na dwa sposoby. Jeśli masz kontrolę nad Content.html, po prostu zmień
div#ScrolledArea
szerokość CSS na:Zasadniczo pomysł jest tutaj prosty, ustawiasz
width
coś, co jest mniejsze niż widok (w tym przypadku szerokość ramki iframe), a następnie nadpisujesz ją,min-width: 100%
aby umożliwić faktycznewidth: 100%
nadpisanie przeglądarki Safari w iOS.*width: 100%;
Jest tak kod pozostanie IE6 kompatybilne, ale jeśli nie obchodzi dla IE6 można go pominąć. PróbnyJak widać,
div#ScrolledArea
szerokość w rzeczywistości wynosi 100% ioverflow: scroll;
można to zrobić i ukryć przepełnioną zawartość. Jeśli masz dostęp do zawartości iframe, jest to preferowane.Jeśli jednak nie masz dostępu do zawartości elementu iframe (z dowolnego powodu), możesz faktycznie użyć tej samej techniki w samym elemencie iframe. Po prostu użyj tego samego kodu CSS w ramce iframe:
Jest jednak jedno ograniczenie, musisz wyłączyć paski przewijania w elemencie
scrolling="no"
iframe, aby to zadziałało:Jeśli paski przewijania są dozwolone, to nie będzie już działać w elemencie iframe. To powiedziawszy, jeśli zamiast tego zmodyfikujesz Content.html , możesz zachować przewijanie w ramce iframe. Próbny
źródło
!important
dowidth
atrybutu, aby przygotować responsywną ramkę iframe na iPhone 4 z iOS 7width
zostało ustawione wcześniej!important
lub nadpisano CSS o wyższym priorytecie. W pojedynczych przypadkach w iPhone 4 iOS7 nie było to potrzebne.scrolling="yes"
przeciwnym razie nie ma sposobu, aby to naprawić, aby poprawka działała na ramce iFrame, wystarczy miećscrolling="no"
na IFRAMEWydaje się, że problem polega na tym, że Mobile Safari odmówi przestrzegania szerokości ramki iFrame, jeśli dokument, który zawiera, jest szerszy niż określony. Przykład:
http://jsbin.com/hapituto/1
W przeglądarce na komputerze zobaczysz element iFrame i element Div ustawione na 300 pikseli. Zawartość jest szersza, dzięki czemu można przewijać element iFrame.
Jednak w mobilnym safari zauważysz, że element iFrame jest automatycznie rozszerzany do szerokości treści.
Domyślam się, że jest to obejście długotrwałych problemów z przewijaniem treści na stronie. W przeszłości, gdybyś miał duży przewijany element iframe na urządzeniu dotykowym, „utknął” w elemencie iframe, ponieważ przewijał się on zamiast samej strony. Wygląda na to, że Apple zdecydował, że domyślnym zachowaniem elementu iFrame jest „brak przewijania” i rozszerza się, aby temu zapobiec.
Jedną z opcji może być to obejście. Zamiast zakładać, że element iFrame będzie się przewijał, umieść element iframe w sekcji DIV, nad którą masz kontrolę, i pozwól jej przewijać.
przykład: http://jsbin.com/zakedaja/1
Przykładowe znaczniki:
W mobilnym safari możesz teraz przewijać zawartość w pełni rozwiniętego elementu iFrame za pośrednictwem zawierającego go elementu div.
Haczyk: wygląda to naprawdę brzydko w przeglądarce na komputerze, ponieważ teraz masz podwójne paski przewijania. Być może będziesz musiał wykonać pewne wykrywanie przeglądarki za pomocą JS, aby obejść ten problem.
źródło
div#ScrolledArea
(Na zielono) w moim przykładzie. Po prostu źle przeczytałem wcześniej. Ale element iframe nie powinien przewijać się, tylko zmieniając swój rozmiar na podstawie elementu kontenera, czyli miećwidth: 100%;
Potrzebowałem rozwiązania obsługującego wiele przeglądarek. Wymagania były następujące:
Opierając się na tym, czego nauczyłem się od @Idra odnośnie przewijania = „nie” na iOS i na tym poście o dopasowywaniu zawartości iFrame do ekranu w iOS, oto co skończyłem. Mam nadzieję, że to komuś pomoże =)
HTML
CSS
JS
źródło
Problem z tymi wszystkimi rozwiązaniami polega na tym, że wysokość
iframe
nigdy się tak naprawdę nie zmienia.Oznacza to, że nie będziesz w stanie wyśrodkować elementów wewnątrz przy
iframe
użyciu Javascriptposition:fixed;
lubposition:absolute;
ponieważiframe
sam nigdy się nie przewija.Moje rozwiązanie opisane tutaj polega na zawinięciu całej zawartości iframe wewnątrz elementu
div
przy użyciu tego kodu CSS:W ten sposób Safari uważa, że zawartość nie ma wysokości i umożliwia
iframe
prawidłowe przypisanie wysokości . Pozwala to również na dowolne pozycjonowanie elementów.Możesz zobaczyć szybkie i brudne demo tutaj.
źródło
iframe
, ale w moim przypadku tak. Twoje zdrowie!Ten problem występuje również w iOS Chrome.
Przejrzałem wszystkie powyższe rozwiązania, większość z nich jest bardzo hakerska.
Jeśli nie potrzebujesz obsługi starszych przeglądarek, po prostu ustaw szerokość ramki iframe na 100vw;
Uwaga: sprawdź obsługę jednostek widoku https://caniuse.com/#feat=viewport-units
źródło
Pracuję z ionic2, a konfiguracja systemu jest jak poniżej-
U mnie ten problem został rozwiązany za pomocą tego kodu -
dla tagu iframe HTML -
Zobacz css tego samego co-
Własność pozycji odgrywa w moim przypadku kluczową rolę.
pozycja: względna;
To też może ci pomóc !!!
źródło
Tylko rozwiązanie CSS
HTML
CSS
PRÓBNY
Kolejne demo ze stroną HTML w ramce iframe
źródło
Wystąpił problem z szerokością okienka zawartości, tworząc poziomy pasek przewijania dla elementu iframe. Okazało się, że obraz miał szerokość szerszą niż oczekiwano. Udało mi się to rozwiązać, ustawiając wszystkie obrazy css max-width na procent.
źródło
w rzeczywistości dla mnie właśnie działało w iOS wyłączanie przewijania
<iframe src="//www.youraddress.com/" scrolling="no"></iframe>
i traktowanie systemu operacyjnego za pomocą skryptu.
źródło
U mnie rozwiązania CSS nie działały. Ale programowe ustawienie szerokości spełnia swoje zadanie. Podczas ładowania elementu iframe ustaw szerokość programowo:
źródło