CSS position:fixed inside a positioned element

HtmlCssStylesheetPositioning

Html Problem Overview


I have a positioned div whose content can be too long so scrollbars appear (overflow:auto set). It functions as a dialog box in an ajax app. I want to fix a close button on it's right top corner so when the user scrolls the div it won't scroll away.

I tryed it with position:fixed; right:0; top:0 but it placed the button on the right top of the page not in the div (in firefox).

Is it possible to do this button placement using CSS only without hacking with the offsetWidth/Height in js on every scroll event?

ps: the div's height and width is not a fixed value it depends on the content's size and the browser window's size. User can also resize it if he want.

Html Solutions


Solution 1 - Html

You can use the position:fixed;, but without set left and top. Then you will push it to the right using margin-left, to position it in the right position you wish.

Check a demo here: http://jsbin.com/icili5

Solution 2 - Html

The current selected solution appears to have misunderstood the problem.

The trick is to neither use absolute nor fixed positioning. Instead, have the close button outside of the div with its position set to relative and a left float so that it is immediately right of the div. Next, set a negative left margin and a positive z index so that it appears above the div.

Here's an example:

#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>

Solution 3 - Html

Position:fixed gives an absolute position regarding the BROWSER window. so of course it goes there.

While position:absolute refers to the parent element, so if you place your <div> button inside the <div> of the container, it should position where you meant it to be. Something like

EDIT: thanks to @Sotiris, who has a point, solution can be achieved using a position:fixed and a margin-left. Like this: http://jsfiddle.net/NeK4k/

Solution 4 - Html

I know this is an old post but I had the same question but didn't find an answer that set the element fixed relative to a parent div. The scroll bar on medium.com is a great pure CSS solution for setting something position: fixed; relative to a parent element instead of the viewport (kinda*). It is achieved by setting the parent div to position: relative; and having a button wrapper with position: absolute; and the button of course is position: fixed; as follows:

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

working example

*Since fixed elements don't scroll with the page the vertical position will still be relative to the viewport but the horizontal position is relative to the parent with this solution.

Solution 5 - Html

Seems, css transforms can be used

"‘transform’ property establishes a new local coordinate system at the element",

but ... this is not cross-browser, seems only Opera works correctly

Solution 6 - Html

Try position:sticky on parent div of the element you want to be fixed. >More info here: http://html5-demos.appspot.com/static/css/sticky.html. >Caution: Check for browser version compatibility.

Solution 7 - Html

I achieved to have an element with a fixed position (wiewport) but relative to the width of its parent.

I just had to wrap my fixed element and give the parent a width 100%. At the same time, the wrapped fixed element and the parent are in a div which width changes depending on the page, containing the content of the website. With this approach I can have the fixed element always at the same distance of the content, depending on the width of this one. In my case this was a 'to top' button, always showing at 15px from the bottom and 15px right from the content.

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;
    }
  }
}

Solution 8 - Html

If your close button is going to be text, this works very well for me:

#close {
  position: fixed;
  width: 70%; /* the width of the parent */
  text-align: right;
}
#close span {
  cursor: pointer;
}

Then your HTML can just be:

<div id="close"><span id="x">X</span></div>

Solution 9 - Html

position fixed but relative to parent-div

#parent-div {
  position: *either static or relative, doesn't matter*
  width: 1024px;  // for example
  height: 300vh;  // for example
}

#sticky-div {  // should be div
  position: sticky;
  bottom: 40px;
  width: 30px;  // your-element's width or larger
  height: 30px;  // your-element's height or larger
  margin-top: -40px;  // to compensate "bottom"
  margin-left: auto;
  margin-right: 20px;  // substitution for "right" property
  z-index: 10;
}

#your-element {
  width: 30px;
  height: 30px;
  background-color: red;
}

<div id="parent-div">
  <div id="sticky-div">
    <whatever id="your-element" />
  </div>
</div>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCalmariusView Question on Stackoverflow
Solution 1 - HtmlSotirisView Answer on Stackoverflow
Solution 2 - HtmlJosephView Answer on Stackoverflow
Solution 3 - HtmlDamien PirsyView Answer on Stackoverflow
Solution 4 - HtmlLifehackView Answer on Stackoverflow
Solution 5 - Html4esn0kView Answer on Stackoverflow
Solution 6 - HtmlLohit BisenView Answer on Stackoverflow
Solution 7 - HtmlagapitocandemorView Answer on Stackoverflow
Solution 8 - HtmlthatmiddlewayView Answer on Stackoverflow
Solution 9 - HtmlPsychopompView Answer on Stackoverflow