Element mit CSS display: none; brechen layout - Versatz verursacht
Habe ich ein Standard-Menü, das aus horizontal ausgerichtet Liste (<li>
), die jeweils mit einem Symbol, Bild und text:
Einer der <li>
enthält ein extra-Bild mit display: none;
so, dass das Symbol kann ein - /ausgeschaltet werden (aus einer grünen eine rote Paprika, in diesem Beispiel.
Das problem ist, dass es nicht korrekt ausgerichtet auf einigen Browsern, wie Sie im obigen Bild. Mein Verständnis war, dass im Gegensatz zu visibilty: hidden;
ein element mit display: none;
sollte sich nicht auf die position eines anderen Elementes und Rendern soll, als wenn es nicht da ist?
Den Browsern, wo es nicht richtig gerendert wird, sind Google Chrome und Safari - aber nur auf MacOS(!?) und IE7 (ich weiß, ich weiß...) auf Windows. Jeder andere browser /OS-Kombination, die ich getestet habe, funktioniert einwandfrei.
Hier die HTML-Ausgabe:
<ul class="menu">
<li><img alt="Green Pepper" src="/green.png">li</li>
<li><img alt="Green Pepper" src="/green.png">li</li>
<li><img alt="Green Pepper" src="/green.png">li</li>
<li id="change">
<img alt="Red Pepper" src="/red.png" style="display: none;">
<img alt="Green Pepper" src="/green.png">
li
</li>
<li><img alt="Green Pepper" src="/green.png">li</li>
</ul>
Hier die CSS:
.menu li {
cursor: default;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10pt;
list-style-type: none;
position: relative;
text-align:center;
margin: 0 0 0 -25px;
padding: 8px 0 0 0;
width: 144px;
height: 35px;
display: inline-block;
background-image: url(../bct-white.png);
background-repeat: no-repeat;
color: #0091c1;
}
Sowie für die icon-Bilder:
.menu img {
display: inline;
vertical-align: -25%;
padding-right: 6px;
}
Habe ich auch schon um einen browser hack für den IE7, weil es nicht erkennen, inline-block, das kommt von einem separaten stylesheet basierend auf einer bedingten import (<!--[if lte IE 7]>
):
.menu li {
zoom: 1;
display: inline;
}
Obwohl, natürlich, der Stil ist nicht geladen, auf Chrome und Safari, unabhängig von OS, so kann nicht die Ursache von meinem Problem auf Macs.
Ich weiß, die Schnellste Lösung wäre die Umgestaltung der HTML-und der JavaScript-manipulation der ein - /ausblenden der icons, aber ich würde wirklich gerne wissen, was dieses Problem verursacht und wie es zu lösen.
Update
Hab ich verfolgte die Ursache nach unten. Im Grunde, das element Stil display: none;
auf die <img>
element überschreibt die inline
von der .menu img
Regel. Entfernen, dann Umschalten zwischen block
und inline
können Sie das Problem zu reproduzieren. Das ist offensichtlich ein browser-bug, und zwar das element wird nicht angezeigt, dass ein in-line-oder block-element sollte keine Auswirkung auf das layout.
jsFiddles
Problem mit Chrome und Safari nur auf Macs
Problem mit extra CSS-Datei für IE7 nur
Hinweis! Für mich, der Fiddle-Seite nicht ordnungsgemäß geladen wurde mit IE7, aber den direkten link für die Ergebnis-iFrame http://fiddle.jshell.net/z4dU7/3/show/
Bounty update!!!
Habe ich geschrieben man fix unten, aber es tatsächlich bringt das gleiche layout problem im IE9! Bitte fühlen Sie sich frei zu entwickeln oder zu verbessern, auf meine Antwort oder kommen Sie an den Tisch mit etwas ganz anderes! 🙂
- Ich denke, wir müssen dies in Aktion zu sehen, um der Lage sein, um Ihnen zu helfen. Ich habe eine schnelle fiddle und konnte nicht reproduzieren dieses Verhaltens — display:none entfernt das Bild aus dem layout (wie es sollte). Vielleicht
#change
hat einige andere Stile angewendet? - Diese Geige demo ist es im IE7: jsfiddle.net/z4dU7/3 Zu sehen, die Ausgabe auf dem Mac, entfernen Sie einfach die Letzte Stil-Regel (das ist gezogen aus einem IE-spezifischen Stylesheet auf meinem system).
- Ich aktualisiert meine Frage mit links zu beiden Szenarien.
- Das erste Beispiel sieht OK in meinem chrome/mac: imgur.com/nYgBIG0 oder bin ich etwas fehlt?
- Möchten Sie vielleicht zu prüfen, mit hintergrund-Bilder sowieso, dass Sie nie Einfluss auf den visuellen Fluss.
- Seltsam - das ist genau so, wie es angezeigt werden soll. Perfekt in einer Linie mit dem vorsätzlichen überlappen. Funktioniert es korrekt im Safari auch für Sie?
- In meiner tatsächlichen Umgebung, die Menü-Tasten jeweils den gleichen hintergrund haben, aber die icons unterscheiden sich für jedes und haben einen negativen Kontrast mit dem blauen hintergrund.
- Safari: gleiche (er sieht richtig)
- Ich würde Zustimmen, mit David, die hintergrund-Bilder wäre die bessere Lösung. Nicht nur, dass es keine Auswirkungen auf Ihr layout, aber es ist auch semantisch richtig: Sie wollen nicht, um zu zeigen, ein Bild, sondern eine Art von Dekoration.
- Ich Stimme David zu, setzen Sie die Bilder auf einen hintergrund ist eine bessere Lösung.
- Erklären Sie bitte, was ist falsch mit meiner Frage?
- Ich habe aktualisiert mein hintergrund-Bild-Methode, um stärker ähneln Weizen waren Sie für ein shooting finden Sie unter aktualisieren
- Ihre Geige scheint rendering fein in Chrome/Safari auf OSX für mich, keine details über die browser-version?
- Sorry hätte es schlug noch, aber ich bin faul und ich will nicht alle Lesen die Antworten.Wenn Ihr Punkt ist, der zum Umschalten der Bild , ich nehme an, es ist irgendeine Art von Aktion des Benutzers, die brennen es. Warum nicht einfach das Bild ändern des src-Attributs, sobald diese Aktion erfolgt mit javascript ? Da es keine weiteren versteckten Bild, sollte das problem verschwunden sein, habe ich Recht ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schrott Ansatz und Verwenden Sie Hintergrund-Bilder
http://jsfiddle.net/P5CKC/2/
CSS
CSS2.0 und browser-Kompatibilität
Code-Anwendung, die ich zur Verfügung gestellt haben, ist Css2.0 und sollte damit problemlos in IE7 und höher.
img
tags und implemmented ästhetik (Bilder) als hintergrundspan
musste Hinzugefügt werden, weil CSS2 erlaubt nur 1 Hintergrundbild pro elementid="change"
zuclass="change"
. Es sei denn, Sie sind 100% sicher, dass Sie nur noch ein #element verändern, verwenden Sie eine Klasse. Dies ist ein reines styling-und es verhindert, dass Sie aus zwei Menü Listen auf der gleichen Seite.Entfernt top-Polsterung und erhöht die Höhe. Also deine li-Elemente die gleiche Höhe, ABER dann Hinzugefügt
line-height: 35px
-> dies ist der beste Weg, um vertikal text zentrieren. Utlizing top-Polsterung funktioniert, aber es ist anfällig für schlechte browser-Inkonsistenzen.Ändern
li
Elemente zu Wagen. Gefloateten Elemente sind die IE7-freundliche Methode! Sogar der IE6 wird nicht bug aus, aber ich habe nicht diese alte version zum testen Ihrer Webseite. FYI - ul.Menü habenoverflow: hidden
klar, das schwimmt.Es sei denn, man verändert die Standardeinstellungen, können Sie halten diese zwei Eigenschaften aus. cursor sollte Standard sein. Position: relative ist unnötig - Sie sind nicht mit absoluter Positionierung oder irgendetwas, dass gewährleistet sein muss. Nun, Sie können diese in Ihrer Erklärung. Ich möchte nur code so "schlank" wie möglich.
abschließende Worte:
Werfen Sie einen Blick auf mein CSS. Beachten Sie, wie ich
ul.menu
alle meine Erklärung. Sie wollen sich in die Gewohnheit, die doign die gleichen; dies bietet dem Entwickler einen Einblick auf das, was der HTML aussieht und-noch wichtiger - Ihre css nicht bekommen overrided wenn Sie sich entscheiden, fügen Sie<div class=menu>
später auf. Besonders.menu img
würde gelten zu jedem image-tag innerhalb des Menü div.Okay - das ist es. Lassen Sie mich wissen, wenn es irgendwelche clarfications.
FYI - zu sehen, wie diese Frage hat ein Kopfgeld, wenn Sie mir die hintergrund-Bilder kann ich polnische meinen code an Ihre Bedürfnisse 100% - vielleicht laden Sie Sie in ein edit deiner Antwort.
<img>
s für das layout ist wie mit<table>
s für das layout.Gibt es Leerzeichen zwischen den Elementen. Keines der anderen Elemente der Liste habe, die Leerzeichen. Entfernen Sie alle Leerzeichen zwischen die Elemente und sehen, ob das Ihr problem behebt.
Wenn es das tut, es bedeutet nur, dass Ihr HTML-parsing der Inhalte Ihrer
<li>
als ein Zeilenumbruch - und das wäre, warum Sie sehen ein Problem. Um dieses Problem zu lösen, wickeln Sie den text in Ihrem<li>
mit einem<span>
. Wenn Ihr browser parst HTML-es wird automatisch trim Leerzeichen zwischen HTML-tags und automatisch das Problem beheben (ohne Formatierung)Dies ist seltsam, aber ich konnte neu das Problem in Firefox v22. Das wirklich seltsame daran war, dass in der jsFiddle wenn ich einfach auf "Aufräumen" und drücken Sie dann die "Run" und das problem war gelöst. Als Matthew R erwähnt dies ist wahrscheinlich aufgrund der zusätzlichen Leerraum entfernt wird.
Gebrochen:
Aufräumen, Ausführen und Feste
Hier ist eine Alternative Methode, bei der Hintergrundbilder:
Beispiel
Ich denke, Ihr Problem ist mit der
box model
unddisplay:inline-block
. Wenn ichdisplay:inline-block
im horizontalen Menüs, ich nutze auch ein klarer fix, für die Eltern undfloat:left;
mit den Kindern.In diesem Beispiel wird der css, habe ich einige Werte in der
.menu
vererbt werden können und ichoverflow:hidden;
an-Adresse die klare beheben. Dann habe ichfloat:left;
imli
zwingen Sie Sie fest und vermeiden Sie jegliche seltsam Abstand, verursacht durch die Browser-Standardeinstellungen. Und dann änderte ich dievertical-align
Wertmiddle
für das Bild. Wenn erdisplay:none;
mitinline
, es sah alles korrekt zu mir. Habe ich nicht getestet, in allen Browsern aufgeführt. Ich habe auch das erste Stück der CSS gibt es für diecss reset
, die möglicherweise redundant, aber ich finde es immer nützlich, auf JSFiddle.background-image
...Zur Behebung der (Darstellung der) das Problem zu beheben, ändern Sie die vertikale Ausrichtung der Icons im Menü enthalten sind:
Auf den betroffenen Browser, das weitere Bild (mit
display: none;
) wurde die Veränderung der Höhe des enthaltenden Elements. Einstellung der<img>
zudisplay: none;
bedeutete, dass diedisplay: inline;
Einstellung nicht mehr angewendet und wurde in Position unter dem ersten Bild.Nur mit den extra
<img>
Anzeige in-line-Updates der vertikalen Ausrichtung, aber offensichtlich nicht das Problem zu beheben, da das Bild muss versteckt werden, ohne ändern der position des Textes.Dieses Update ändert die vertikale Ausrichtung von einem Prozentsatz (-25%) auf eine Feste position, wodurch keine (unechte) Unterschiede in der Höhe des enthaltenden Elements. Ich habe dann legen Sie den oberen Rand des Bildes, um den gewünschten Abstand vom oberen Rand des Elements.
Update
Dieses Update bricht die Anzeige im IE9 - gleiche Aussehen wie IE7 ohne dieses Update.
Du einen Fehler gemacht mit dem line-height
statt 35px geben 23px
überprüfen Sie die Ausgabe
jsfiddle-link