Utilisation de CSS pour affecter le style div dans iframe

Réponses:

117

Vous avez besoin de JavaScript. C'est la même chose que dans la page parent, sauf que vous devez préfixer votre commande JavaScript avec le nom de l'iframe.

N'oubliez pas que la même politique d'origine s'applique, vous ne pouvez donc le faire que pour un élément iframe provenant de votre propre serveur.

J'utilise le framework Prototype pour le rendre plus facile:

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

ou

frame1.$('mydiv').addClassName('withborder')
Diodée - James MacFarlane
la source
2
voir ma question, c'est similaire stackoverflow.com/questions/1962707/… mais ne pouvons-nous pas changer de style si le cadre provient d'un autre serveur?
Jitendra Vyas,
16
C'est exact. Le contenu Iframe est soumis à la politique du même domaine. S'il s'agit de votre domaine, vous pouvez le contrôler, sinon, vous êtes verrouillé. Cela empêche toutes sortes de détournements de pages basés sur Iframe.
Diodeus - James MacFarlane
2
Pas exactement une solution "CSS uniquement", mais assez bonne pour moi. +1
Nicu Surdu
2
Ce n'est pas CSS.
stramin
103

Bref non.

Vous ne pouvez pas appliquer CSS à du HTML chargé dans un iframe, sauf si vous avez le contrôle sur la page chargée dans l'iframe en raison de restrictions de ressources inter-domaines.

mmattax
la source
55
C'est vrai, mais
n'aidez
est-ce que cela vient d'arriver en 2018? Je me souviens que j'avais l'habitude de configurer le style de l'iframe venu de l'extérieur. J'ai essayé d'appliquer le CSS à l'iframe rendu par le script mais cela ne fonctionne toujours pas.l
Võ Minh
46

Oui. Jetez un œil à cet autre fil pour plus de détails: Comment appliquer CSS à 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
la source
4
frame1 est-il l'identifiant de l'iframe ??
Toni Michel Caubet
5
Oui, frame1 est l'id de l'iframe.
Eugene Rosenfeld
3
Ce n'est pas du CSS.
stramin
4
cela, nous ne pouvons pas le faire si nous chargeons un domaine différent dans iframe.
Sunith Saga
frame1est le nom iframe, pas l'ID
joseantgv
14

Vous pouvez récupérer le contenu d'un iframepremier, puis utiliser des jQuerysélecteurs contre eux comme d'habitude.

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

Bonne chance!

Riyaz Hameed
la source
11
ne fonctionne pas: Uncaught DOMException: Impossible de lire la propriété 'contentDocument' de 'HTMLIFrameElement': Bloqué un cadre avec l'origine " HOST " d'accéder à un cadre d'origine croisée.
tubbo
@tubbo, dans votre cas, vous ne pouvez pas intégrer de sites non autorisés empêchés par XSS. C'est seulement pour ceux qui recherchent leurs propres problèmes, pas pour les hackers: p
Riyaz Hameed
10

La réponse rapide est: non, désolé.

Ce n'est pas possible en utilisant simplement CSS. Vous devez essentiellement contrôler le contenu de l'iframe afin de le styliser. Il existe des méthodes utilisant javascript ou la langue Web de votre choix (que j'ai lue un peu, mais que je ne connais pas bien) pour insérer dynamiquement certains styles nécessaires, mais vous auriez besoin d'un contrôle direct sur le contenu iframe, qui sonne. comme vous n'en avez pas.

Justin Lucente
la source
8

Utilisez Jquery et attendez que la source soit chargée, voici comment j'ai réalisé (intervalle angulaire utilisé, vous pouvez utiliser la méthode 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);
Priyank Gupta
la source
1
pourquoi n'utilisez-vous pas l'événement chargé iframe?
ProllyGeek
3

probablement pas la façon dont vous pensez. l'iframe devrait également figurer <link>dans le fichier css. ET vous ne pouvez pas le faire même avec javascript si c'est sur un domaine différent.

Al W
la source
Pouvez-vous éventuellement donner un exemple de la façon dont cela peut être fait? Voulez-vous dire quelque chose comme <iframe src="/source" link=css-stylesheet:"/css.css">?
Ant
3

Apparemment, cela peut être fait via jQuery:

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

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

adamj
la source
3
Vous ne pouvez plus l'utiliser à cause de la même politique d'origine dans le navigateur Chrome. Le message d'erreur:Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame.
Mohammad AlBanna
@adamj, pouvons-nous changer la feuille de style de remplacement de l'élément iframe? si oui, veuillez ajouter le script.
Super Model
2

Une sorte de façon hack-ish de faire les choses, comme l'a dit Eugene. J'ai fini par suivre son code et créer un lien vers mon CSS personnalisé pour la page. Le problème pour moi était que, avec une chronologie Twitter, vous devez contourner Twitter pour remplacer son code par smidgen. Nous avons maintenant une chronologie glissante avec notre CSS, une police IE plus grande, une hauteur de ligne appropriée et la barre de défilement cachée pour des hauteurs supérieures à leurs limites.

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
la source
1

Ajoutez simplement ceci et tout fonctionne bien:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
Wahab Ahmed
la source
Je ne sais pas si c'est la bonne réponse à la question donnée, mais c'était une excellente solution pour redimensionner le formulaire Google à la largeur de l'appareil, merci beaucoup!
shiftyscales
0

Oui, c'est possible bien que lourd. Vous devez imprimer / faire écho au code HTML de la page dans le corps de votre page, puis appliquer une fonction de changement de règle CSS. En utilisant les mêmes exemples donnés ci-dessus, vous utiliseriez essentiellement une méthode d'analyse pour trouver les divs dans la page, puis lui appliquer le CSS, puis la réimprimer / l'écho à l'utilisateur final. Je n'ai pas besoin de cela, donc je ne veux pas coder cette fonction dans chaque élément du CSS d'une autre page Web juste pour aphtply.

Références:

Eric wiedemann
la source
La question demande spécifiquement "en utilisant CSS uniquement". Dans cet esprit, votre réponse est fausse.
Serj Sagan
Ce n'est pas CSS.
stramin
0

Combiner les différentes solutions, c'est ce qui a fonctionné pour moi.

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

Pas possible du côté client. Une erreur javascript s'affichera "Erreur: Autorisation refusée d'accéder à la propriété" document "" car l'Iframe ne fait pas partie de votre domaine. La seule solution est de récupérer la page à partir du code côté serveur et de modifier le CSS nécessaire.

Chdid
la source
2
Cette réponse est correcte dans son contenu mais concerne JavaScript alors que la question concerne CSS. La réponse peut être que vous devez utiliser JavaScript, mais vous ne le dites pas. La réponse suppose également que le contenu de l'iFrame provient d'un domaine différent, ce qui n'est pas toujours le cas. Enfin, le message exact variera d'un navigateur à l'autre.
pwdst du