Situation: Ich arbeite an einem responsiven Design, das die typische HTML/CSS-Kombination beinhaltet. Alles funktioniert gut, außer in einem Fall, wo ein iframe innerhalb eines divs vorhanden ist. Der Iframe sollte sich automatisch an die Größe des Elternteils anpassen. Eine rein CSS-Lösung hat sich nicht vorgestellt, also gehe ich mit einem JQuery-Ansatz. Es funktioniert gut, außer in einem Szenario, wenn die Größe von einer kleineren Breite zu einer größeren Bildschirmbreite geändert wird.Dynamisch skalieren iframe
HTML:
<div class="container">
<iframe class="iframe-class" src="http://www.cnn.com/"></iframe>
</div>
CSS:
.container {
width: 100%;
height: 250px;
}
.iframe-class {
width: 100%;
height: 100%;
border: 1px solid red;
overflow: auto;
}
Javascript:
$(function() {
setIFrameSize();
$(window).resize(function() {
setIFrameSize();
});
});
function setIFrameSize() {
var ogWidth = 700;
var ogHeight = 600;
var ogRatio = ogWidth/ogHeight;
var windowWidth = $(window).width();
if (windowWidth < 480) {
var parentDivWidth = $(".iframe-class").parent().width();
var newHeight = (parentDivWidth/ogRatio);
$(".iframe-class").addClass("iframe-class-resize");
$(".iframe-class-resize").css("width", parentDivWidth);
$(".iframe-class-resize").css("height", newHeight);
} else {
// $(".iframe-class-resize").removeAttr("width");
// $(".iframe-class-resize").removeAttr("height");
$(".iframe-class").removeClass("iframe-class-resize");
}
}
Problem: Da das Fenster kleiner Größe verändert wird, ist es die Fensterbreite kontinuierlich überprüft und, sobald es < 480 Pixel trifft, fügt der Code eine Klasse namens iframe-class-resize
und legt die Breite und Höhe dieser Klasse. Wenn das Fenster größer skaliert wird, entfernt es die Klasse, sobald die Größe 480 px erreicht. Das Problem besteht darin, dass die Attribute width und height direkt zum Element und nicht zur Klasse selbst hinzugefügt werden. Daher werden beim Entfernen der Klasse die neue Breite und Höhe nicht entfernt. Ich habe versucht, das Entfernen der Attribute mit removeAttr()
(kommentiert oben) zu erzwingen, aber das hat nicht funktioniert.
Wer weiß, wo der obige Code falsch gelaufen ist? Oder Vorschläge, wie Sie einen reaktionsfähigen iFrame effizienter erreichen können? Die wichtigsten Dinge, die erforderlich sind, sind, dass der Iframe innerhalb der <div></div>
und das Div muss nicht unbedingt eine Breite oder Höhe definiert haben. Im Idealfall sollte das übergeordnete div die Breite und Höhe explizit definiert haben, aber die Art, wie diese Site derzeit eingerichtet ist, ist nicht immer möglich.
Zusätzlich: Falls die oben nicht klar genug war, versuchen Sie folgendes um das Problem zu reproduzieren:
- einen Browser auf einem Desktop-Rechner öffnen. Ich verwende Chrome auf einem Windows-Computer. Maximiere den Browser nicht.
- Öffnen Sie die oben genannte Jfiddle (http://jsfiddle.net/TBJ83/). Sie werden feststellen, dass sich der Iframe-Inhalt über die gesamte Breite des Vorschaubereichs erstreckt.
- Ändern Sie die Breite manuell, bis das gesamte Fenster < 480px ist. An diesem Punkt wird der Iframe-Inhalt ziemlich klein sein.
- Ändern Sie die Breite manuell, bis das gesamte Fenster >> 480px groß ist. Das Ziel ist, dass der Iframe-Inhalt die gesamte Breite des Vorschaubereichs wieder erreicht. Stattdessen behält der Inhalt die geänderte Breite und Höhe bei, da die Funktion
.css()
CSS-Änderungen direkt auf Elemente und nicht auf die Klassen anwendet.
Vielen Dank im Voraus!
Dies funktionierte am besten für meine Situation. Vielen Dank! – jiminy
@jiminy Froh, zu helfen. Ehrlich gesagt hast du ziemlich gut mit deinem Code gearbeitet. Sie können einige Aufrufe verketten und '.css()' Aufrufe kombinieren, indem Sie ein Objekt übergeben. Sie können auch das Verhältnis einmal anstatt jeder Größenänderung berechnen und Ihren resize Event-Handler drosseln. Ansonsten sieht es ziemlich gut aus. Sie könnten vereinfachen, aber auf Kosten der Änderung Ihrer gesamten Methode, und die Einsparungen wären minimal. – Jasper
Ich weiß nicht, schauen Sie, wie viele jQuery Selektoren in diesem Code sind, wie 5. Das ist 5-mal Parsing durch das DOM, um diese Elemente zu finden. Ich habe meins aktualisiert, es tut nur 1 Selektor und benutzt dann das Objekt erneut. – gfrobenius