pershianix
pershianix

Reputation: 97

absolute positioning and dynamic height

I want to create a page like this: Page Layout

and here is my HTML:

<div class="container">
    <div class="article">
        <div class="main-content">
            Main content goes here...
        </div>
        <div class="content-meta">
            <div class="content-title">
                the title of content goes here...
            </div>
            <div class="content-info">
                some information about content....
            </div>
        </div>
    </div>
</div>

and CSS:

.container {
  overflow:hidden; 
  position:relative;
  width: 100%;
  height: 350px;
}
.container .article {
  width:100%;
  position:absolute;
  left:0;
  top:0;
  background-color: red;
}
.container .article .main-content {
  width:50%;
  float: right;
}
.container .article .content-meta {
  width:50%;
  float: right;
  position: relative;
  height: 350px;
}
.container .content-title , .container .content-info  {
  width: 100%;
  position: absolute;
  left: 0;
  height: 50%;
}
.container .content-title {
    background-color: green;
    top: 0;
}
.container .content-info {
    background-color: blue;
    top: 50%;
}

it's working but when I use % instead of px for height of green and blue area, it just doesn't work. Why? I mean, I set for both green and blue area height:50% but it didn't work. How can I solve this problem?

Note: I have 6 div.article elements and I want all of them to be stacked on top of each other and that's why I'm using position property.

Upvotes: 2

Views: 2088

Answers (1)

Stickers
Stickers

Reputation: 78796

In order to have percentage height to work you need to set both the parent elements .container .article .content-meta and .container .article to height:100%.

.container {
  overflow: hidden;
  position: relative;
  width: 100%;
  height: 350px;
}
.container .article {
  width: 100%;
  position: absolute;
  left: 0;
  top: 0;
  background-color: red;
  height: 100%;
}
.container .article .main-content {
  width: 50%;
  float: right;
}
.container .article .content-meta {
  width: 50%;
  float: right;
  position: relative;
  height: 100%;
}
.container .content-title,
.container .content-info {
  width: 100%;
  position: absolute;
  left: 0;
  height: 50%;
}
.container .content-title {
  background-color: green;
  top: 0;
}
.container .content-info {
  background-color: blue;
  top: 50%;
}
<div class="container">
  <div class="article">
    <div class="main-content">
      Main content goes here...
    </div>
    <div class="content-meta">
      <div class="content-title">
        the title of content goes here...
      </div>
      <div class="content-info">
        some information about content....
      </div>
    </div>
  </div>
</div>

In fact, when you use absolute position, float won't be necessary.

.article {
  position: relative;
  height: 350px;
}
.main-content {
  position: absolute;
  left: 50%;
  top: 0;
  width: 50%;
  height: 100%;
  background: red;
}
.content-meta {
  position: absolute;
  left: 0;
  top: 0;
  width: 50%;
  height: 100%;
}
.content-title,
.content-info {
  position: absolute;
  left: 0;
  width: 100%;
  height: 50%;
}
.content-title {
  background: green;
  top: 0;
}
.content-info {
  background: blue;
  top: 50%;
}
<div class="article">
  <div class="main-content">
    Main content goes here...
  </div>
  <div class="content-meta">
    <div class="content-title">
      the title of content goes here...
    </div>
    <div class="content-info">
      some information about content....
    </div>
  </div>
</div>

Or, just use float without absolute position.

.article {
  height: 350px;
}
.main-content {
  float: right;
  width: 50%;
  height: 100%;
  background: red;
}
.content-meta {
  float: left;
  width: 50%;
  height: 100%;
}
.content-title,
.content-info {
  float: left;
  width: 100%;
  height: 50%;
}
.content-title {
  background: green;
}
.content-info {
  background: blue;
}
<div class="article">
  <div class="main-content">
    Main content goes here...
  </div>
  <div class="content-meta">
    <div class="content-title">
      the title of content goes here...
    </div>
    <div class="content-info">
      some information about content....
    </div>
  </div>
</div>

Alternatively, you can use flexbox if you don't need to support old browsers.

.article {
  height: 350px;
  display: flex;
  flex-direction: row-reverse;
}
.main-content {
  background: red;
  flex: 1;
}
.content-meta {
  flex: 1;
  display: flex;
  flex-direction: column;
}
.content-title,
.content-info {
  flex: 1;
}
.content-title {
  background: green;
}
.content-info {
  background: blue;
}
<div class="article">
  <div class="main-content">
    Main content goes here...
  </div>
  <div class="content-meta">
    <div class="content-title">
      the title of content goes here...
    </div>
    <div class="content-info">
      some information about content....
    </div>
  </div>
</div>

Upvotes: 4

Related Questions