Использование CSS для влияния на стиль div внутри iframe


266

Можно ли изменить стили div, который находится внутри iframe на странице, используя только CSS?

css  iframe 


Дополнительная информация о CORS : wikipedia.org/wiki/Content_Security_Policy and developer.mozilla.org/docs/Web/HTTP/CORS
ashleedawg

Ответы:


117

Вам нужен JavaScript. Это то же самое, что и на родительской странице, за исключением того, что перед командой JavaScript необходимо указать имя iframe.

Помните, что применяется та же политика происхождения, что вы можете сделать это только с элементом iframe, который поступает с вашего собственного сервера.

Я использую инфраструктуру Prototype, чтобы сделать это проще:

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

или

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

2
Посмотрите мой вопрос, он похож на stackoverflow.com/questions/1962707/… но мы не можем изменить стиль, если frame с другого сервера?
Джитендра Вьяс

16
Это верно. На содержание Iframe распространяется политика того же домена. Если это из вашего домена, вы можете контролировать его, если нет, вы заблокированы. Это предотвращает все виды взлома страниц на основе Iframe.
Диодей - Джеймс Макфарлейн

2
Не совсем "CSS only" решение, но достаточно хорошее для меня. +1
Нику Сурду

2
Это не CSS.
Страмин

103

Короче нет.

Вы не можете применить CSS к HTML, который загружен в iframe, если у вас нет контроля над страницей, загруженной в iframe из-за ограничений междоменного ресурса.


55
Это правда, но на самом деле не помогает людям привести пример того, как это сделать
Саймон Драгсбек

это только придумать в 2018 году? Я помню, что я использовал для настройки стиля iframe приходят извне. Я пытался применить CSS к iframe, который отрисован с помощью скрипта, но он все еще не работает.
Вы Минь

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
frame1 это идентификатор iframe ??
Тони Мишель Коубет

5
Да, frame1 - это идентификатор iframe.
Евгений Розенфельд

3
Это не CSS.
Страмин

4
этого мы не можем сделать, если загружаем другой домен в iframe.
Сунит Сага

frame1это имя iframe, а не ID
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
не работает: Uncaught DOMException: не удалось прочитать свойство 'contentDocument' из 'HTMLIFrameElement': заблокирован фрейм с источником " HOST " от доступа к фрейму перекрестного происхождения.
бубен

@tubbo, в вашем случае вы не можете вставлять неавторизованные сайты, запрещенные XSS. Это только для тех, кто ищет свои проблемы, а не для хакеров: p
Рияз Хамид

10

Быстрый ответ: нет, извините.

Это невозможно, используя только CSS. В основном вам нужно контролировать содержимое iframe, чтобы его стилизовать. Существуют методы, использующие javascript или предпочитаемый вами веб-язык (о котором я немного читал, но не знаком с самим собой) для динамической вставки некоторых необходимых стилей, но вам потребуется прямой контроль над содержимым iframe, которое звучит как у тебя нету.


8

Используйте Jquery и дождитесь загрузки источника. Вот как я этого добился (использовал угловой интервал, вы можете использовать javascript метод setInterval):

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 загруженное событие?
ProllyGeek

3

вероятно, не так, как вы думаете. iframe тоже должен быть <link>в файле css. И вы не можете сделать это даже с JavaScript, если он находится в другом домене.


Можете ли вы привести пример того, как это можно сделать? Вы имеете в виду что-то подобное <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.
Мохаммед АльБанна

@adamj, мы можем изменить таблицу стилей перезаписи элемента iframe? Если да, пожалуйста, добавьте скрипт.
Супер модель

2

Как сказал Юджин, что-то вроде хакерского поведения. Я закончил тем, что следовал его коду и связывался с моим собственным Css для страницы. Проблема для меня заключалась в том, что, используя временную шкалу твиттера, вы должны обходить щебет, чтобы переопределить их код smidgen. Теперь у нас есть скользящая временная шкала с нашим css, шрифтом IE Larger, правильной высотой строки и скрытой полосой прокрутки для высоты, превышающей их пределы.

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». Имея это в виду, ваш ответ неверен.
Серж Саган

Это не CSS.
страмин

0

Комбинируя различные решения, это то, что сработало для меня.

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

-1

Невозможно со стороны клиента. Будет выдано сообщение об ошибке «Ошибка: в доступе к свойству« документ »отказано в доступе», поскольку Iframe не является частью вашего домена. Единственное решение - извлечь страницу из кода на стороне сервера и изменить необходимый CSS.


2
Этот ответ верен по своему содержанию, но относится к JavaScript, тогда как вопрос относится к CSS. Ответ может заключаться в том, что вам нужно использовать JavaScript, но вы этого не говорите. Ответ также предполагает, что контент в iFrame принадлежит другому домену, что не всегда так. Наконец, точное сообщение будет варьироваться от браузера к браузеру.
pwdst
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.