Використання CSS для впливу на стиль div всередині iframe


266

Чи можливо змінити стилі div, який знаходиться всередині iframe на сторінці, використовуючи лише CSS?

css  iframe 


Відповіді:


117

Вам потрібен JavaScript. Це те саме, що робити це на батьківській сторінці, за винятком того, що ви повинні префіксувати свою команду JavaScript іменем iframe.

Пам'ятайте, що застосовується та ж політика щодо джерела, тому ви можете це зробити лише для елемента iframe, який надходить з вашого власного сервера.

Я використовую рамку Prototype, щоб полегшити:

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

або

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

2
дивіться на моє запитання, це схоже на stackoverflow.com/questions/1962707/…, але чи не можемо ми змінити стиль, якщо фрейм - з іншого сервера?
Джитендра Вяс

16
Це правильно. Вміст Iframe підпадає під політику того ж домену. Якщо це з вашого домену, ви можете керувати ним, якщо ні, ви заблоковані. Це запобігає викрадення сторінок на основі iframe.
Діод - Джеймс Макфарлейн

2
Не зовсім рішення "лише для CSS", але досить добре для мене. +1
Ніку Сурду

2
Це не CSS.
страйм

103

Коротше кажучи ні.

Ви не можете застосувати CSS до HTML, завантаженого у кадр, якщо у вас немає контролю над завантаженою в iframe сторінці через обмеження міжресурсових ресурсів.


55
Це правда, але насправді не допомагайте людям наводити приклад того, як це робити
Саймон Драгсбек

це щойно придумали у 2018 році? Я пам’ятаю, що я налаштовував стиль iframe, що надходить ззовні. Я спробував застосувати css до iframe, який було зроблено сценарієм, але це не працює.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
є frame1 ідентифікатором iframe ??
Тоні Мішель Каубе

5
Так, frame1 - ідентифікатор iframe.
Євген Розенфельд

3
Це не CSS.
страйм

4
цього ми не можемо зробити, якщо ми завантажуємо різний домен у iframe.
Саніт Сага

frame1це ім'я 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
не працює: Uncaught DOMException: Не вдалося прочитати властивість 'contentDocument' з 'HTMLIFrameElement': заблоковано кадр з початковим кодом " HOST " від доступу до кадру перехресного походження.
tubbo

@tubbo, у вашому випадку ви не можете вбудовувати несанкціоновані сайти, захищені від XSS. Це лише для тих, хто шукає власних проблем, а не хакерів: p
Riyaz Hameed

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.
Mohammad AlBanna

@adamj, Чи можемо ми змінити аркуш стилю елемента iframe? якщо так, будь ласка, додайте сценарій.
Super Model

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. Використовуючи ті самі приклади, що наведені вище, ви, по суті, використовуєте метод розбору знаків, що знаходяться на сторінці, а потім застосуйте до нього CSS, а потім передрукуйте / повторіть його кінцевому користувачеві. Мені це не потрібно, тому я не хочу кодувати цю функцію в кожен елемент CSS іншої веб-сторінки просто для аплікації.

Список літератури:


Питання конкретно задає "лише за допомогою CSS". Зважаючи на це, ваша відповідь неправильна.
Серж Саган

Це не CSS.
страйм

0

Поєднуючи різні рішення, саме це працювало для мене.

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

-1

Неможливо з боку клієнта. Буде піднята помилка javascript "Помилка: Дозволено заборонено в доступі до" властивостей "" "документа, оскільки Iframe не є частиною вашого домену. Єдине рішення - отримати сторінку з коду сторони сервера та змінити необхідний CSS.


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