Alle Elemente in allen Browsern beginnen mit dem Standardwert für die Positionierung statisch. Sie werden diesen Wert selten in einer tatsächlichen Stylesheet sehen, daher ist das Wort vielleicht nicht sehr bekannt. Es ist auch gut so, denn das Wort selbst ist nicht sehr hilfreich, um zu verstehen, was es bedeutet. Sie könnten denken, dass es das Element klebrig macht, so wie wenn man einen Ballon an den Kopf reibt und ihn an die Wand klebt (statische Elektrizität). Eigentlich bedeutet es, dass das Element im normalen Dokumentenfluss fällt, im Gegensatz zu anderen Positionierungswerten, die das Element aus dem natürlichen Dokumentenfluss entfernen können.
Nehmen wir nun ein Element in seinem standardmäßigen statischen Zustand und machen es zu position: relative;. Was passiert? Allein durch die Änderung/Festlegung dieses Wertes passiert nichts. Es erscheint an genau derselben Stelle wie vor der Änderung. Was sich ändert, sind diese drei Dinge:
- Sie können nun die Position des Elements mit den Werten oben/rechts/unten/links verschieben. Der ursprüngliche Platz wird jedoch immer noch von dem Element eingenommen (als ob ein Geist des ursprünglichen Elements dort wäre und Platz einnehmen würde).
- Das Element wird nun die z-index-Eigenschaft berücksichtigen, die steuert, welche Elemente bei Überlappung oben erscheinen sollen.
- Wenn das Element Kindelemente hat, die absolut positioniert sind, sind diese nun absolut innerhalb des Kontexts dieses Elements positioniert.
Relative Positionierung *ermöglicht* also einige Funktionen und Eigenschaften, tut aber für sich genommen nicht viel. Was wäre also, wenn alle Elemente einfach mit position: relative; anstatt position: static; beginnen würden?
Vorteile
Wenn alle Elemente mit relativer Positionierung beginnen würden, hätten Sie alle drei oben genannten Punkte von Natur aus. Ihre oben/rechts/unten/links-Werte funktionieren wie erwartet. Z-index funktioniert auch "einfach". Der Positionierungskontext ist immer auf das nächste Elternelement beschränkt, was logisch sinnvoll ist.
Ich denke, insgesamt wird CSS verständlicher.
Nachteile
Besonders einschränkend ist die *ständige* Beschränkung des Positionierungskontextes auf das Elternelement. Nehmen wir an, Sie möchten ein Element oben rechts auf der Seite positionieren, unabhängig davon, wo das Element im Markup erscheint. Das wird schwierig, wenn das Element tief in der Hierarchie vergraben ist. Sie müssen den Positionierungskontext für jedes Elternelement zurücksetzen. Das bedeutet, sie auf position: static; zurückzusetzen und dabei alle Vorteile der relativen Positionierung zu verlieren. =(
Wenn die natürliche relative Positionierung jemals Realität würde, bräuchten wir meiner Meinung nach eine andere Methode zur Handhabung von Positionierungskontexten. Möglicherweise so wie
/* Not real code */
#parent-element {
context: inherit | pass | accept;
}
So machen wir es heute
Würde bedeuten
* {
position: relative;
}
Also…
Es wird wahrscheinlich nicht passieren. Dies wäre eine ziemlich heftige abwärtskompatible Änderung mit begrenzten/fragwürdigen Vorteilen. Es ist auch schwer zu sagen, was wir im Durchschnitt mehr tun würden: Position relativ setzen oder Positionierungskontexte zurücksetzen. Ich denke, es ist einfach interessant, darüber nachzudenken.
Das ist ein lustiger Gedanke. Es würde die meisten Fragen zu z-index beseitigen, das nicht funktioniert, wie Sie sagten. Ich weiß, es hätte mir Zeit gespart, mich zu fragen, warum einige Dinge nicht funktionierten, als ich mit dem Webdesign begann. Es wäre interessant, eine Seite so zu programmieren.
Ich hoffe, ich habe Sie missverstanden, aber würde position: absolute nicht immer noch etwas oben rechts auf der Seite positionieren?
Nein, es würde es positionieren, in der oberen rechten Ecke des Elternelements
.abs{
position: absolute;
right: 0px;
top: 0px;
z-index: 999;}
{div style=”position: relative”}
{div style=”position: relative”}
{div style=”position: relative”}
{div style=”position: relative”}
{div style=”position: static”}
{div class=”abs” }
{/div (X6)}
Kann das so funktionieren? Richtig?
Ich habe die Spezifikation nicht gelesen, aber darf ich fragen, wofür <position: fixed;&rt; ist?
Ich erinnere mich, dass es für solche Zwecke verwendet wurde... oder gibt es einen Unterschied zu 'absolute'?
@ danieldalu position fixed, hängt das Element am Browserfenster. Das bedeutet
.fixed {position:fixed; top:0; right:0;}Würde immer oben rechts im Fenster erscheinen, auch wenn der Benutzer scrollt.
@danieldalu
Ich stimme Jonathan zu, fixed position, wird das Element oben halten, auch wenn die Maus scrollt. Sie können die obere Leiste der Stackoverflow-Website sehen
Dieser Artikel hat mich dazu gebracht, mir http://www.w3.org/TR/CSS2/visuren.html#propdef-position noch einmal anzusehen
Die Definition von position:relative ist nicht so klar wie die drei von Ihnen genannten Dinge. Es ist, als ob CSS dazu geschaffen wurde, die Leute raten zu lassen, was jede CSS-Eigenschaft tun würde, und die Dinge selbst herausfinden zu lassen.
Das mag ich an CSS. Es erinnert mich ständig daran, wie ich als 12-Jähriger mit HTML angefangen habe und immer noch neue Programmiersprachen lerne. Es macht auch wirklich Spaß, jeden Tag neue Dinge über CSS und das DOM zu entdecken, mit denen ich herumspiele. Es ist wie eine magische Schatztruhe ohne Boden.
interessanter Gedanke
position: fixed wird wahrscheinlich relative Elternteile umgehen, wenn das Ihr Anliegen ist. Natürlich möchten Sie vielleicht nicht, dass das Element am Viewport klebt.
Auf den meisten mobilen WebKit-Browsern (Android, iOS) haben Sie sogar den Vorteil(?), dass Fixed aufgrund der Implementierung des Viewports identisch zu Absolute verhält. (Das macht mich wahnsinnig, übrigens). :P
Sie könnten auch JavaScript verwenden, um Elemente aus ihren relativen Eltern zu entfernen, wenn Sie sowohl Ihren semantischen Markup-Kuchen haben als auch ihn essen möchten.
Sehr interessante Diskussion. Ich denke, das weist auf einen Fehler in z-index hin.
Danke Chris. Als ich CSS zu lernen begann, hat mich das wirklich verwirrt. „Warum brauche ich position: relative?“ Damit Sie Kindelemente absolut positionieren und z-index verwenden können. „Ok... warum kann ich das nicht standardmäßig tun?“
Ihre Einblicke werden geschätzt.
Ich mache das lieber so
* {position:relative;}
und später, falls nötig, deklariere ich 'position: static' für das Elternelement oder 'z-index:99'...
Ungetestete Idee: Wenn Sie die Theorie einer "absoluten Fensterposition innerhalb eines relativ positionierten Elternelements" nutzen möchten, könnten Sie das Element nicht einfach mit JavaScript entfernen und dann wieder an den Body anhängen? Würden die Stile erhalten bleiben oder müsste dies auch gelöscht und dann neu angewendet werden?
Es ist hier 00:36 Uhr und ich denke vielleicht falsch über die ganze Sache nach, aber danke für den Artikel Chris und die schlaflose Nacht an alle anderen jetzt! ;-)
Gute Nacht ... hoffe ich!
Ja, das mache ich auch....
Ich mache das lieber so
und später, falls nötig, deklariere
position: staticfür das Elternelement oderz-index:99...Ich benutze das, um meine Projekte zu starten
div,ul,li { position:relative; }
Wenn ein anderes Element als relativ gesetzt werden muss, mache ich das manuell.
Was sind die kleinen Smiley/Smiley-Gesicht-Icons über diesem Thread? Sollen sie etwas tun?
Ich positioniere Dinge gerne NICHT basierend auf der Reihenfolge, in der sie im Markup erscheinen. Es scheint willkürlich, dass die Zeilennummer im HTML das Seitenlayout beeinflusst. Also ja, ich bleibe dabei, position: relative als bewusste Anforderung zu setzen, um die statische Positionierung beizubehalten.
Oder vielleicht bin ich es einfach gewohnt, das zu tun. Es ist eine interessante Sache zum Nachdenken. Etwas, das man nur hier auf css-tricks findet.
Jetzt, wo ich einen Kommentar hinterlasse, fällt mir auf, dass Sie früher Intense Debate oder Disqus für Ihre Kommentare verwendet haben. Warum sind Sie zu WP-Kommentaren zurückgekehrt? Nur neugierig.
Ich glaube, sie sind für "Besondere" und "Vergrabene" Kommentare.
Ja, ich habe vorher darüber nachgedacht, nachdem ich mich darüber geärgert habe, position:relative auf 90% meiner Blockelemente auf jeder Website zu deklarieren.
Ich persönlich denke, das ist alles persönliche Meinung. Ich persönlich benutze selten position absolute, um etwas weit außerhalb der Grenzen seines Elternelements zu positionieren. Daher wäre es für mich eine Zeitersparnis, wenn alle Divs standardmäßig als Position: relativ gesetzt wären.
Davon abgesehen erkenne ich, dass es andere gibt, die mehr Probleme damit hätten als ich. Also meh, jedem das Seine.
Ich begann mit der Verwendung von
* {position:relative;}
aber ich fand, dass es in älteren Browsern Probleme verursachte (insbesondere konnte IE6 nicht mehr scrollen... überhaupt nicht).
Seitdem habe ich damit begonnen
body * {position: relative;}
Das Beibehalten des html-Tags auf statisch schien die Cross-Browser-Kompatibilität erheblich zu verbessern.
Wenn dies die ursprüngliche Spezifikation gewesen wäre, hätten wir uns alle daran gewöhnt, aber wie bereits erwähnt, wäre das Positionieren von etwas oben links auf dem Bildschirm eine weitaus schwierigere Aufgabe, als es sein müsste, und in gewisser Weise kümmert sich die aktuelle Spezifikation um fast jeden Fall... Es wäre nicht unmöglich, wie Anna vorschlug,
body * { position: relative; }
um dies in Ihren Code zu integrieren.
Ich bin selbst kein Fan von Reset-Stylesheets, also würde ich das nicht tun, aber ich könnte sehen, wo dies Vorteile haben könnte... Wenn nur, um * { float: left; } auf Stylesheets zu verhindern! *schüttelt sich*
Vorsicht vor diesen IE-Fehlern! Wenn position relative innerhalb eines overflow: auto ist, wird es zu fixed und wenn float auf ein relatives Div trifft, bekommt man manchmal einen Peekaboo-Bug!
Interessante Idee. Ich mag es, weil ich denke, dass es verwirrend ist, wenn ein Element ohne Rücksicht auf sein Elternelement im Layout erscheint. z.B. wenn Sie keine nicht-statischen Vorfahren haben, ist ein position:absolute Element relativ (verwirrender Begriff) zum Body positioniert. Somit ist seine Position im DOM tatsächlich egal, Sie könnten es zum direkten Kind des Bodys machen oder es beliebig tief verschachteln.
Ich habe es als Best Practice betrachtet, einen absolut positionierten Block als direktes Kind des Knotens zu platzieren, der zur Festlegung seines Positionierungskontextes verwendet wird. Andere sind vielleicht anderer Meinung, aber diese Idee würde dasselbe fördern, also gebe ich ihr einen Daumen hoch.
Für mich ist die Verwendung von "position: relative" nicht notwendig, da die Dinge immer einfach sein müssen.
Schönes Konzept.
Nehmen wir an, wir haben ein System, bei dem alle Elemente standardmäßig position:relative erhalten.
Wir können ein Kindelement nicht mit position:absolute oben links auf der Seite platzieren, da seine Position standardmäßig auf die Grenzen des Elternelements beschränkt ist.
Was, wenn wir allen Elementen ein Verhalten hinzufügen könnten, so dass, wenn position:static auf die Kindelemente angewendet wird – sie dann aus dem relativen Käfig aller Elternelemente ausbrechen können!
Was sagen Sie dazu?
Stellen Sie sich vor, es gibt kein Statisch, es ist leicht, wenn man es versucht. Kein s unter uns, über uns, nur {style}s.
Ich meinte 'divs unter uns', aber es verschwand.
.pos{position:relative}verzerrt das Design nie, das stört auch nicht, wenn es nicht benötigt wird.So können wir dies immer verwenden, vielleicht anstelle von
.pos{position:static}..pos{position:fixed}hat seine eigene Bedeutung. Dafür gibt es keinen Ersatz (soweit ich weiß).Es gibt eine einfachere Version (des Codes). Ich hoffe, sie ist leichter zu verstehen.
http://cl.ly/05272M0M1O3s370V1J3q
Ja, das ist absolut leichter zu verstehen =)
Ich denke, mein Problem war, dass ich nicht daran gedacht habe, die Audioelemente direkt in die Menüpunkte einzufügen, bis später, also hatte ich all das Zeug über das Speichern einer Referenz mit Daten, also theoretisch könnte man sie einfach an den Body anhängen und sie würden immer noch funktionieren.
hmm sehr interessant. Thx! Ich werde das für unsere Website verwenden! Habe Ihren Platz als Lesezeichen markiert!
Toller Artikel, ich gestalte Webseiten seit ungefähr 5 Jahren mal mehr, mal weniger. Habe vor etwa 2 Monaten wieder damit angefangen, seitdem habe ich etwa ein halbes Dutzend Websites erstellt, mache gerade eine, und ich habe ungefähr zwei Stunden damit verbracht, mit dem position:-Tag jedes der Elemente herumzuspielen, um zu sehen, was sie tun usw. Es ist schwierig, sich an die Reihenfolge zu erinnern, in der die Dinge geschehen, also: absolut in relativ oder relativ in absolut, usw. Naja, ich bin sowieso immer verwirrt!
Nun, ich mag Ihre Seite wirklich sehr, sie ist so informativ und ich habe so viel daraus gelernt!
Ashley
Ich persönlich denke, das ist alles persönliche Meinung. Ich persönlich benutze selten position absolute, um etwas weit außerhalb der Grenzen seines Elternelements zu positionieren. Daher wäre es für mich eine Zeitersparnis, wenn alle Divs standardmäßig als Position: relativ gesetzt wären.
Anstatt
position: relativezum Standardfall zu machen, wäre es besser, wenn wir z-index auch fürposition: staticElemente anwenden könnten. Auf diese Weise erhalten wir den Vorteil von z-index, vermeiden aber dennoch das Zurücksetzen der Positionierungskontexte, wenn die Standardwerteposition: relativewären.