CSS를 사용하여 iframe 내부의 div 스타일에 영향


답변:


117

JavaScript가 필요합니다. JavaScript 명령 앞에 iframe 이름을 붙여야한다는 점을 제외하면 상위 페이지에서 수행하는 것과 동일합니다.

동일한 오리진 정책이 적용되므로 자신의 서버에서 오는 iframe 요소에만이 작업을 수행 할 수 있습니다.

내가 사용하는 프로토 타입 쉽도록 프레임 워크를 :

frame1.$('mydiv').style.border = '1px solid #000000'

또는

frame1.$('mydiv').addClassName('withborder')

2
내이 질문을 보아도 비슷한 stackoverflow.com/questions/1962707/… 프레임이 다른 서버에서 온 경우 스타일을 변경할 수 없습니까?
Jitendra Vyas

16
맞아요. Iframe 콘텐츠에는 동일한 도메인 정책이 적용됩니다. 도메인에서 온 경우 제어 할 수 있으며 그렇지 않은 경우 잠겨 있습니다. 이렇게하면 모든 종류의 Iframe 기반 페이지 하이재킹이 방지됩니다.
Diodeus-James MacFarlane

2
정확히 "CSS 전용"솔루션은 아니지만 나에게 충분합니다. +1
Nicu Surdu

2
이것은 CSS가 아닙니다.
Stramin

103

한마디로

도메인 간 리소스 제한으로 인해 iframe에로드 된 페이지를 제어하지 않으면 iframe에로드 된 HTML에 CSS를 적용 할 수 없습니다.


55
이것은 사실이지만 사람들이 어떻게하는 방법에 대한 모범을 보여주는 데 실제로 도움이되지는 않습니다.
Simon Dragsbæk

2018 년에 나왔나요? iframe 스타일을 구성하는 데 사용했던 것을 기억합니다. 스크립트로 렌더링 한 iframe에 CSS를 적용하려고했지만 여전히 작동하지 않습니다 .l
Võ Minh

46

예. 자세한 내용은이 다른 스레드를 살펴보십시오. CSS를 iframe에 적용하는 방법은 무엇입니까?

var cssLink = document.createElement("link");
cssLink.href = "style.css";  
cssLink.rel = "stylesheet";  
cssLink.type = "text/css";  
frames['frame1'].document.body.appendChild(cssLink); 

4
iframe의 id는 frame1입니까 ??
Toni Michel Caubet

5
예, frame1은 iframe의 id입니다.
유진 로젠펠트

3
이것은 CSS가 아닙니다.
Stramin

4
iframe에 다른 도메인을로드하는 경우에는 할 수 없습니다.
Sunith Saga

frame1는 ID가 아닌 iframe 이름입니다.
joseantgv

14

iframe첫 번째 의 내용을 검색 한 다음 jQuery평소와 같이 선택기 를 사용할 수 있습니다 .

$("#iframe-id").contents().find("img").attr("style","width:100%;height:100%")

$("#iframe-id").contents().find("img").addClass("fancy-zoom")

$("#iframe-id").contents().find("img").onclick(function(){ zoomit($(this)); });

행운을 빕니다!


11
작동하지 않음 : 잡히지 않은 DOMException : 'HTMLIFrameElement'에서 'contentDocument'속성을 읽지 못했습니다. 원본이 ' HOST '인 프레임이 교차 출처 프레임에 액세스하지 못하도록 차단했습니다 .
tubbo

@tubbo, 귀하의 경우 XSS로부터 차단 된 무단 사이트를 포함시킬 수 없습니다. 이것은 해커가 아닌 자신의 문제를 찾는 사람들을위한 것입니다. p
Riyaz Hameed

10

빠른 답변은 : 아니요, 죄송합니다.

CSS만으로는 사용할 수 없습니다. 스타일을 지정하려면 기본적으로 iframe 컨텐츠를 제어해야합니다. 필요한 스타일을 동적으로 삽입하기 위해 자바 스크립트 또는 선택한 웹 언어를 사용하는 방법이 있습니다 (약간 읽었지만 익숙하지는 않습니다). 그러나 iframe 내용을 직접 제어해야합니다. 당신이없는 것처럼.


8

Jquery를 사용하고 소스가로드 될 때까지 기다리십시오.

var addCssToIframe = function() {
    if ($('#myIframe').contents().find("head") != undefined) {
        $('#myIframe')
                .contents()
                .find("head")
                .append(
                        '<link rel="stylesheet" href="app/css/iframe.css" type="text/css" />');
        $interval.cancel(addCssInterval);
    }
};
var addCssInterval = $interval(addCssToIframe, 500, 0, false);

1
왜 iframe loaded 이벤트를 사용하지 않습니까?
ProllyGeek

3

아마 당신이 생각하는 방식이 아닙니다. iframe은 <link>CSS 파일에도 있어야합니다 . 그리고 다른 도메인에 있으면 자바 스크립트로도 할 수 없습니다.


이 작업을 수행하는 방법에 대한 예를 들어 줄 수 있습니까? 당신은 같은 것을 의미 <iframe src="/source" link=css-stylesheet:"/css.css">합니까?
앤트

3

분명히 jQuery를 통해 수행 할 수 있습니다.

$('iframe').load( function() {
    $('iframe').contents().find("head")
      .append($("<style type='text/css'>  .my-class{display:none;}  </style>"));
});

https://stackoverflow.com/a/13959836/1625795


3
Chrome 브라우저에서 동일한 원본 정책으로 인해 더 이상 사용할 수 없습니다. 오류 메시지 :Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
Mohammad AlBanna

@adamj, iframe 요소의 덮어 쓰기 스타일 시트를 변경할 수 있습니까? 그렇다면 친절하게 스크립트를 추가하십시오.
슈퍼 모델

2

유진에 따르면 일종의 해킹 방식이 일을한다. 나는 그의 코드를 따르고 페이지의 사용자 정의 CSS에 연결되었습니다. 나에게 문제는 트위터 타임 라인을 사용하면 코드를 smidgen을 무시하기 위해 트위터의 약간의 스테핑을해야한다는 것입니다. 이제 CSS가있는 롤링 타임 라인이 있습니다 .IE 더 큰 글꼴, 적절한 줄 높이 및 스크롤 막대가 제한보다 큰 높이에 숨겨져 있습니다.

var c = document.createElement('link');
setTimeout(frames[0].document.body.appendChild(c),500); // Mileage varies by connection. Bump 500 a bit higher if necessary

1

이것을 추가하면 모든 것이 잘 작동합니다.

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">

이 질문에 대한 정답인지 확실하지 않지만 Google 양식의 크기를 기기 너비에 맞게 조정하는 것이 좋습니다.
shiftyscales

0

예, 번거롭지 만 가능합니다. 페이지 본문에 페이지의 HTML을 인쇄 / 에코 한 다음 CSS 규칙 변경 기능을 적용해야합니다. 위에 주어진 동일한 예제를 사용하면 본질적으로 페이지에서 div를 찾은 다음 CSS를 적용한 다음 최종 사용자에게 다시 인쇄 / 반향시키는 구문 분석 방법을 사용합니다. 나는 이것을 필요로하지 않기 때문에 다른 웹 페이지의 CSS에있는 모든 항목에 그 기능을 코딩하기를 원하지 않습니다.

참고 문헌 :


이 질문은 특히 "CSS 만 사용"을 요구합니다. 그것을 염두에두고, 당신의 대답은 잘못되었습니다.
Serj Sagan

이것은 CSS가 아닙니다.
Stramin

0

다른 솔루션을 결합하면 이것이 나를 위해 일한 것입니다.

$(document).ready(function () {
    $('iframe').on('load', function() {
        $("iframe").contents().find("#back-link").css("display", "none");
    }); 
});

-1

클라이언트 측에서는 불가능합니다. Iframe이 도메인의 일부가 아니기 때문에 "오류 :"document "속성에 액세스 할 수있는 권한이 거부되었습니다"라는 JavaScript 오류가 발생합니다. 유일한 해결책은 서버 측 코드에서 페이지를 가져와 필요한 CSS를 변경하는 것입니다.


2
이 답변은 내용은 정확하지만 JavaScript와 관련이 있지만 질문은 CSS와 관련이 있습니다. 대답은 JavaScript를 사용해야하지만 그렇지 않다는 것입니다. 또한 iFrame의 컨텐츠가 다른 도메인의 컨텐츠라고 가정하지만 항상 그렇지는 않습니다. 마지막으로 정확한 메시지는 브라우저마다 다릅니다.
pwdst
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.