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')

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.


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); 

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!


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.


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);

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.


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


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

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">

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:


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

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.