8 Stimmen

Saubere CSS-Fehlerbehebung des "float: right"-Fehlers im IE7

Ich habe immer wieder Probleme mit rechts schwebenden Elementen im IE7.

Ich habe viele Stack Overflow-Fragen gelesen, die dieser ähnlich sind, aber es scheint keine einheitlich sauberen CSS-Antworten zu geben.

Was ich damit meine, ist, dass ich Antworten sehen möchte, die Ändern Sie NICHT den HTML-Code . z.B:

  • Das schwebende Element zuerst einfügen
  • Fügen Sie ein "clear: both"-Div nach dem schwebenden Element hinzu.

Ich verstehe, dass das schwimmende Element manchmal nicht die Höhe seiner Eltern berücksichtigt und es daher manchmal nicht richtig enthält. Gelegentlich ertappe ich mich dabei, dass ich einem Element mit Zoom "Layout" hinzufüge: 1, was das Problem manchmal behebt. Andere Male finde ich mich durcheinander in einem bedingten IE7-Stylesheet, die nicht die beste Lösung meiner Meinung nach ist.

Anmerkung: Was ich mit "Layout haben" meine - http://www.satzansatz.de/cssd/onhavinglayout.html

Ich habe auch andere Antworten gelesen, die sich auf die relative und absolute Positionierung beziehen (übergeordnetes Div bzw. untergeordnetes Div). Dies zieht es nach oben, aber oft wirkt sich auf umliegende divs.

Ich würde gerne ein Kopfgeld auf diese Frage aussetzen, wenn jemand eine ausführliche Erklärung der Gründe für dieses Problem und eine detaillierte Diskussion über die verschiedenen Abhilfemaßnahmen geben kann, IDEALERWEISE NUR CSS!

Vielen Dank!

EDIT

Das häufigste Problem, auf das ich stoße, ist, wenn ich so etwas habe:

Linke Seitenleiste - Hauptleiste - Rechte Seitenleiste

Die rechte Seite fällt oft ab, wenn sie schwebt. Idealerweise sollte dies im Format Links - Rechts - Haupt sein, aber ich ertappe mich immer wieder dabei, dass ich die Arbeit von Entwicklern (hauptsächlich Drupal) stylen muss, wo dies der Fall ist, und es ist zu mühsam, sie dazu zu bringen, ihre Arbeit zu ändern. Macht das Sinn? Da ich die Arbeit von Entwicklern gestalte, setzen sie auch nie den klaren Block ein (was ich persönlich sowieso für schrecklich und schmutzig halte!)

23voto

ScottS Punkte 70280

Einführung

Ihr Titel deutet darauf hin, dass Sie sich eine Lösung für die float: right Drop-Bug, aber Ihr Text impliziert einen weiter gefassten Wunsch nach Lösungen für "Probleme mit Elementen, die im IE7 rechts schweben". Es gibt viele allgemeine Probleme mit schwebenden Elementen ( right ou left ) in diesem Browser. Auch wenn man sich fragen kann, ob die Unterstützung des IE7-Browsers noch viel Aufmerksamkeit verdient, so wird sie doch zweifellos für einige Leute noch einige Zeit lang bestehen bleiben. Deshalb möchte ich hier die Gelegenheit nutzen, um gleich mehrere Fragen zu Floats in diesem Browser anzusprechen. Beachten Sie, dass viele der folgenden Experimente und Verweise aus einer hervorragenden Quelle stammen: http://www.brunildo.org/test/index.html .

CSS für das enthaltende Element

Für ein übergeordnetes Element, das das schwebende Element enthält, sollte das folgende Css gesetzt werden:

.container {
    overflow: auto; /* forces clearing of the child float */
    zoom: 1; /* give it layout (this can be some other css that does likewise) */
}

Sicherzustellen, dass es hasLayout ist wichtig, um Arten von Margin und Padding Fehler zu verhindern, eine Art von peek-a-boo Bug, und damit die overflow zu löschen. Bei einer Folge von Schwebekörpern muss möglicherweise etwas html geändert werden, wenn padding auf dem Container ist erwünscht, um richtig zu funktionieren.

In Bezug auf ein "Tropfen"-Problem mit einem float: right können Sie es vermeiden, eine explizite height ou max-height auf dem Container. A min-height ist in Ordnung. Einstellung einer height und dann die float größer als der Container sein, führt dazu, dass der IE7 die folgenden Elemente nicht berücksichtigt. Es gibt keine reine css-Lösung, die ich gefunden habe, festgestellt.

Wenn der Container selbst position: absolute kann es Probleme mit der Positionierung eines Floats geben, die es erforderlich machen, dass der Float selbst auf position: absolute statt in der Schwebe zu sein.

Referenzen:

CSS für das schwebende Kind

Für ein schwebendes Kindelement ist die css (neben float: right ) zu setzen, hängt von zwei Dingen ab:

Absoluter Container

Auch hier gilt, wie oben erwähnt, dass ein enthaltender Elternteil, der absolute kann eine Änderung des Umgangs mit dem Kind erforderlich machen.

Float ist auch ein Clearing-Element

Wenn die float wird auch eine clear dann gibt es zahlreiche Probleme, die ganz von der jeweiligen Situation abhängen. html y css der sie umgebenden Elemente. Es gibt keine einzige kanonische Lösung, daher sollten Sie sich die nachstehenden Referenzen ansehen.

Referenzen:

CSS für Kindelemente des Containers vor dem Float

Wenn die float: right folgt auf ein Element in der html Struktur, die sich links davon (und nicht darüber) befinden sollte, dann muss das vorhergehende Element bzw. müssen die vorhergehenden Elemente float: left .

CSS für Kindelemente von Container nach dem Float

Ein klares Element

Für ein Element nach die float Das hat clear gesetzt, dann hat sie, wenn sie padding und background-color zu verwenden, stellen Sie sicher, dass es auchLayout hat, um eine Verdoppelung der padding ; auch dies verhindert zusätzlichen Raum über dem clear wegen des Containers padding und vermeidet andere margin Probleme.

Referenzen:

Ein Absatz vor einem eindeutigen Element

Ein Absatz mit einem margin-bottom und kürzer in der Höhe als die float die sich zwischen dem schwebenden Element und einem Clearing-Element befindet, kann eine zusätzliche Lücke zwischen dem clear und die float gleich dem margin . Es gibt keine bekannte reine CSS-Lösung, außer dem Absatz einen unteren Rand von Null zu geben (was möglicherweise nicht akzeptabel ist, wenn der Absatz höher als der float ist).

Referenz:

Schlussfolgerung

Ich kann nicht garantieren, dass ich alle Probleme angesprochen habe, die bei einem Objekt mit rechtem Schwebezustand auftreten können, aber sicherlich werden viele wichtige Probleme behandelt. Was "warum" diese Dinge passieren, ist es alle "Bugginess` in IE7.

1voto

Stefan Burt Punkte 181

Haben Sie versucht, die Clearfix-Lösung für kollabierende Divs zu verwenden? Es gibt Variationen davon und es gibt eine neuere Version, aber ich habe die URL nicht zur Hand, aber das ist Standard-CSS von clearfix, das Sie dem übergeordneten Element hinzufügen, das kollabiert und Probleme mit schwebenden Elementen verursacht http://www.webtoolkit.info/css-clearfix.html . Chris Coyer hat hier eine bessere Version http://css-tricks.com/snippets/css/clear-fix/ .

Sie sagen: "Ich verstehe, dass manchmal das schwimmende Element nicht für seine Eltern Höhe Konto und daher manchmal nicht richtig enthalten" das ist irgendwie wahr, wird die Muttergesellschaft zusammenbrechen, wenn alle untergeordneten Elemente schwimmend sind. Dies ist darauf zurückzuführen, dass die Elemente aus dem normalen Fluss entfernt werden. Wenn dies geschieht, kann das übergeordnete Element seine Höhe nicht berechnen und kollabiert, als ob sich nichts innerhalb des Elements befindet.

Aber ohne zu sehen, die Seite und das Problem, das Sie haben, kann ich nur schätzen, dass das Problem aufgrund IE6-IE7's haslayout Eigenschaft, die wirklich ärgerlich ist, sie sortiert es von Version 8 aufwärts, aber es fügt zusätzliche Entwicklungszeit zu Ihrem Build.

In den meisten Fällen ist jedoch die Clearfix-Lösung am besten geeignet, da sie der Seite kein zusätzliches Markup hinzufügt, wie z. B.

<div style="clear: both"></div> 

ist alt und veraltet und sollte vermieden werden.

Ich hoffe, das hilft Ihnen. Wenn Sie weitere Informationen benötigen oder ich Ihre Frage nicht beantwortet habe, fragen Sie einfach.

0voto

Silviu-Marian Punkte 8937

Wir verwenden die Clearfix-Lösung schon seit Jahren.

.cf:after { content: "."; display: block; clear: both; visibility: hidden; line-height: 0; height: 0; }
.cf { display: inline-block; }
html[xmlns] .cf { display: block; }
* html .cf { height: 1%; }

Dies ist eine einfache CSS-Klasse, die idealerweise auf einen Container mit untergeordneten Float-Elementen angewendet werden sollte. Da Sie den HTML-Code nicht ändern wollen, können Sie entweder:

  1. ersetzen alle Vorkommen von .cf mit dem Selektor Ihres eigenen Divs [oder]
  2. JS verwenden, um die Klasse anzuwenden (was schlecht ist, weil die Benutzer einige Sekunden lang ein kaputtes Layout sehen werden, bis die Seite vollständig geladen ist) [oder]
  3. PHP verwenden ob_start() + Regex zur Anwendung der Klasse [oder]
  4. einfach alles mit Hilfe von Tabellen neu schreiben (wie wir es in den 90er Jahren gemacht haben)

0voto

Rustam Punkte 1835

Das ist ganz einfach:

Wo haben Sie float:right , hinzufügen *clear:left . Oder wo Sie haben float:left , hinzufügen *clear:right .

* für IE7-

Oder zur Validierung *+html .class{clear:left/right}

0voto

Tom Greever Punkte 653

Ich weiß, es ist schon ein Jahr her, dass dieser Beitrag veröffentlicht wurde, aber ich habe eine Lösung gefunden, die mir gefällt. Das Wesentliche ist die Verwendung von "Ausdruck" Tag in Ihrem CSS für IE7 nur auf das schwebende Element zu verschieben, um das erste Element des Elternteils in der DOM sein. Für alle anderen Browser ist dies semantisch korrekt, aber für IE7 ändern wir das DOM, um das schwebende Element zu verschieben.

In meinem Fall ist das der Fall:

<div>
    <h1></h1>...<p>any other content...</p>
    <small class="pull-right"></small>
</div>

In meinem CSS für pull-right, verwende ich:

.pull-right {
    float:right;
    *zoom: ~"expression( this.runtimeStyle.zoom='1',parentNode.insertBefore( this,parentNode.firstChild ))";
}

Das Ergebnis ist, dass der IE7 meine <small> zum ersten Element von <div> aber alle anderen Browser lassen das Markup in Ruhe.

Dies mag nicht für jeden funktionieren. Technisch gesehen wird das Markup geändert, aber nur im DOM für IE7 und es ist auch eine Javascript-Lösung.

Auch verstehe ich, es kann einige Leistungsprobleme mit Ausdruck (es ist langsam), so vielleicht ist es nicht ideal gibt es eine Menge von Floats wie diese. In meinem Fall funktionierte es gut und erlaubte mir, semantisch korrekten HTML zu halten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X