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.

Sehen Sie sich hier eine Demo an: http://jsbin.com/icili5

  • @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.

Hier ist ein Beispiel:

#close
    {
        position: relative;
        float: left;
        margin-top: 50vh;
        margin-left: -100px;
        z-index: 2;
    }

#dialog
    {
        height: 100vh;
        width: 100vw;
        position: relative;
        overflow: scroll;
        float: left;
    }

<body> 
    <div id="dialog">
    ****
    </div>

    <div id="close"> </div>
</body>

  • 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

Benutzer-Avatar
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


Benutzer-Avatar
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>

Arbeitsbeispiel

*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

  • Es funktioniert jetzt in Chrome und Firefox. Hier ist ein Beispiel. codepen.io/anon/pen/ZOqrYo

    – Patrick McElhaney

    5. August 2016 um 19:14 Uhr


  • 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

Benutzer-Avatar
Lohit Bisen

Versuchen Position: klebrig auf dem übergeordneten div des Elements, das Sie reparieren möchten.

Mehr Infos hier: http://html5-demos.appspot.com/static/css/sticky.html.
Vorsicht: Überprüfen Sie die Kompatibilität der Browserversion.

  • Es funktioniert jetzt in Chrome und Firefox. Hier ist ein Beispiel. codepen.io/anon/pen/ZOqrYo

    – Patrick McElhaney

    5. August 2016 um 19:14 Uhr


  • 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

Benutzer-Avatar
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.

https://codepen.io/rafaqf/pen/MNqWKB

<div class="body">
  <div class="content">
    <p>Some content...</p>
    <div class="top-wrapper">
      <a class="top">Top</a>
    </div>
  </div>
</div>

.content {
  width: 600px; /*change this width to play with the top element*/
  background-color: wheat;
  height: 9999px;
  margin: auto;
  padding: 20px;
}
.top-wrapper {
  width: 100%;
  display: flex;
  justify-content: flex-end;
  z-index: 9;
  .top {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 60px;
    height: 60px;
    border-radius: 100%;
    background-color: yellowgreen;
    position: fixed;
    bottom: 20px;
    margin-left: 100px;
    cursor: pointer;
    &:hover {
      opacity: .6;
    }
  }
}

1311820cookie-checkCSS-Position: in einem positionierten Element fixiert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy