iOS Safari에서 IFrame을 반응 적으로 만드는 방법은 무엇입니까?


134

문제는 웹 사이트에 콘텐츠를 삽입하기 위해 IFrame을 사용해야 할 때 최신 웹 세계에서 IFrame도 반응 할 것입니다. 이론적으로는 간단하고 간단하게 사용 <iframe width="100%"></iframe>하거나 CSS 너비를 설정 iframe { width: 100%; }하지만 실제로는 그렇게 간단하지는 않지만 가능합니다.

iframe컨텐츠가 완전히 반응하고 내부 스크롤 막대없이 자체 크기를 조정할 수 있다면 iOS Safari는 iframe실제 문제없이 크기를 조정합니다 .

다음 코드를 고려하면 :

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

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>

그런 다음 iOS 7.1 Safari에서 문제없이 작동합니다. 아무 문제없이 가로와 세로를 바꿀 수 있습니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

그러나 다음을 추가하여 간단히 Content.html CSS 를 변경하면 됩니다.

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

당신은 이것을 얻는다 :

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

보시다시피, Content.html 컨텐츠가 완전히 반응하고 ( div # ScrolledAreaoverflow: scroll설정 됨) iframe 너비가 100 % 인 경우에도 iframe 은 오버 플로우가 존재하지 않는 것처럼 여전히 div # ScrolledArea 의 전체 너비를 사용 합니다. 데모

이와 같은 경우 콘텐츠에 스크롤 영역이 있습니까? iframe 콘텐츠에 가로 스크롤 영역이있을 때 반응 iframe을 얻는 방법 iframe은 무엇입니까? 여기서 문제는 Content.html 이 반응하지 않는다는 사실이 아니라 iOS Safari가 단순히 iframe의 크기를 조정하여 div#ScrolledArea완전히 표시 되도록한다는 것입니다.


우리와 링크를 공유 할 수 있습니까? 내 페이지에 white-space: nowrap스타일 이있는 콘텐츠가있는 경우 iOS가 iFrame을 페이지의 전체 너비로 확장한다고 말하고 있습니까?
DA.

@DA 나는 문제와 해결책 모두에 데모를 추가했다. 그리고 아닙니다 white-space: nowrap. 그 자체로는 문제가 아닙니다. 나는 단순히 그것을 사용하여 극단적 인 너비를 얻습니다 div#ScrolledArea. IFrame 컨텐츠에 가로로 스크롤 가능한 영역이 있으면 문제가 발생합니다. 이 경우 iOS Safari는 단순히 너비 설정을 무시하고 구멍 내용을 표시하고 사이트의 응답 성을 깨뜨립니다.
Idra

흠 ... '기능'인지 궁금합니다. 스크롤 가능한 컨텐츠가 포함 된 스크롤 가능한 영역 (iFrame)이 있으면 어색합니다. 터치 스크린에서 상호 작용하는 것은 매우 어려운 일입니다.
DA.

@DA 물론 이것은 조카의 경우이며, 당신이 말한 것은 사실 일 수 있습니다 (구현에 달려 있으며 우리에게 효과적입니다). 대부분의 사이트에는 가로로 스크롤 가능한 영역이 없지만 그렇게 할 때 상상할 수 없습니다. 내가 얼마나 많은 시간을 보냈는지 그러나 버튼이나 이와 비슷한 것으로 숨겨져있는 이미지가있는 경우에도 문제가 될 수 있습니다.
Idra

이것에 관한 관련 질문이있는 것 같습니다 : stackoverflow.com/questions/5267996/… 모바일 사파리의 '기능'인 것처럼 보입니다 ... 사용자가 할 수있는 방식으로 콘텐츠의 크기를 조정하려고합니다. 여전히 그것과 상호 작용합니다. 스크롤하는 iframe에 내용을 스크롤하면 어떻게 될지 잘 모르겠습니다. Safari는 중첩 된 스크롤 요소 내에서 스 와이프를 어떻게 해석합니까?
DA.

답변:


289

이 문제에 대한 해결책은 실제로 매우 간단하며 두 가지 방법이 있습니다. Content.html 을 제어 할 수 있으면 div#ScrolledArea너비 CSS를 다음과 같이 변경하십시오 .

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

기본적으로 여기의 아이디어는 간단 width합니다.이를 뷰포트보다 작은 것으로 설정 한 다음 (이 경우 iframe 너비) min-width: 100%실제로 width: 100%어떤 iOS Safari가 기본적으로 덮어 쓸 수 있도록 덮어 씁니다. 이 *width: 100%;코드는 IE6 호환을 유지하지만 IE6에 신경 쓰지 않으면 생략 할 수 있습니다. 데모

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

보시다시피, div#ScrolledArea너비는 실제로 100 %이며 할 overflow: scroll;수있는 일이 있고 넘친 내용을 숨길 수 있습니다. iframe 컨텐츠에 액세스 할 수 있으면 이것이 좋습니다.

그러나 어떤 이유로 든 iframe 컨텐츠에 액세스 할 수없는 경우 실제로 iframe 자체에서 동일한 기술을 사용할 수 있습니다. iframe에서 동일한 CSS를 사용하기 만하면됩니다.

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

그러나 이것에는 한 가지 제한 scrolling="no"이 있습니다.이 작업을 수행하려면 iframe 에서 스크롤 막대를 꺼야합니다 .

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

스크롤 막대가 허용되면 더 이상 iframe에서 작동하지 않습니다. 즉, Content.html을 대신 수정 하면 iframe에서 스크롤을 유지할 수 있습니다. 데모


1
@NickGottlieb 언급처럼, 나는 추가했다 !important받는 widthiframe이 아이폰 OS 7 아이폰 4에 준비가 반응 - 웹 - 설계 얻을 속성
malisokan

@ ЮнгвиртТони 대안이 작동하는 데 필요하지는 않습니다 . CSS가 width이전에 설정 !important되었거나 우선 순위가 높은 CSS가이를 덮어 썼을 수 있습니다. iPhone 4 iOS7의 경우에는 별도로 필요하지 않았습니다.
Idra

나는 중요하지도 않았다. iOS 8에서도 잘 작동합니다. 건배
샘 포츠

필요할 때만 스크롤이 필요하지 않습니다. 그렇지 않으면 scrolling = yes입니다. 무엇을 감지해야합니까? 이것이 iOS 문제입니까? 또는 웹킷 문제? 또는...?
gerbz

@ggwarpig 이것은 iOS 문제이며, iOS Safari는 자동으로 이음새없는 속성을 설정하고 덮어 쓸 수 없습니다. 컨텐츠에 대한 제어 권한이있는 경우, scrolling="yes"정정 할 방법이 없도록 컨텐츠를 수정해야합니다. 수정 사항이 IFRAME에서 작동 scrolling="no"하려면 IFRAME
Idra

24

문제는 포함 된 문서가 지정한 것보다 넓은 경우 Mobile Safari가 iFrame의 너비를 준수하지 않는 것입니다. 예:

http://jsbin.com/hapituto/1

데스크톱 브라우저에는 iFrame과 Div가 모두 300px로 설정되어 있습니다. 내용이 더 넓어 iFrame을 스크롤 할 수 있습니다.

그러나 모바일 사파리에서는 iFrame이 컨텐츠 너비로 자동 확장되는 것을 알 수 있습니다.

내 생각에 이것은 페이지 내에서 내용을 스크롤하는 데 오랫동안 지속되는 문제에 대한 해결 방법입니다. 과거에는 터치 장치에 큰 스크롤 iframe이있는 경우 페이지 자체 대신 스크롤되는 iframe에 '고정'되었습니다. Apple은 iFrame의 기본 동작이 '스크롤 없음'이라고 판단하여이를 방지하기 위해 확장 한 것으로 보입니다.

한 가지 옵션이이 해결 방법 일 수 있습니다. iFrame이 스크롤된다고 가정하는 대신 제어 할 수있는 DIV에 iframe을 배치하고 해당 스크롤을 허용하십시오.

예 : http://jsbin.com/zakedaja/1

마크 업 예 :

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

모바일 사파리에서 이제 완전히 확장 된 iFrame의 컨텐츠를 포함하는 div를 통해 스크롤 할 수 있습니다.

캐치 : 이제 두 개의 스크롤 막대가 있으므로 데스크톱 브라우저에서보기 흉하게 보입니다. 따라서이 문제를 해결하려면 JS로 브라우저 감지를 수행해야 할 수도 있습니다.


1
여기에 표시된 솔루션이 iOS Safari에서 구멍 iframe 스크롤 을 위조하는 표준 방법 이지만 여전히이 iOS 문제를 고려하는 것이 IFrame 스크롤과 관련된 문제 이기 때문에 여전히 이것이 문제의 범위에 속하지 않는다고 유지합니다. (콘텐츠 또는 기타) 여기에있는 것이 좋습니다.
Idra

1
귀하의 질문을 완전히 이해하지 못하는 것 같습니다. 내가 이해하는 것에서, 당신이 겪고있는 문제는 iOS에서 Mobile Safari가 iFrame이 처음으로 스크롤되는 것을 막고 너비를 강제한다는 것입니다. 내가 당신의 문제를 오해하고 있습니까?
DA.

본질적으로 이것이 문제이며, 필요한 솔루션 만 다릅니다. 초기 문제에서 콘텐츠를 가로로 스크롤하는 동안 IFrame 콘텐츠는 반응이 좋았으므로 iframe 스크롤 을 에뮬레이트하는 방법이 아니라 iframe 너비를 100 %로 만드는 방법, 즉 반응식으로 가로 스크롤하는 방법 그 iframe. 이 경우 위와 같은 접근 방식이 작동하지 않는 이유는 설계된 응답 성이 깨져서 전체 내용을보기 위해 스크롤해야하기 때문입니다. 설계 상으로는 일반적으로 필요하지 않은 장소 일지라도 말입니다.
Idra

1
죄송합니다. 댓글 중 하나에 대해 당신을 오도했다는 것을 깨달았습니다. iframe이 스크롤되지 않습니다. 요점은 iframe이 내용의 일부, 즉 div#ScrolledArea내 예에서 (녹색)을 스크롤하지 않아야한다는 것 입니다. 방금 전에 잘못 읽었습니다. 그러나 iframe을이 컨테이너 요소를 기반으로 자체 크기를 조정에만 스크롤되어서는 안 즉,이width: 100%;
국제 재난 현장

18

크로스 브라우저 솔루션이 필요했습니다. 요구 사항은 다음과 같습니다.

  • iOS와 다른 곳에서 모두 작동해야했습니다.
  • iFrame의 콘텐츠에 접근 할 수 없습니다
  • 스크롤해야합니다!

iOS의 scrolling = "no"와 관련 하여 @Idra 에서 배운 내용과 iOS의 화면에 iFrame 컨텐츠를 맞추는 방법에 대한 이 게시물 은 여기에 있습니다. 희망이 누군가를 도울 것입니다 =)

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
upvoted,하지만 ... 왜 "ios"클래스의 IE6 규칙입니까? :-)
J. Bruni

12

이 모든 솔루션의 문제점은 iframe결코 변하지 않는 높이입니다 .

iframe, Javascript를 사용 position:fixed;하거나 내부에서 스크롤하지 position:absolute;않기 때문에 요소를 가운데에 배치 할 수 없습니다 iframe.

여기자세한 해결책 은 div다음 CSS를 사용하여 iframe의 모든 내용을 래핑하는 것입니다 .

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

이런 식으로 Safari는 컨텐츠에 높이가 없다고 믿고 높이를 iframe적절하게 지정할 수 있습니다 . 또한 원하는 방식으로 요소를 배치 할 수 있습니다.

여기서 빠르고 더러운 데모를 볼 수 있습니다.


1
이것은 나를 위해 일한 유일한 솔루션입니다. 물론의 콘텐츠를 제어하는 ​​경우에만 사용할 수 iframe있지만 제 경우에는 그렇게합니다. 건배!
Vince

흠. iOS에서 예제가 반응하지 않는 것 같습니까?
BrandonReid

내가 이것을 쓴 것은 2 년 전이었습니다. 리포지토리에 문제를 제기 할 수 있습니까?
Pier

iOS의 Ionic / Cordova에서이 문제에 시간과 시간을 낭비한 후 이것이 유일하게 작동했습니다. 감사!
앤드류

1
이것은 굉장합니다. 유일하게 작동했습니다. 저는 @Pier 100pts와 같은 솔루션을 검색하는 데 하루를 보냈습니다.
Carlos E

5

이 문제는 iOS Chrome에도 있습니다.

위의 모든 솔루션을 살펴 보았으며 대부분 해킹되었습니다.

구형 브라우저를 지원할 필요가 없다면 iframe 너비를 100vw로 설정하십시오.

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

참고 : 뷰포트 단위 지원 확인 https://caniuse.com/#feat=viewport-units


1
iOS 용 Chrome은 바로 사파리입니다. WKWebView를 사용합니다. iOS에서는 다른 웹 렌더링 엔진을 사용할 수 없습니다.
Pier

3

ionic2로 작업 중이며 시스템 구성은 다음과 같습니다.


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

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



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

나 에게이 문제는이 코드
로 해결 되었습니다-html iframe 태그-

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

다음과 같은 CSS를 참조하십시오.


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

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

내 경우에는 위치 속성이 중요한 역할을합니다.
위치 : 상대;

너무 도움이 될 수도 있습니다 !!!


0

CSS 전용 솔루션

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

데모

iframe에 HTML 페이지가있는 또 다른 데모


어쩌면 솔루션을 잘못 구현하고 있지만 격리 된 테스트 사례로 시도했을 때 iOS Safari 7.1 iPhone 4에서는 전혀 작동하지 않습니다. 어떻게 작동하는지 자세히 설명해 주시겠습니까?
Idra

문제를 이해하지 못하는 것처럼 보입니다. 이 링크가 iframe에 추가 CSS를 적용하지 않고 통합 된 새로운 데모 iframe 컨텐츠인지 확인하십시오. 그리고 iOS Safari에서 살펴보면 여전히 반응합니다.이 페이지에는 가로 스크롤이 없어 iframe 너비가 뷰포트보다 넓어지기 때문입니다. 질문에 설명 된 바와 같이, 이와 같은 사이트에서는 iframe이 반응하기 위해 아무것도 할 필요가 없습니다.
Idra

정확히 무엇을 원하는지, 주어진 링크에 대한 예를 제시 하시겠습니까?
4dgaurav

0

iframe의 가로 스크롤 막대를 만드는 내용 창 너비에 문제가 있습니다. 이미지가 너비를 예상보다 넓게 잡고 있음이 밝혀졌습니다. 모든 이미지 CSS 최대 너비를 백분율로 설정하여 해결할 수있었습니다.

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

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

0

사실 나를 위해 스크롤을 비활성화하는 iOS에서 일했습니다.

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

스크립트를 통해 OS를 처리합니다.


0

나를 위해 CSS 솔루션이 작동하지 않았습니다. 그러나 너비를 프로그래밍 방식으로 설정하면 작업이 수행됩니다. iframe 하중에서 프로그래밍 방식으로 너비를 설정하십시오.

 $('iframe').width('100%');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.