Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

position: fixed caused element to be wider than browser

Tags:

html

css

Can anyone tell me why position:fixed cause the element to be wider than the browser or other content on the page and causing horizontal scrolling?

Here is the code HTML

<header>
     this is a header
</header>

<div class="container">
     this is a container
</div>

CSS

 header {
      width: 90%;
      height: 100px;
      background: blue;
      position: fixed;
      z-index: 100;
 }

.container {
     width: 90%;
     height: 500px;
     background: red;
     position: relative;
     z-index: -2;
}

Here is a link to the codepen http://codepen.io/colbydodson/pen/wcgua

like image 718
Colbyd Avatar asked Dec 12 '13 22:12

Colbyd


People also ask

What type of position is positioning elements only by browser window?

Fixed positioning is really just a specialized form of absolute positioning; elements with fixed positioning are fixed relative to the viewport/browser window rather than the containing element; even if the page is scrolled, they stay in exactly the same position inside the browser window.

When using position fixed What will the element always be positioned relative to?

An element with position: fixed; is positioned relative to the viewport, which means it always stays in the same place even if the page is scrolled. The top, right, bottom, and left properties are used to position the element.

How do I keep my position fixed in HTML?

To create a fixed top menu, use position:fixed and top:0 . Note that the fixed menu will overlay your other content. To fix this, add a margin-top (to the content) that is equal or larger than the height of your menu.

Why position fixed does not work?

Position fixed doesn't work with transform CSS property. It happens because transform creates a new coordinate system and your position: fixed element becomes fixed to that transformed element. To fix the problem you can remove transform CSS property from the parent element.


2 Answers

Width is differently applied to relative and fixed elements, the ancestors margin and the style property that are parent-inheritable in respect to their position property.

The body tag will have it's default User Agent Style Sheet 8px margins (http://www.w3.org/TR/CSS2/sample.html),

header 90% width, being fixed, without any top, left, right or bottom value will be positioned to the nearest available place, but will inherit the original document/viewport size, making it in reality 90% wide, but positioned at the 10px 'body' margin offset. To test add top:0; left:0; for the fixed header http://jsbin.com/ETAqADu/1/edit


.container being a block-level DIV element set to relative position, will be 90% width of the available parent usable width, which is the body innerWidth (not counting the 10 + 10 px margins on the X axis)

Unwanted result:
logically header will be 20px wider than .container because position fixed moves your element out of body flow.

Fix:
control your parent (body) element default margin by setting to 0

body { margin: 0; }

Or a small but heavy CSS reset like:

/* QuickReset */
*, *::before, *::after { margin: 0; box-sizing: border-box; }

Read also CSS Box Model - Margin collapsing

like image 95
Roko C. Buljan Avatar answered Oct 04 '22 20:10

Roko C. Buljan


I was having a similar problem only on mobile. Despite having no margins, borders, padding on any of the parents, my fixed element was still wider than the viewport, and I didn't have the option of using width: auto.

If you're willing to not support IE8 and below, you can use

width: 100vw

Can I use Viewport units: vw, vh, vmin, vmax

like image 34
willlma Avatar answered Oct 04 '22 19:10

willlma