İOS Safari'de bir IFrame'in duyarlı olmasını nasıl sağlarım?


134

Sorun şu ki, bir web sitesine içerik eklemek için IFrame'leri kullanmanız gerektiğinde, modern web dünyasında IFrame'in de duyarlı olması bekleniyor. Teoride basit, basitçe <iframe width="100%"></iframe>CSS genişliğini kullanmaya yardımcı olun veya ayarlayın, iframe { width: 100%; }ancak pratikte o kadar basit değil, ancak olabilir.

Eğer iframeiçerik tamamen duyarlı ve iç kaydırma çubukları olmadan kendini yeniden boyutlandırmak, sonra iOS Safari boyutlandırmak olacak iframeherhangi bir gerçek sorunlar olmadan.

Aşağıdaki kodu dikkate alırsanız:

<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>

İle 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>

Daha sonra bu, iOS 7.1 Safari'de sorunsuz çalışır. Manzara ve portre arasında herhangi bir sorun yaşamadan geçiş yapabilirsiniz.

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

Ancak, bunu ekleyerek Content.html CSS'yi değiştirerek :

    #ScrolledArea {
        width: 100%;
        overflow: scroll;
        white-space: nowrap;
        background: #ff0000;
    }

Bunu aldın:

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

Gördüğünüz gibi, Content.html içerik tamamen duyarlı ( ScrolledArea div # sahiptir overflow: scrollseti) ve% 100 iframe hala tam genişliği sürer genişliği iframe div # ScrolledArea taşma bile yok sanki. gösteri

Bu gibi durumlarda, iframeiçeriğin üzerinde kaydırma alanları varsa, soru şu olur:iframe , iframe içeriğinde yatay kaydırma alanları varken duyarlı ? Buradaki sorun, Content.html'nin yanıt vermemesi değil, iOS Safari'nin iframe'i div#ScrolledAreatamamen görünür olacak şekilde yeniden boyutlandırmasıdır .


Bizimle bir bağlantı paylaşabilir misin? İçerisindeki sayfada white-space: nowrapstil içeriği varsa, iOS'un bir iFrame'i içindeki sayfanın tam genişliğine genişleteceğini mi söylüyorsunuz ?
DA.

@DA Hem soruna hem de çözüme demolar ekledim. Ve hayır, white-space: nowrapsorun kendi içinde değil. Sadece aşırı bir genişlik elde etmek için kullanıyorum div#ScrolledArea. Sorun, IFrame içeriğinde yatay olarak kaydırılabilir alanlar olduğunda ortaya çıkar. Bu durumda, iOS Safari genişlik ayarlarınızı yok sayar ve delik içeriğini ve sitenin yanıt verme hızını bozar.
Idra

Hmm ... Acaba bu bir 'özellik' mi? Kaydırılabilir içerik içeren kaydırılabilir bir alana (iFrame) sahip olmak garip olurdu. Dokunmatik ekranda etkileşim kurmak çok zor bir şey olurdu.
DA.

@DA Elbette bu bir yeğen vakası ve söyledikleriniz doğru olabilir (uygulamaya bağlıdır, bizim için işe yarar) ve çoğu sitede yatay kaydırılabilir alanlar yoktur, ancak bunu yaptığınızda ... hayal bile edemezsiniz bunun için ne kadar zaman harcadım. Ancak bu, gizli ve düğmelerle veya buna benzer bir şeyle kaydırılmış resimleriniz olsa bile sorun olabilir.
Idra

Bununla ilgili sorular var gibi görünüyor: stackoverflow.com/questions/5267996/… Mobil safarinin bir 'özelliği' gibi görünüyor ... İçeriğin kullanıcının yapabileceği şekilde boyutlandırılmasını sağlamaya çalışıyor hala onunla etkileşime giriyor. Kaydırılan bir iframe'de kayan içeriğiniz varsa ne olur emin değilim ... Safari, iç içe kaydırma öğeleri içindeki bir kaydırmayı nasıl yorumlar?
DA.

Yanıtlar:


289

Bu problemin çözümü aslında oldukça basittir ve bunu çözmenin iki yolu vardır. Content.html üzerinde kontrolünüz varsa , div#ScrolledAreaCSS genişliğini şu şekilde değiştirmeniz yeterlidir :

        width: 1px;
        min-width: 100%;
        *width: 100%;

Temel olarak buradaki fikir basittir, widthgörüntü alanından daha küçük bir şeye ayarlarsınız (bu durumda iframe genişliği) ve ardından varsayılan olarak hangi iOS Safari'nin üzerine yazacağına min-width: 100%izin vermek için width: 100%bunun üzerine yazarsınız. *width: 100%;Kod IE6 uyumlu olarak kalacak, ancak IE6 için önemli değilse bunu atlayabilirsiniz böylece yoktur. gösteri

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

Şimdi görebileceğiniz gibi, div#ScrolledAreagenişlik gerçekte% 100 veoverflow: scroll; bunu yapabilir ve taşan içeriği gizleyebilir. İframe içeriğine erişiminiz varsa, bu tercih edilir.

Ancak, iframe içeriğine erişiminiz yoksa (her ne sebeple olursa olsun), aynı tekniği iframe'in kendisinde de kullanabilirsiniz. İframe'de aynı CSS'yi kullanmanız yeterlidir:

    iframe {
        width: 1px;
        min-width: 100%;
        *width: 100%;
    }

Bununla birlikte, bununla ilgili bir sınırlama vardır, bunun çalışması için kaydırma çubuklarını scrolling="no"iframe üzerinde kapatmanız gerekir :

<iframe height="950" width="100%" scrolling="no" src="Content.html"></iframe>

Kaydırma çubuklarına izin verilirse, bu artık iframe üzerinde çalışmayacaktır. Bununla birlikte, bunun yerine Content.html'yi değiştirirseniz , iframe'deki kaydırmayı koruyabilirsiniz. gösteri


1
@NickGottlieb'in bahsettiği gibi, iOS 7 !importantwidth
yüklü

@ ЮнгвиртТони Geçici çözümün çalışması için gerekli olmamalıdır, widthdaha önce ayarlanmış !importantveya daha yüksek öncelikli bir CSS'nin üzerine yazmış olabilir. İPhone 4 iOS7'deki izole durumlarda buna gerek yoktu.
Idra

Benim de ihtiyacım yoktu! İOS 8'de de harika çalışıyor. Şerefe
Sam Potts

Kaydırmaya ihtiyacım var = sadece gerektiğinde hayır, aksi takdirde kaydırma = evet. Öyleyse neyi tespit etmeliyim? Bu bir iOS sorunu mu? veya bir webkit sorunu? veya...?
gerbz

@ggwarpig Bu, iOS Safari'nin kesintisiz özelliği otomatik olarak etkinleştirdiği ve üzerine yazamayacağınız bir iOS sorunudur. İçerik üzerinde kontrole sahipseniz, scrolling="yes"aksi takdirde bunu düzeltmenin bir yolu olmayacak şekilde içeriği değiştirmeniz gerekir , düzeltmenin IFRAME üzerinde çalışması için yalnızca scrolling="no"IFRAME
Idra

24

Görünen o ki sorun, içerdiği belge belirttiğinizden daha genişse Mobile Safari iFrame'inizin genişliğine uymayı reddedecek gibi görünüyor. Misal:

http://jsbin.com/hapituto/1

Bir masaüstü tarayıcıda, her ikisi de 300px'e ayarlanmış bir iFrame ve bir Div göreceksiniz. İçindekiler daha geniştir, böylece iFrame'i kaydırabilirsiniz.

Bununla birlikte, mobil safaride, iFrame'in içeriğin genişliğine otomatik olarak genişletildiğini fark edeceksiniz.

Tahminimce bu, bir sayfada içerik kaydırmayla ilgili uzun süredir devam eden sorunlar için bir geçici çözüm olduğu yönünde. Geçmişte, dokunmatik bir cihazda büyük bir kaydırmalı iframe'iniz olsaydı, sayfanın kendisi yerine kaydırılacağı için iframe'de 'sıkışıp kalırdınız'. Görünüşe göre Apple, bir iFrame'in varsayılan davranışının 'kaydırma yok' olduğuna karar verdi ve bunu önlemek için genişledi.

Bir seçenek bu geçici çözüm olabilir. İFrame'in kaydırılacağını varsaymak yerine, iframe'i üzerinde kontrole sahip olduğunuz bir DIV'ye yerleştirin ve kaydırmasına izin verin.

örnek: http://jsbin.com/zakedaja/1

Örnek işaretleme:

<div style="overflow: scroll; -webkit-overflow-scrolling: touch; width: 300px;">
   <iframe src="http://jsbin.com/roredora/1/" style="width: 600px;"></iframe>
</div>

Mobil safaride, artık tamamen genişletilmiş iFrame'in içeriğini, onu içeren div aracılığıyla kaydırabilirsiniz.

Yakalama: Bu, artık çift kaydırma çubuklarına sahip olduğunuz için bir masaüstü tarayıcısında gerçekten çirkin görünüyor. Bu nedenle, bunun üstesinden gelmek için JS ile biraz tarayıcı tespiti yapmanız gerekebilir.


1
Yine de bunun gerçekten sorunun kapsamı içinde olmadığını iddia ediyorum, çünkü burada gösterdiğiniz çözüm , iOS Safari'de delik iframe kaydırmasını taklit etmenin standart yoludur , ancak bu iOS sorununu dikkate almak IFrame kaydırmasıyla ilgili bir sorundur. (içerik veya başka türlü) o zaman burada olması güzel.
Idra

1
Sanırım sorunuzu tam olarak anlamıyorum. Anladığım kadarıyla, yaşadığınız sorun, iOS'ta Mobile Safari'nin ilk etapta bir iFrame'in kaymasını engellemeye çalışması ve üzerine bir genişlik zorlaması. Sorununuzu yanlış mı anlıyorum?
DA.

Özünde sorun budur, sadece gereken çözüm farklıdır. İlk problemde, IFrame içeriği yatay olarak kaydırılırken duyarlıydı, bu nedenle soru iframe kaydırmasının nasıl taklit edileceği değil, içeriğin yatay olarak kaydırılırken iframe genişliğinin nasıl% 100, yani duyarlı olmasını sağlamasıydı. bu iframe. Bu nedenle, yukarıdaki yaklaşım bu durumda işe yaramaz, çünkü tasarlanan duyarlılık bozulmuştur ve normalde tasarım gereği ihtiyaç duymadığınız yerlerde bile içeriğin tamamını görmek için kaydırmanız gerekir.
Idra

1
Özür dilerim, yorumlardan birinde sizi yanılttığımı fark ettim. İframe kaydırılmıyor. Mesele buydu, iframe'in içeriğinin yalnızca bazı kısımlarını kaydırmaması gerekiyordu, yani div#ScrolledAreabenim örneğimdeki (yeşil). Daha önce yanlış anladım. Ancak, iframe kaydırılmamalı, yalnızca kapsayıcı öğesine göre kendini yeniden boyutlandırmamalıdır, yaniwidth: 100%;
Idra

18

Tarayıcılar arası bir çözüme ihtiyacım vardı. Gereksinimler şunlardı:

  • hem iOS hem de başka bir yerde çalışması gerekiyor
  • iFrame'deki içeriğe erişiminiz yok
  • kaydırmak için ona ihtiyacım var!

İOS'ta kaydırma = "hayır" ile ilgili @Idra'dan öğrendiklerimden ve iFrame içeriğini iOS'ta ekrana sığdırmakla ilgili bu gönderiye dayanarak işte sonuçta bulduğum şey . Umarım birine yardımcı olur =)

HTML

<div id="url-wrapper"></div>

CSS

html, body{
    height: 100%;
}

#url-wrapper{
    margin-top: 51px;
    height: 100%;
}

#url-wrapper iframe{
    height: 100%;
    width: 100%;
}

#url-wrapper.ios{
    overflow-y: auto;
    -webkit-overflow-scrolling:touch !important;
    height: 100%;
}

#url-wrapper.ios iframe{
    height: 100%;
    min-width: 100%;
    width: 100px;
    *width: 100%;
}

JS

function create_iframe(url){

    var wrapper = jQuery('#url-wrapper');

    if(navigator.userAgent.match(/(iPod|iPhone|iPad)/)){
        wrapper.addClass('ios');
        var scrolling = 'no';
    }else{
        var scrolling = 'yes';
    }

    jQuery('<iframe>', {
        src: url,
        id:  'url',
        frameborder: 0,
        scrolling: scrolling
    }).appendTo(wrapper);

}

1
oy verildi, ama ... neden "ios" sınıfında IE6 kuralı? :-)
J. Bruni

12

Tüm bu çözümlerle ilgili sorun, yüksekliğinin iframeasla gerçekten değişmemesidir.

Bu araçlar içeri merkezi elemanlarına mümkün olmayacaktır iframekullanarak JavaScript, position:fixed;ya position:absolute;beriiframe kendisi asla kaydırılmadığı .

Burada ayrıntılı olarak anlattığım çözüm , divbu CSS'yi kullanarak iframe'in tüm içeriğini bir içine sarmaktır:

#wrap {
    position: fixed;
    top: 0;
    right:0;
    bottom:0;
    left: 0;
    overflow-y: scroll;
    -webkit-overflow-scrolling: touch;
}

Bu şekilde Safari, içeriğin yüksekliği olmadığına inanır ve yüksekliğini iframedoğru şekilde atamanıza izin verir . Bu, öğeleri istediğiniz şekilde konumlandırmanıza da olanak tanır.

Burada hızlı ve kirli bir demo görebilirsiniz.


1
Benim için işe yarayan tek çözüm bu. Tabii ki, sadece içeriğini kontrol ederseniz kullanılabilir iframe, ama benim durumumda kullanıyorum. Şerefe!
Vince

Hmm. Örneğiniz iOS'ta duyarlı görünmüyor mu?
BrandonReid

Bunu yazdığım zaman 2 yıl önceydi. Depoya bir sorun bildirebilir misin?
İskele

iOS'ta Ionic / Cordova ile bu konuda saatler harcadıktan sonra, işe yarayan tek şey bu oldu. Teşekkürler!
Andrew

1
Bu harika, işe yarayan tek şey, size @Pier 100pts gibi bir çözüm aramak için 1 günümü harcadım
Carlos E

5

Bu sorun, iOS Chrome'da da mevcuttur.

Yukarıdaki tüm çözümlere göz attım, çoğu çok hilekar.

Daha eski tarayıcılar için desteğe ihtiyacınız yoksa, iframe genişliğini 100vw olarak ayarlamanız yeterlidir;

iframe {
  max-width: 100%; /* Limits width to 100% of container */
  width: 100vw; /* Sets width to 100% of the viewport width while respecting the max-width above */
}

Not: Görüntü alanı birimleri için desteği kontrol edin https://caniuse.com/#feat=viewport-units


1
İOS için Chrome, altındaki Safari'dir. WKWebView kullanır. İOS'ta başka hiçbir web oluşturma motoruna izin verilmez.
Pier

3

İonic2 ile çalışıyorum ve sistem yapılandırması aşağıdaki gibidir -


******************************************************

Your system information:

Cordova CLI: 6.4.0 
Ionic Framework Version: 2.0.0-beta.10
Ionic CLI Version: 2.1.8
Ionic App Lib Version: 2.1.4
ios-deploy version: Not installed
ios-sim version: 5.0.8 
OS: OS X Yosemite
Node Version: v6.2.2
Xcode version: Xcode 7.2 Build version 7C68



******************************************************

Benim için bu sorun
html iframe etiketi için bu kodla çözüldü

<div class="iframe_container">
      <iframe class= "animated fadeInUp" id="iframe1" [src]='page' frameborder="0" >
        <!--  <img src="img/video-icon.png"> -->
      </iframe><br>
   </div>

Aynı css'e bakın-


.iframe_container {
  overflow: auto; 
  position: relative; 
  -webkit-overflow-scrolling: touch;
  height: 75%;
}

iframe {
  position:relative;
  top: 2%;
  left: 5%;
  border: 0 !important;
  width: 90%;
}

Konum mülkiyeti benim durumumda hayati bir rol oynuyor.
konum: göreceli;

Size de yardımcı olabilir !!!


0

Yalnızca CSS çözümü

HTML

<div class="container">
    <div class="h_iframe">
        <iframe  src="//www.youtube.com/embed/9KunP3sZyI0" frameborder="0" allowfullscreen></iframe>
    </div>
</div>

CSS

html,body {
    height:100%;
}
.h_iframe iframe {
    position:absolute;
    top:0;
    left:0;
    width:100%;
    height:100%;
}

DEMO

Burada iframe'de HTML sayfası olan başka bir demo


Belki çözümünüzü yanlış uyguluyorum, ancak izole test durumumla denediğimde, iOS Safari 7.1 iPhone 4'te hiç işe yaramadı. Bunun nasıl çalışması gerektiğini açıklar mısınız?
Idra

Tamam, sorunu yanlış anladığınız gibi görünüyorsa, bu bağlantıyı kontrol edin, bu , iframe'e herhangi bir ek CSS uygulanmadan entegre edilmiş yeni demo iframe içeriğinizdir. Ve iOS Safari'de bakarsanız, yine de duyarlıdır, çünkü bu sayfada, iframe genişliğini görüntü alanından daha geniş olmaya zorlayacak herhangi bir yatay kaydırma yoktur. Soruda açıklandığı gibi, bunun gibi bir sitede iframe'in duyarlı olması için hiçbir şey yapmanız gerekmez.
Idra

Peki tam olarak ne davranmasını istiyorsunuz, verilen linke örnek veriniz?
4dgaurav

0

İçerik bölmesindeki genişlikle, iç çerçeve için yatay bir kaydırma çubuğu oluştururken bir sorun yaşadım. Görüntünün genişliği beklenenden daha geniş tuttuğu ortaya çıktı. Tüm görüntüleri css maksimum genişliğini yüzde olarak ayarlayarak çözebildim.

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

img {
        max-width: 100%;
        height:auto;
    }

0

aslında benim için ios'ta kaydırmayı devre dışı bırakarak çalıştı

<iframe src="//www.youraddress.com/" scrolling="no"></iframe>

ve işletim sistemini komut dosyası aracılığıyla işleme.


0

Benim için CSS çözümleri işe yaramadı. Ancak genişliği programlı olarak ayarlamak işi yapar. İframe yüklemesinde genişliği programlı olarak ayarlayın:

 $('iframe').width('100%');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.