CSS-Position: in einem positionierten Element fixiert
Lesezeit: 4 Minuten
Ich habe ein positioniertes div, dessen Inhalt zu lang sein kann, sodass Bildlaufleisten angezeigt werden (overflow:auto einstellen). Es fungiert als Dialogfeld in einer Ajax-App. Ich möchte eine Schließen-Schaltfläche in der rechten oberen Ecke fixieren, damit der Benutzer beim Scrollen des Div nicht wegscrollt.
Ich habe es mit probiert position:fixed; right:0; top:0 aber es platzierte die Schaltfläche rechts oben auf der Seite nicht im div (in Firefox).
Ist es möglich, diese Schaltflächenplatzierung nur mit CSS durchzuführen, ohne bei jedem Scroll-Ereignis mit offsetWidth/Height in js zu hacken?
PS: Die Höhe und Breite des div ist kein fester Wert, sondern hängt von der Größe des Inhalts und der Größe des Browserfensters ab. Der Benutzer kann die Größe auch ändern, wenn er möchte.
Es könnte sich lohnen, ein div mit einem Hintergrundbild mit fester Position für die Schaltfläche zu verwenden.
– Nick Merrill
10. November 2013 um 19:48 Uhr
@NickM scheint eine gute Idee zu sein, aber wie würden Sie dann auf die Schaltfläche klicken?
– ithil
7. November 2014 um 8:51 Uhr
@ithil Solange die Höhe und Breite des div so eingestellt sind, dass sie mit dem Hintergrundbild übereinstimmen, sollte es anklickbar sein. So weit wie Handhabung der Klick, das hängt davon ab, ob Sie einfaches HTML oder JS verwenden. Wenn es sich nur um HTML handelt, könnten Sie das div in ein einschließen a Tag mit einem href (oder verwenden Sie einfach eine a Tag statt a div und setze es als display: inline-block). Wenn es sich um JS handelt, können Sie nach einem Klick auf das hören div. Habe ich deine Frage richtig verstanden?
– Nick Merrill
7. November 2014 um 19:10 Uhr
@NickM ja, ich glaube, du hast es getan, aber die Höhe und Breite werden auch mit JS “angepasst”, denke ich? Wie in der OP-Frage “Die Höhe und Breite des Div ist kein fester Wert”, habe ich mich deshalb gefragt
– ithil
7. November 2014 um 20:18 Uhr
@itil ich verstehe. Ich habe diesen Teil verpasst. In diesem Fall denke ich, dass Sie Recht haben, dass einige JS die Größe des div handhaben müssten.
– Nick Merrill
7. November 2014 um 22:21 Uhr
Du kannst den … benutzen position:fixed;aber ohne Satz left und top. Dann schieben Sie es mit nach rechts margin-leftum es an der gewünschten Position zu positionieren.
@Sotiris können Sie eine Referenz angeben, die erklärt, warum dies funktionieren sollte? Warum müssen Browser a positionieren fixed Element auf diese Weise, wenn top und left sind nicht angegeben? stackoverflow.com/questions/8712047/…
– Blinken
30. August 2012 um 5:07 Uhr
Ich habe das komplizierteste JS geschrieben, bis ich darüber gestolpert bin. Nett.
– kollin
19. Juni 2013 um 14:34 Uhr
Dies ist nicht das gewünschte Verhalten
– vsync
21. August 2013 um 14:06 Uhr
Ich stimme zu, dass dies nicht die Antwort ist. Es verarbeitet keine Container mit dynamischer Breite, wie in der Frage angegeben.
– dano
30. Januar 2014 um 20:57 Uhr
Nun, es ist das erste Mal, dass ich sehe, dass so viele Leute eine Frage auf dieser Seite völlig missverstehen.
– Ryan Bayne
3. März 2014 um 13:25 Uhr
Die aktuell gewählte Lösung scheint das Problem missverstanden zu haben.
Der Trick besteht darin, weder absolute noch feste Positionierungen zu verwenden. Stattdessen haben Sie die Schließen-Schaltfläche außerhalb des div mit seinem Position auf relativ gesetzt und ein linkes Gleitkomma, so dass es unmittelbar rechts vom div steht. Legen Sie als Nächstes einen negativen linken Rand und einen positiven z-Index fest, sodass er über dem div angezeigt wird.
Tolle Antwort, hat mich auf den Weg zu einer besseren Lösung gebracht, um ein Element in einem scrollbaren Div zu fixieren.
– RebelFist
21. Oktober 2015 um 18:19 Uhr
Damien Pirsy
Position:fixed gibt eine absolute Position bezüglich des BROWSER-Fensters an. da geht es natürlich hin.
Während position:absolute bezieht sich auf das übergeordnete Element, wenn Sie also Ihre platzieren <div> Schaltfläche innerhalb des <div> des Behälters sollte es dort positioniert werden, wo Sie es haben wollten. Etwas wie
BEARBEITEN: Dank @Sotiris, der einen Punkt hat, kann eine Lösung mit einer Position: fest und einem linken Rand erreicht werden. So was: http://jsfiddle.net/NeK4k/
Der Benutzer kann die Schließen-Schaltfläche wegscrollen, wenn ich absolute verwende (das war mein erster Versuch, bevor ich es versuchte, behoben.)
– Kalmarius
10. Februar 2011 um 20:48 Uhr
Sieht so aus, als ob jeder es falsch gelesen haben möchte, es auf dem Bildschirm zu behalten. In diesem Fall müssen Sie Javascript verwenden, um es in Bezug auf das betreffende div richtig zu positionieren, oder Javascript verwenden, um es richtig zu scrollen, während Sie position: absolute verwenden
– Dominik
10. Februar 2011 um 20:56 Uhr
Lebenshack
Ich weiß, dass dies ein alter Beitrag ist, aber ich hatte die gleiche Frage, fand aber keine Antwort, die das Element relativ zu einem übergeordneten Element festlegte div. Die Bildlaufleiste an medium.com ist eine großartige reine CSS-Lösung, um etwas einzustellen position: fixed; relativ zu einem übergeordneten Element anstelle des Ansichtsfensters (irgendwie *). Dies wird erreicht, indem das übergeordnete Element festgelegt wird div zu position: relative; und mit einer Knopfverpackung mit position: absolute; und der Knopf ist natürlich position: fixed; folgendermaßen:
<div class="wrapper">
<div class="content">
Your long content here
</div>
<div class="button-wrapper">
<button class="button">This is your button</button>
</div>
</div>
<style>
.wrapper {
position: relative;
}
.button-wrapper {
position: absolute;
right: 0;
top: 0;
width: 50px;
}
.button {
position: fixed;
top: 0;
width: 50px;
}
</style>
*Da feste Elemente nicht mit der Seite scrollen, ist die vertikale Position bei dieser Lösung immer noch relativ zum Ansichtsfenster, aber die horizontale Position ist relativ zum übergeordneten Element.
Anscheinend können CSS-Transformationen verwendet werden
“Die Eigenschaft ‘transform’ erstellt ein neues lokales Koordinatensystem am Element”,
aber … das ist nicht Cross-Browser, scheint nur Opera korrekt zu funktionieren
Danke @PatrickMcElhaney für dein Beispiel, das ist die Lösung, nach der ich gesucht habe 🙂
– c01gat3
2. März 2017 um 0:49 Uhr
Agapitocandemor
Ich habe es geschafft, ein Element mit einer festen Position (Wiewport) zu haben, aber relativ zur Breite seines übergeordneten Elements.
Ich musste nur mein festes Element umwickeln und dem übergeordneten Element eine Breite von 100% geben. Gleichzeitig befinden sich das umschlossene feste Element und das übergeordnete Element in einem div, dessen Breite sich je nach Seite ändert und den Inhalt der Website enthält. Mit diesem Ansatz kann ich das feste Element immer im gleichen Abstand zum Inhalt haben, je nach Breite dieses. In meinem Fall war dies eine „Nach oben“-Schaltfläche, die immer 15 Pixel von unten und 15 Pixel rechts vom Inhalt angezeigt wird.
Es könnte sich lohnen, ein div mit einem Hintergrundbild mit fester Position für die Schaltfläche zu verwenden.
– Nick Merrill
10. November 2013 um 19:48 Uhr
@NickM scheint eine gute Idee zu sein, aber wie würden Sie dann auf die Schaltfläche klicken?
– ithil
7. November 2014 um 8:51 Uhr
@ithil Solange die Höhe und Breite des div so eingestellt sind, dass sie mit dem Hintergrundbild übereinstimmen, sollte es anklickbar sein. So weit wie Handhabung der Klick, das hängt davon ab, ob Sie einfaches HTML oder JS verwenden. Wenn es sich nur um HTML handelt, könnten Sie das div in ein einschließen
a
Tag mit einemhref
(oder verwenden Sie einfach einea
Tag statt adiv
und setze es alsdisplay: inline-block
). Wenn es sich um JS handelt, können Sie nach einem Klick auf das hörendiv
. Habe ich deine Frage richtig verstanden?– Nick Merrill
7. November 2014 um 19:10 Uhr
@NickM ja, ich glaube, du hast es getan, aber die Höhe und Breite werden auch mit JS “angepasst”, denke ich? Wie in der OP-Frage “Die Höhe und Breite des Div ist kein fester Wert”, habe ich mich deshalb gefragt
– ithil
7. November 2014 um 20:18 Uhr
@itil ich verstehe. Ich habe diesen Teil verpasst. In diesem Fall denke ich, dass Sie Recht haben, dass einige JS die Größe des div handhaben müssten.
– Nick Merrill
7. November 2014 um 22:21 Uhr