Search code examples
cssviewport

html element stretch to remaining view port height


So I am trying to do that section which is below navigation would automatically fill the remaining view-port height. Section contains one centered div and background picture. At the bottom there is a button which on click scrolls down full view-port height. Navigation is all bootstrap but I will add it here in case you need more details:

<body>
    <a href="javascript:" id="return-to-top"><i class="icon-chevron-up"></i></a>
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
        <a class="navbar-brand" href="#">
            <img src="images/main.png" class="d-inline-block align-top navImg" alt="UAB Betono zona">
        </a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation"> 
            <span class="navbar-toggler-icon"></span> 
        </button>
        <div class="collapse navbar-collapse justify-content-end" id="navbarNavDropdown">
            <ul class="navbar-nav navItems">
                <li class="nav-item"> 
                    <a class="nav-link" href="#">Link1</a> 
                </li>
                <li class="nav-item dropdown"> 
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Link2
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> 
                        <a class="dropdown-item" href="#">Item1</a> 
                        <a class="dropdown-item" href="#">Item2</a> 
                        <a class="dropdown-item" href="#">Item3</a>
                        <a class="dropdown-item" href="#">Item4</a>
                        <a class="dropdown-item" href="#">Item5</a>
                    </div>
                </li>
                <li class="nav-item"> 
                    <a class="nav-link" href="#">Link3</a> 
                </li>
                <li class="nav-item"> 
                    <a class="nav-link" href="#">Link4</a> 
                </li>
                <li class="nav-item"> 
                    <a class="nav-link" href="#">Link5</a> 
                </li>
            </ul>
        </div>
    </nav>
    <section class="mainSection">
        <div class="logoWrap">
            <h1>
              <span class="hFirst">Text1</span>&nbsp;&nbsp;&nbsp;
              <span class="hSecond">Text2</span>
             </h1>
        </div>
        <div class="scrollDown"> 
            <a href="#" class="next-viewport-down"><span></span>down</a>
        </div>
    </section>

As for a temporary solution I'm using height: 91vh, but its not a good option as different devices will display it differently. CCS of the section:

section.mainSection {
    background-color: #eeeeee;
    height: 91vh;
    position: relative;
    background-image: url(images/Main3.jpg);
    background-repeat: no-repeat;
    background-size: cover;
}

div.logoWrap {
    width: 100%;
    margin: auto;
    text-align: center;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

div.logoWrap .hFirst {
    font-weight: 600;
    position: relative;
    font-size: 2rem;
    font-style: italic;
    line-height: 4rem;
    vertical-align: top;
    width: auto;
}

div.logoWrap .hSecond {
    position: relative;
    font-weight: 700;
    font-size: 4rem;
    font-style: normal;
    line-height: 4rem;
}

Thanks for any input!


Solution

  • You can use flexbox to fill up available space, see the code below (top of CSS is new, the rest is unchanged):

    * { box-sizing: border-box; }
    
    body {
      margin: 0;
      display: flex;
      align-items: stretch;
      flex-direction: column;
      height: 100vh;
    }
    
    .navbar {
      flex: 0;
    }
    
    .mainSection {
      flex: 1 1 auto;
      overflow: auto;
    }
    
    /* Your code below is unchanged */
    
    section.mainSection {
        background-color: #eeeeee;
        position: relative;
        background-image: url(images/Main3.jpg);
        background-repeat: no-repeat;
        background-size: cover;
    }
    
    div.logoWrap {
        width: 100%;
        margin: auto;
        text-align: center;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }
    
    div.logoWrap .hFirst {
        font-weight: 600;
        position: relative;
        font-size: 2rem;
        font-style: italic;
        line-height: 4rem;
        vertical-align: top;
        width: auto;
    }
    
    div.logoWrap .hSecond {
        position: relative;
        font-weight: 700;
        font-size: 4rem;
        font-style: normal;
        line-height: 4rem;
    }
    <body>
      <a href="javascript:" id="return-to-top"><i class="icon-chevron-up"></i></a>
      <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
        <a class="navbar-brand" href="#">
          <img src="images/main.png" class="d-inline-block align-top navImg" alt="UAB Betono zona">
        </a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation"> 
                  <span class="navbar-toggler-icon"></span> 
              </button>
        <div class="collapse navbar-collapse justify-content-end" id="navbarNavDropdown">
          <ul class="navbar-nav navItems">
            <li class="nav-item">
              <a class="nav-link" href="#">Link1</a>
            </li>
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Link2
                          </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                <a class="dropdown-item" href="#">Item1</a>
                <a class="dropdown-item" href="#">Item2</a>
                <a class="dropdown-item" href="#">Item3</a>
                <a class="dropdown-item" href="#">Item4</a>
                <a class="dropdown-item" href="#">Item5</a>
              </div>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Link3</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Link4</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#">Link5</a>
            </li>
          </ul>
        </div>
      </nav>
      <section class="mainSection">
        <div class="logoWrap">
          <h1>
            <span class="hFirst">Text1</span>&nbsp;&nbsp;&nbsp;
            <span class="hSecond">Text2</span>
          </h1>
        </div>
        <div class="scrollDown">
          <a href="#" class="next-viewport-down"><span></span>down</a>
        </div>
      </section>
    </body>