Używanie CSS do wpływania na styl div wewnątrz iframe

Odpowiedzi:

117

Potrzebujesz JavaScript. Jest to to samo, co robienie tego na stronie nadrzędnej, z tym że musisz poprzedzić komendę JavaScript nazwą iframe.

Pamiętaj, że obowiązują te same zasady pochodzenia, więc możesz to zrobić tylko dla elementu iframe, który pochodzi z twojego serwera.

Używam frameworka Prototype , aby ułatwić:

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

lub

frame1.$('mydiv').addClassName('withborder')
Diodeus - James MacFarlane
źródło
2
zobacz moje pytanie, to jest podobne stackoverflow.com/questions/1962707/... ale czy nie możemy zmienić stylu, jeśli ramka pochodzi z innego serwera?
Jitendra Vyas
16
To jest poprawne. Treść iframe podlega zasadom tej samej domeny. Jeśli pochodzi z Twojej domeny, możesz ją kontrolować, jeśli nie, jesteś zablokowany. Zapobiega to wszelkiego rodzaju przejmowaniu stron przez iframe.
Diodeus - James MacFarlane
2
Nie do końca rozwiązanie „tylko CSS”, ale dla mnie wystarczająco dobre. +1
Nicu Surdu
2
To nie jest CSS.
stramin
103

W skrócie nie.

Nie możesz zastosować CSS do HTML ładowanego w ramce iframe, chyba że masz kontrolę nad stroną ładowaną w ramce iframe z powodu ograniczeń zasobów między domenami.

mmattax
źródło
55
To prawda, ale tak naprawdę nie pomagaj ludziom dawać przykładu
Simon Dragsbæk
czy to właśnie pojawi się w 2018 roku? Pamiętam, że kiedyś konfigurowałem styl iframe pochodzący z zewnątrz. Próbowałem zastosować css do elementu iframe renderowanego przez skrypt, ale nadal nie działa. L
Võ Minh
46

Tak. Spójrz na ten inny wątek, aby uzyskać szczegółowe informacje: Jak zastosować CSS do iframe?

var cssLink = document.createElement("link");
cssLink.href = "style.css";  
cssLink.rel = "stylesheet";  
cssLink.type = "text/css";  
frames['frame1'].document.body.appendChild(cssLink); 
Eugene Rosenfeld
źródło
4
czy frame1 jest identyfikatorem iframe?
Toni Michel Caubet
5
Tak, frame1 jest identyfikatorem iframe.
Eugene Rosenfeld,
3
To nie jest CSS.
stramin
4
nie możemy tego zrobić, jeśli ładujemy inną domenę w ramce iframe.
Saga Sunith
frame1to nazwa iframe, a nie ID
joseantgv
14

Możesz pobrać zawartość iframepierwszego, a następnie jQueryjak zwykle użyć przeciwko nim selektorów.

$("#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)); });

Powodzenia!

Riyaz Hameed
źródło
11
nie działa: Nieprzechwycony DOMException: Nie można odczytać właściwości „contentDocument” z „HTMLIFrameElement”: Zablokowano ramce z początkiem „ HOST ” dostęp do ramki krzyżowej.
tubbo
@tubbo, w twoim przypadku nie możesz osadzać nieautoryzowanych stron, którym nie można zapobiec z XSS. To jest tylko dla tych, którzy szukają własnych problemów, a nie hakerów: p
Riyaz Hameed
10

Szybka odpowiedź brzmi: nie, przepraszam.

Nie jest możliwe użycie tylko CSS. Zasadniczo musisz mieć kontrolę nad treścią iframe, aby nadać jej styl. Istnieją metody wykorzystujące javascript lub wybrany przez Ciebie język internetowy (o którym trochę czytałem, ale nie znam się), aby dynamicznie wstawiać niektóre potrzebne style, ale potrzebujesz bezpośredniej kontroli nad zawartością iframe, którą brzmi jak ty nie masz.

Justin Lucente
źródło
8

Użyj Jquery i poczekaj, aż źródło zostanie załadowane. Oto jak osiągnąłem (Używając interwału kątowego, możesz użyć metody setInterval javascript):

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);
Priyank Gupta
źródło
1
dlaczego nie używasz zdarzenia załadowanego iframe?
ProllyGeek
3

prawdopodobnie nie tak, jak myślisz. iframe musiałby również <link>w pliku css. I nie możesz tego zrobić nawet z javascript, jeśli jest w innej domenie.

Al W.
źródło
Czy możesz podać przykład, jak to zrobić? Masz na myśli coś takiego <iframe src="/source" link=css-stylesheet:"/css.css">?
Ant
3

Najwyraźniej można to zrobić za pomocą jQuery:

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

https://stackoverflow.com/a/13959836/1625795

Adam
źródło
3
Nie możesz już tego używać z powodu tej samej zasady pochodzenia w przeglądarce Chrome. Komunikat o błędzie:Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
Mohammad AlBanna
@adamj, Czy możemy zmienić arkusz stylów zastępowania elementu iframe? jeśli tak, uprzejmie dodaj skrypt.
Super Model,
2

Rodzaj hackerskiego sposobu robienia rzeczy jest taki, jak powiedział Eugene. Skończyło się na tym, że podążyłem za jego kodem i linkowałem do mojego niestandardowego CSS strony. Problemem było dla mnie to, że przy osi czasu Twittera musisz zrobić trochę bocznego śledzenia Twittera, aby zastąpić ich kod smidgen. Teraz mamy toczącą się oś czasu z naszym css do niej, IE Większa czcionka, odpowiednia wysokość linii i ukrywanie paska przewijania dla wysokości większych niż ich ograniczenia.

var c = document.createElement('link');
setTimeout(frames[0].document.body.appendChild(c),500); // Mileage varies by connection. Bump 500 a bit higher if necessary
Cole Busby
źródło
1

Wystarczy dodać to i wszystko działa dobrze:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
Wahab Ahmed
źródło
Nie jestem pewien, czy to poprawna odpowiedź na zadane pytanie, ale było to świetne rozwiązanie, aby zmienić rozmiar formularza Google na szerokość urządzenia, wielkie dzięki!
shiftyscales
0

Tak, jest to możliwe, choć uciążliwe. Musisz wydrukować / powtórzyć kod HTML strony w treści strony, a następnie zastosować funkcję zmiany reguły CSS. Korzystając z tych samych przykładów, które podano powyżej, zasadniczo użyłbyś metody parsowania, aby znaleźć div na stronie, a następnie zastosować CSS, a następnie ponownie wydrukować / wysłać echo użytkownikowi końcowemu. Nie potrzebuję tego, więc nie chcę zakodować tej funkcji w każdym elemencie CSS innej strony internetowej, żeby to zrobić.

Bibliografia:

eric wiedemann
źródło
Pytanie dotyczy w szczególności „tylko CSS”. Mając to na uwadze, twoja odpowiedź jest błędna.
Serj Sagan,
To nie jest CSS.
stramin
0

Łącząc różne rozwiązania, to działało dla mnie.

$(document).ready(function () {
    $('iframe').on('load', function() {
        $("iframe").contents().find("#back-link").css("display", "none");
    }); 
});
Rami Alloush
źródło
-1

Niemożliwe ze strony klienta. Zostanie zgłoszony błąd javascript „Błąd: odmowa dostępu do właściwości„ dokumentu ””, ponieważ element iframe nie jest częścią domeny. Jedynym rozwiązaniem jest pobranie strony z kodu po stronie serwera i zmiana wymaganego CSS.

Chdid
źródło
2
Ta odpowiedź jest poprawna w swojej treści, ale dotyczy JavaScript, natomiast pytanie dotyczy CSS. Odpowiedź może być taka, że ​​musisz używać JavaScript, ale tego nie mówisz. Odpowiedź zakłada również, że treść w ramce iFrame pochodzi z innej domeny, co nie zawsze ma miejsce. Wreszcie dokładny komunikat różni się w zależności od przeglądarki.
pwdst