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.