Utilizzo dei CSS per influire sullo stile div all'interno di iframe


Risposte:


117

È necessario JavaScript. È lo stesso che farlo nella pagina principale, tranne per il fatto che è necessario aggiungere un prefisso al comando JavaScript con il nome dell'iframe.

Ricorda, si applica la stessa politica di origine, quindi puoi farlo solo su un elemento iframe che proviene dal tuo server.

Uso il framework Prototype per semplificare:

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

o

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

2
vedi questa mia domanda è simile stackoverflow.com/questions/1962707/… ma non possiamo cambiare stile se il frame proviene da un altro server?
Jitendra Vyas,

16
È corretto. Il contenuto di Iframe è soggetto alla politica dello stesso dominio. Se proviene dal tuo dominio, puoi controllarlo, in caso contrario, sei bloccato. Questo impedisce tutti i tipi di dirottamento di pagine basate su Iframe.
Diodeus - James MacFarlane,

2
Non esattamente una soluzione "solo CSS", ma abbastanza buona per me. +1
Nicu Surdu,

2
Questo non è CSS.
Stramin

103

In breve no.

Non è possibile applicare CSS a HTML caricato in un iframe, a meno che non si abbia il controllo sulla pagina caricata in iframe a causa delle restrizioni delle risorse tra domini.


55
Questo è vero, ma in realtà non aiuta le persone a dare un esempio di come
Simon Dragsbæk,

è appena arrivato nel 2018? Ricordo che configuravo lo stile di iframe proveniente dall'esterno. Ho provato ad applicare css a iframe reso dallo script ma non funziona.l
Võ Minh

46

Sì. Dai un'occhiata a quest'altra discussione per i dettagli: come applicare CSS a 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 è l'id dell'iframe ??
Toni Michel Caubet,

5
Sì, frame1 è l'id dell'iframe.
Eugene Rosenfeld,

3
Questo non è un CSS.
Stramin

4
questo non possiamo fare se stiamo caricando domini diversi in iframe.
Sunith Saga,

frame1è il nome iframe, non l'ID
joseantgv

14

È possibile recuperare i contenuti di un iframeprimo e quindi utilizzare jQueryselettori contro di loro come al solito.

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

In bocca al lupo!


11
non funziona: DOMException non rilevata: impossibile leggere la proprietà 'contentDocument' da 'HTMLIFrameElement': bloccato un frame con origine " HOST " dall'accesso a un frame di origine incrociata.
Tubbo,

@tubbo, nel tuo caso, non puoi incorporare siti non autorizzati impediti da XSS. Questo è solo per coloro che cercano i propri problemi, non gli hacker: p
Riyaz Hameed,

10

La risposta rapida è: no, scusa.

Non è possibile usare solo CSS. Fondamentalmente devi avere il controllo sul contenuto di iframe per dargli uno stile. Ci sono metodi che usano javascript o il tuo linguaggio web preferito (di cui ho letto un po ', ma non ho familiarità con me stesso) per inserire dinamicamente alcuni stili necessari, ma avresti bisogno di un controllo diretto sul contenuto iframe, che suona come non hai.


8

Usa Jquery e attendi il caricamento della fonte, ecco come ho raggiunto (Intervallo angolare usato, puoi usare il metodo 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
perché non usi l'evento iframe caricato?
ProllyGeek

3

probabilmente non è il modo in cui stai pensando. l'iframe dovrebbe trovarsi anche <link>nel file css. E non puoi farlo nemmeno con JavaScript se si trova su un dominio diverso.


Puoi forse fare un esempio di come farlo? Intendi qualcosa del genere <iframe src="/source" link=css-stylesheet:"/css.css">?
Formica

3

Apparentemente può essere fatto tramite 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
Non puoi più utilizzarlo a causa della stessa politica di origine nel browser Chrome. Il messaggio di errore:Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
Mohammad AlBanna,

@adamj, possiamo cambiare sovrascrivere il foglio di stile dell'elemento iframe? se sì, aggiungi gentilmente lo script.
Super Model

2

Una sorta di hack-ish di fare le cose è come ha detto Eugene. Ho finito per seguire il suo codice e il collegamento al mio CSS personalizzato per la pagina. Il problema per me era che, con una sequenza temporale di Twitter, devi fare un po 'di elusione di Twitter per sovrascrivere il loro codice come un smidgen. Ora abbiamo una linea temporale mobile con i nostri CSS, font IE più grande, altezza della linea corretta e rendendo la barra di scorrimento nascosta per altezze superiori ai loro limiti.

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

Basta aggiungere questo e tutto funziona bene:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">

non sono sicuro che questa sia la risposta corretta alla domanda data, ma è stata un'ottima soluzione per ridimensionare il modulo di Google in base alla larghezza del dispositivo, molte grazie!
shiftyscales,

0

Sì, è possibile anche se ingombrante. Dovresti stampare / fare eco al codice HTML della pagina nel corpo della tua pagina, quindi applicare una funzione di modifica delle regole CSS. Usando gli stessi esempi sopra riportati, useresti essenzialmente un metodo di analisi per trovare i div nella pagina, quindi applicare il CSS ad esso e quindi ristampare / riecheggiarlo per l'utente finale. Non ne ho bisogno, quindi non voglio codificare quella funzione in ogni elemento nel CSS di un'altra pagina Web solo per rispondere.

Riferimenti:


La domanda si pone specificamente "utilizzando solo CSS". Con questo in mente, la tua risposta è sbagliata.
Serj Sagan,

Questo non è CSS.
Stramin

0

Combinando le diverse soluzioni, questo è ciò che ha funzionato per me.

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

-1

Non possibile dal lato client. Verrà generato un errore javascript "Errore: autorizzazione negata per accedere al" documento "di proprietà poiché l'iframe non fa parte di Domaine. L'unica soluzione è recuperare la pagina dal codice lato server e modificare il CSS necessario.


2
Questa risposta è corretta nel suo "contenuto ma si riferisce a JavaScript mentre la domanda si riferisce al CSS. La risposta potrebbe essere che devi usare JavaScript ma non lo dici. La risposta presuppone anche che il contenuto di iFrame provenga da un dominio diverso, il che non è sempre il caso. Infine, il messaggio esatto varierà da browser a browser.
pwdst,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.