Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

the behaviour of top: auto; bamboozles me

Tags:

Hi I'm really confused about some basics with absolute positioning.

<!DOCTYPE html>
<html>
<head>    
<link href="http://yui.yahooapis.com/3.0.0/build/cssreset/reset-min.css" rel="stylesheet" type="text/css" />

<style>    
#containingBlock {
  position: relative;
  background: green;

}
#abs {
  position: absolute;
  background: blue;
  top: auto;
}  
</style>
</head>
<body>

<div id="containingBlock">

  <p>foo</p>

  <div id="abs">bar</div>

</div>

</body>
</html>

With the markup arranged as above, div#abs does not overlap the foo paragraph.

I know I could make it do this by giving top a value of 0 rather than auto, but since div#containingBlock has no padding, I thought auto and 0 would do the same thing.

However, if the paragraph and div#abs are switched in the source order -to make bar come before foo -top: auto; works exactly as I expected.

Any explanations appreciated!

like image 343
Dave C Avatar asked Mar 23 '11 00:03

Dave C


People also ask

What means top auto?

Using auto for top (or left) tells the browser to position an element in the exact same way it would if the element had 'position: fixed'.

What does top do in CSS?

The top property affects the vertical position of a positioned element. This property has no effect on non-positioned elements. If position: absolute; or position: fixed; - the top property sets the top edge of an element to a unit above/below the top edge of its nearest positioned ancestor.

What is the difference between top and margin top?

top is for tweak an element with use of position property. margin-top is for measuring the external distance to the element, in relation to the previous one. Also, top behavior can differ depending on the type of position, absolute , relative or fixed .


2 Answers

You didn't really position these elements, you just declared what type of positioning you want to use. In this case, the auto value isn't really doing anything, because the #abs element is being placed right where it normally would anyways. If you removed the top: auto; segment outright, it would have no effect on the element.

"bar" is not overlapping "foo" because you haven't positioned it to do so. It is contained within the #containingBlock element, and is placed below the block element <p> because "foo" takes up a discrete amount of space. You want to override that? Set the top or other corresponding position values. To reiterate what others have said, top:auto just positions the top of that element as high up as room permits (which is what the element would have done normally).

For future reference, the auto value is used for when a parent CSS property overrides the child element's styling. For example let's say you had more complicated code which had a rule to apply a margin to every div within #containingBlock. If you want to change that back to normal, you would include margin:auto; in your containingBlock CSS.

like image 75
MMMdata Avatar answered Sep 19 '22 00:09

MMMdata


When you set position absolute (relative etc) and do not specify a new position for the element, it will be placed where it would normally stay if there was no position:absolute.

Setting it to auto is like not specifying a top position and thus it gets placed under the paragraph where it would normally stay if no special positioning was applied.

like image 24
Francisc Avatar answered Sep 20 '22 00:09

Francisc