Переопределить стиль тела для содержимого в iframe
Как я могу контролировать фоновое изображение и цвет элемента body внутри iframe
? Обратите внимание: встроенный элемент body имеет класс, а iframe
- это страница, которая является частью моего сайта.
Причина, по которой мне это нужно, это то, что мой сайт имеет черный фон, назначенный телу, а затем белый фон, назначенный для div, содержащих текст. Редактор WYSIWYG использует iframe
для встраивания контента при редактировании, но он не включает div, поэтому текст очень трудно читать.
Тело iframe
когда в редакторе имеет класс, который не используется нигде, поэтому я предполагаю, что это было помещено туда, поэтому такие проблемы можно было бы решить. Однако, когда я применяю стили к class.body
они не переопределяют стили, применяемые к телу. Странно то, что стили появляются в Firebug, поэтому я не знаю, что происходит!
Спасибо
UPDATE. Я пробовал решение @mikeq добавить стиль к классу, который является классом body. Это не работает при добавлении в таблицу стилей главной страницы, но она работает при добавлении Firebug. Я предполагаю, что это связано с тем, что Firebug применяется ко всем элементам страницы, тогда как CSS не применяется в iframe. Означает ли это, что добавление css после загрузки окна с помощью JavaScript будет работать?
Ответы
Ответ 1
Iframe - это "дыра" на вашей странице, которая отображает другую веб-страницу внутри нее. Содержимое iframe не имеет какой-либо формы или не является частью вашей родительской страницы.
Как указывали другие, ваши варианты:
- предоставить файл, который загружается в iframe, необходимый CSS
- если файл в iframe принадлежит к тому же домену, что и ваш родитель, то вы можете получить доступ к DOM документа в iframe от родителя.
Ответ 2
Нижеследующее работает только в том случае, если содержимое iframe относится к одному и тому же родительскому домену.
Следующий сценарий jquery работает для меня. Протестировано в Chrome и IE8. Внутренний iframe ссылается на страницу, которая находится в том же домене, что и родительская.
В этом конкретном случае я скрываю элемент со специальным классом во внутреннем iframe.
В принципе, вы просто добавляете элемент "style" в "head" внутреннего iframe.
$('iframe').load( function() {
$('iframe').contents().find("head")
.append($("<style type='text/css'> .my-class{display:none;} </style>"));
});
Ответ 3
Вы не можете изменить стиль страницы, отображаемой в iframe, если у вас нет прямого доступа и, следовательно, права собственности на исходные файлы html и/или css.
Это означает, что XSS (Скрипты для кросс-сайтов)
Ответ 4
An iframe
имеет другую область видимости, поэтому вы не можете получить к ней доступ к стилю или изменить его содержимое с помощью javascript.
В основном это "другая страница".
Единственное, что вы можете сделать, это отредактировать свой собственный CSS, потому что с вашим глобальным CSS вы ничего не можете сделать.
Ответ 5
Переопределить другой домен iframe
CSS
Используя часть SimpleSam5 answer, я достиг этого с помощью нескольких фреймов чата Tawk (их интерфейс настройки, но мне нужны дальнейшие настройки).
В этом конкретном iframe, который появляется на мобильных устройствах, мне нужно было скрыть значок по умолчанию и поместить одно из моих фоновых изображений. Я сделал следующее:
Tawk_API.onLoad = function() {
// without a specific API, you may try a similar load function
// perhaps with a setTimeout to ensure the iframe 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, и это сработало для меня, поэтому вы можете это сделать, даже если оно не из одного и того же родительского домена (несмотря на комментарий Джереми Беккера Сэм отвечает).
Ответ 6
В этом коде используется ванильный 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
Если у вас есть контроль над страницей, на которой размещается 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");
}
Ответ 8
У меня есть блог, и мне было очень трудно выяснить, как изменить размер встроенной сущности. Почтовый менеджер позволяет только писать текст, размещать изображения и вставлять HTML-код. Макет блога сам по себе отзывчивый. Он построен с Wix. Однако встроенного HTML нет. Я много читал о том, как невозможно изменить размеры компонентов внутри тела сгенерированных фреймов. Итак, вот мое предложение:
Если у вас есть только один компонент внутри вашего 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>
Логика состоит в том, чтобы установить gist (или ваш компонент) css на основе пользовательского агента. Убедитесь, что сначала идентифицировали свой компонент, прежде чем применять к селектору запросов. Не стесняйтесь посмотреть, как работает отзывчивость.
Ответ 9
Возможно, теперь это изменилось, но я использовал отдельную таблицу стилей с этим элементом:
.feedEkList iframe
{
max-width: 435px!important;
width: 435px!important;
height: 320px!important;
}
чтобы успешно внедрить встроенные iframe iframe... см. сообщения в блогах на этой странице.
Ответ 10
дайте телу вашей страницы iframe идентификатор (или класс, если хотите)
<html>
<head></head>
<body id="myId">
</body>
</html>
затем, также на странице iframe, назначьте фон тому в CSS
#myId {
background-color: white;
}