iframe의 콘텐츠에 대한 바디 스타일 재정의


165

iframe? 내의 바디 요소의 배경 이미지와 색상을 어떻게 제어 할 수 있습니까? 임베디드 본문 요소에는 클래스 iframe가 있으며 내 사이트의 일부인 페이지입니다.

내가 필요한 이유는 내 사이트에 본문에 검은 색 배경이 할당 된 다음 텍스트가 포함 된 div에 흰색 배경이 할당되어 있기 때문입니다. WYSIWYG 편집기는 iframe편집시 내용을 포함 하기 위해를 사용 하지만 div를 포함하지 않으므로 텍스트를 읽기가 매우 어렵습니다.

iframe에디터 의 when 본문에는 다른 곳에서는 사용되지 않는 클래스가 있으므로이 문제가 해결 될 수 있다고 가정합니다. 그러나 class.body스타일을 적용하면 본문에 적용된 스타일이 재정의되지 않습니다. 이상한 점은 스타일이 Firebug에 나타나기 때문에 무슨 일이 일어나고 있는지 전혀 모른다는 것입니다!

감사

업데이트-나는 몸의 클래스 인 클래스에 스타일을 추가하는 @mikeq의 솔루션을 시도했습니다. 기본 페이지의 스타일 시트에 추가하면 작동하지 않지만 Firebug와 함께 추가하면 작동합니다. Firebug가 페이지의 모든 요소에 적용되는 반면 CSS는 iframe 내에 적용되지 않기 때문입니다. 이것은 JavaScript로 창로드 후 CSS를 추가하면 작동합니까?



iframe의 어떤 것도 건드릴 수 없지만, <div>때때로 Ajax마다 해당 URL을 캔에 로드하는 것이 해결 방법이 될 수 있습니다 (CORS-Header가 허용하는 경우). 예, 모두 해키 ...)
Frank Nocke

페이지 도메인이 일치하면 자바 스크립트를 사용할 수 있지만 변경하려는 색상을 무시하기 위해 내부 페이지의 HTML에 스타일 블록을 넣는 것이 어떻습니까? 오버라이드에 더 많은 선택기를 추가하거나 중요한 것을 사용하십시오! 다른 모든 방법이 실패하면 해당 한 페이지에서만 원하는 색상 스타일을 재정의하는 것입니다.
OG Sean

답변:


112

iframe은 페이지 내부에 다른 웹 페이지를 표시하는 '구멍'입니다. iframe의 내용은 부모 페이지의 형태 나 형태가 아닙니다.

다른 사람들이 말했듯이 귀하의 옵션은 다음과 같습니다.

  • iframe에로드중인 파일에 필요한 CSS를 제공하십시오
  • iframe의 파일이 부모와 동일한 도메인에있는 경우 부모에서 iframe에있는 문서의 DOM에 액세스 할 수 있습니다.

251

아래는 iframe 콘텐츠가 동일한 상위 도메인에서 온 경우에만 작동합니다.

다음 jquery 스크립트가 나를 위해 작동합니다. Chrome 및 IE8에서 테스트되었습니다. 내부 iframe은 상위 페이지와 동일한 도메인에있는 페이지를 참조합니다.

이 특별한 경우에는 내부 iframe에 특정 클래스가있는 요소를 숨기고 있습니다.

기본적으로 내부 iframe의 'head'에 'style'요소를 추가하기 만하면됩니다.

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

4
@ SimpleSam5 Jquery를 사용하지 않고 Javascript 대안을 제공 할 수 있습니까?
Kamalakannan J

1
@sincerekamal 다음은 jQuery가 필요없는 코드입니다. jsfiddle.net/9g9wkpon 하이픈으로 연결된 CSS 속성이 내 예제와 같이 JavaScript의 camelCase로 작성되어 있음을 알아야합니다. :)
Dennis98

2
jquery.js? ver = 1.12.4 : 2 Uncaught DOMException : 'HTMLIFrameElement'에서 'contentDocument'속성을 읽지 못했습니다. 출처가 xxxxxxxxx.com 인 프레임이 교차 출처 프레임에 액세스하지 못하도록 차단했습니다 .
Alex Stanese

2
@AlexStanese는 jeremy 상태로, iframe 페이지가 상위 페이지와 동일한 서버에서 온 경우에만 작동합니다. 일반적으로 자바 스크립트를 신경 쓰지 않아도됩니다 ... CSS를 다른 페이지에 추가하십시오. 가장 먼저.
DA.

@KamalakannanJ 당신은 자바 스크립트를 사용할 필요가 없습니다. iFrame에있는 페이지를 편집하고 CSS를 넣으십시오.
DA.

25

소스 html 및 / 또는 CSS 파일에 직접 액세스 할 수있는 권한 이 없으면 iframe에 표시되는 페이지 스타일을 변경할 수 없습니다 .

XSS (Cross Site Scripting) 를 중지합니다.


'직접 액세스'란 무엇을 의미합니까? iframe의 페이지는 하나의 도메인 인 내 사이트에서 온 것입니다.
jd6699 2016 년

2
그렇다면 사이트의 소스 파일을 변경해야합니다 (iframe의 내용을 수정할 수 없음). iframe이 mysite.com/test.html을 가리키는 경우 test.html을 직접 수정해야합니다. .
마일스 회색

1
할 수 없습니까? 조건 하에서 OP는 할 수 있다고 말합니다. 예를 들어, 내부 iframe URL은 상위 사이트와 동일하므로 원하는 자바 스크립트를 사용하여 DOM ok에 액세스 할 수 있어야합니다.
OG Sean

@ Myles Grey 잘못되었습니다. JavaScript 및 CSS를 사용하여 동일한 도메인에있는 경우 상위 페이지에서 iframe의 컨텐츠를 수정할 수 있습니다.
Kevin M

8

iframe다른 범위가 있으므로 자바 스크립트를 사용하여 스타일을 지정하거나 내용을 변경할 수 없습니다.

기본적으로 "다른 페이지"입니다.

글로벌 CSS를 사용하면 아무것도 할 수 없기 때문에 자신의 CSS를 편집하는 것이 유일한 방법입니다.


네, 자바 스크립트로 가능합니다. iframe URL 및 동일한 도메인을 공유하는 상위 URL에서 가장 잘 작동합니다. 그러나 iframe 내부의 페이지에서 CSS를 사용 하여이 작업을 수행 할 수 있다고 지적합니다.
OG 숀

8

다른 도메인 iframe CSS 재정의

SimpleSam5의 답변 중 일부를 사용하여 몇 가지 Tawk의 채팅 iframe 으로이 작업을 수행했습니다 ( 사용자 정의 인터페이스 는 훌륭하지만 추가 사용자 정의가 필요했습니다).

휴대 기기에 표시되는이 특정 iframe에서 기본 아이콘을 숨기고 배경 이미지 중 하나를 배치해야했습니다. 나는 다음을 수행했다.

Tawk_API.onLoad = function() {
// without a specific API, you may try a similar load function
// perhaps with a setTimeout to ensure the iframe's content is fully loaded
  $('#mtawkchat-minified-iframe-element').
    contents().find("head").append(
     $("<style type='text/css'>"+
       "#tawkchat-status-text-container {"+
         "background: url(https://example.net/img/my_mobile_bg.png) no-repeat center center blue;"+
         "background-size: 100%;"+
       "} "+
       "#tawkchat-status-icon {display:none} </style>")
   );
};

나는 Tawk의 도메인을 가지고 있지 않으며 이것이 나를 위해 일했기 때문에 동일한 부모 도메인이 아닌 경우 에도이 작업을 수행 할 수 있습니다 ( Sam의 대답에 대한 Jeremy Becker의 의견 에도 불구하고 ).


18
나는 Tawk 사람들이 명시 적으로 허용했기 때문에 이것이 효과가 있다고 생각합니다.
Lawyerson

@CPHPython 어쩌면 당신이 나를 도울 수 있습니다. 이것 좀 봐 : stackoverflow.com/questions/60923168/…
Success Man

7

이 코드는 바닐라 JavaScript를 사용합니다. 새로운 <style>요소를 만듭니다 . 해당 요소의 텍스트 내용을 새 CSS를 포함하는 문자열로 설정합니다. 그리고 해당 요소를 iframe 문서의 머리에 직접 추가합니다.

var iframe = document.getElementById('the-iframe');
var style = document.createElement('style');
style.textContent =
  'body {' +
  '  background-color: some-color;' +
  '  background-image: some-image;' +
  '}' 
;
iframe.contentDocument.head.appendChild(style);

7
Blocked a frame with origin xxxxxxxxx from accessing a cross-origin frame.작동하지 않을까 걱정됩니다
Mike

1

iframe을 호스팅하는 페이지와 iframe의 페이지를 제어하는 ​​경우 쿼리 매개 변수를 iframe에 전달할 수 있습니다.

호스팅 사이트가 모바일인지 아닌지에 따라 iframe에 클래스를 추가하는 예제는 다음과 같습니다.

iFrame 추가하기 :

var isMobile=$("mobile").length; //detect if page is mobile
var iFrameUrl ="https://myiframesite/?isMobile=" + isMobile; 

$(body).append("<div id='wrapper'><iframe src=''></iframe></div>");
$("#wrapper iframe").attr("src", iFrameUrl ); 

iFrame 내부 :

//add mobile class if needed
var url = new URL(window.location.href);
var isMobile = url.searchParams.get("isMobile");
if(isMobile == "1") {
    $("body").addClass("mobile");
}

어쩌면 당신이 나를 도울 수 있습니다. 이것을보십시오 : stackoverflow.com/questions/60923168/…
성공 남자

0

나는이 블로그를 그리고 내 포함 된 요지의 크기를 조정하는 방법을 찾는 데 문제를 많이했다. 포스트 관리자는 텍스트 작성, 이미지 배치 및 HTML 코드 삽입 만 허용합니다. 블로그 레이아웃은 반응이 빠릅니다. Wix로 만들어졌습니다. 그러나 임베디드 HTML은 그렇지 않습니다. 생성 된 iFrame의 본문 내부에서 구성 요소의 크기를 조정하는 것이 불가능한 방법에 대해 많이 읽었습니다. 그래서, 여기 내 제안이 있습니다 :

iFrame 내부에 하나의 구성 요소 (즉, 요지) 만있는 경우 요지의 크기 만 조정할 수 있습니다. iFrame은 잊어 버리십시오.

뷰포트, 다른 사용자 에이전트에 대한 특정 레이아웃에 문제가 있었고 이것이 내 문제를 해결했습니다.

<script language="javascript" type="text/javascript" src="https://gist.github.com/roliveiravictor/447f994a82238247f83919e75e391c6f.js"></script>

<script language="javascript" type="text/javascript">

function windowSize() {
  let gist = document.querySelector('#gist92442763');

  let isMobile = {
    Android: function() {
        return /Android/i.test(navigator.userAgent)
    },
    BlackBerry: function() {
        return /BlackBerry/i.test(navigator.userAgent)
    },
    iOS: function() {
        return /iPhone|iPod/i.test(navigator.userAgent)
    },
    Opera: function() {
        return /Opera Mini/i.test(navigator.userAgent)
    },
    Windows: function() {
        return /IEMobile/i.test(navigator.userAgent) || /WPDesktop/i.test(navigator.userAgent)
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

  if(isMobile.any()) {
    gist.style.width = "36%";
    gist.style.WebkitOverflowScrolling = "touch"
    gist.style.position = "absolute"
  } else {
    gist.style.width = "auto !important";
  }
}

windowSize();

window.addEventListener('onresize', function() {
    windowSize();
});

</script>

<style type="text/css">

.gist-data {
  max-height: 300px;
}

.gist-meta {
  display: none;
}

</style>

논리는 사용자 에이전트를 기반으로 요지 (또는 구성 요소) CSS를 설정하는 것입니다. 쿼리 선택기에 적용하기 전에 먼저 구성 요소를 식별하십시오. 응답 성이 어떻게 작동하는지 자유롭게 살펴보십시오 .


-3

아마도 지금 변경되었지만이 요소와 함께 별도의 스타일 시트를 사용했습니다.

.feedEkList iframe
{
max-width: 435px!important;
width: 435px!important;
height: 320px!important;
}

임베디드 YouTube iframe의 스타일을 성공적으로 지정 하려면 ... 이 페이지의 블로그 게시물을 참조하십시오 .


4
이 링크가 질문에 대한 답변을 제공 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다.
Shaiful Islam

4
이것은 iFrame 요소 자체에만 적용됩니다. 질문은 iFrame 컨텐츠에 대해 구체적으로 묻습니다. 현재 CSS만으로는 변경할 수 없습니다.
pwdst

@ShaifulIslam은 정확히 무슨 일이 일어 났는지입니다. Rending Tims는 쓸모가 없습니다.
Alex Foxleigh

-24

iframe 페이지의 본문에 ID (또는 원하는 경우 수업)를 제공하십시오.

<html>
<head></head>
<body id="myId">
</body>
</html>

그런 다음 iframe 페이지에서도 CSS의 배경을 지정하십시오.

#myId {
    background-color: white;
}

이상하다. Firebug가있는 페이지에 추가하면 솔루션이 작동하지만 페이지의 일반 CSS 파일에 있으면 작동하지 않습니다. 이것은 'iFrame 내의 페이지를 편집해야한다고 가정합니다'라는 의견의 일부일 수 있습니까? 나는 당신이 그 의미를 이해하지 못했습니다. 감사합니다
jd6699 2016 년

즉, 귀하가 귀하의 사이트와 귀하의 통제하에 iFrame에로드하는 페이지입니까? 또는 외부 사이트에서 제공되어 해당 ID / 클래스를 포함하도록 소스를 편집 할 수 없습니다.
mikeq

내 사이트에서 가져온 것이지만 편집기에서 수행 한 것처럼 가져온 마크 업을 쉽게 변경할 수 없습니다.
jd6699

추신 : 기본 페이지에 i = "myId"를 추가하는 것이 아니라 iFrame 내의 페이지에 추가하는 것을 의미했습니다. 이렇게하면 iFrame 페이지의 본문을 기본 페이지와 다른 스타일로 타겟팅 할 수 있습니다. 또한 iFrame 페이지에서 CSS 파일을 참조하고 있습니다. iFrame에로드 된 페이지를 완전히 독립된 페이지로 취급해야합니다. 해당 페이지 만 웹 브라우저에로드하면 올바른 스타일이 있습니까?
mikeq

실제로 '페이지'가 편집기가 사용하는 전체 페이지가 아닌 위치는 확실하지 않습니다. 도와 주셔서 감사합니다.이 모든 것이 어떻게 작동하는지 이해합니다.
jd6699
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.