5

I am using 100% heights for the body element of a webpage I am building so as to be able to set proportional heights for contained elements to control the heights of them and the revealing of their background images.

When using the Bootstrap affix plugin to control positioning of an element while scrolling the web page, if html, body { height:100% } is defined, the affixed element does not behave as intended. It can jump up the page seemingly unpredictably.

Here is a code example. Remove the html, body { height: 100%; } to get the affixed element to function properly.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <title>Bootstrap Affix Tutorial</title>

    <!-- Bootstrap -->
    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">


    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>

    <style type="text/css">

    /*This will cause the affix plugin to set the wrong top for the affixed element*/
    html, body {
        height: 100%;
    }

    /*The purpose of settting the height above is so we can set the height of this element*/
    .jumbotron {
        height: 50%;
    }

    .affix {
     top: 20px;
    }

    .affix-top {

    }

    .affix-bottom {
     position: absolute;
    }

    footer {
        height: 320px;
        background-color: #666;
    }

    </style>

<body>

<nav class="navbar navbar-default">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">Brand</a>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
        <li><a href="#">Link</a></li>
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Dropdown <span class="caret"></span></a>
          <ul class="dropdown-menu" role="menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li class="divider"></li>
            <li><a href="#">Separated link</a></li>
            <li class="divider"></li>
            <li><a href="#">One more separated link</a></li>
          </ul>
        </li>
      </ul>
      <form class="navbar-form navbar-left" role="search">
        <div class="form-group">
          <input type="text" class="form-control" placeholder="Search">
        </div>
        <button type="submit" class="btn btn-default">Submit</button>
      </form>
      <ul class="nav navbar-nav navbar-right">
        <li><a href="#">Link</a></li>
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Dropdown <span class="caret"></span></a>
          <ul class="dropdown-menu" role="menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li class="divider"></li>
            <li><a href="#">Separated link</a></li>
          </ul>
        </li>
      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>

<div class="jumbotron">
    <h1>This jumbotron</h1>
    <p>Disable <code>body { height: 100%; }</code> to get the affixed menu element to work as intended.</p>
    <small>Bootstrap 3.3.4</small>
</div>

<section>

 <div class="container">
  <div class="row">
   <div class="col-xs-4">
    <h3>Hello, world!</h3>
    <ul class="nav nav-pills nav-stacked" id="affixer" data-spy="affix">
      <li role="presentation" class="active"><a href="#">Home</a></li>
      <li role="presentation"><a href="#">Tutorial 1</a></li>
      <li role="presentation"><a href="#">Tutorial 2</a></li>
      <li role="presentation"><a href="#">Tutorial 3</a></li>
      <li role="presentation"><a href="#">Tutorial 4</a></li>
      <li role="presentation"><a href="#">Tutorial 5</a></li>
      <li role="presentation"><a href="#">Tutorial 6</a></li>
      <li role="presentation"><a href="#">Tutorial 7</a></li>
      <li role="presentation"><a href="#">Tutorial 8</a></li>
      <li role="presentation"><a href="#">Tutorial 9</a></li>
    </ul>
   </div><!-- /.col-* -->
   <div class="col-xs-8">

         <h2 id="one">Tutorial One</h2>
         <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
         Nam eu sem tempor, varius quam at, luctus dui. Mauris magna 
         metus, dapibus nec turpis vel, semper malesuada ante. 
         Vestibulum id metus ac nisl bibendum scelerisque non non 
         purus. Suspendisse varius nibh non aliquet sagittis. In 
         tincidunt orci sit amet elementum vestibulum. Vivamus 
         fermentum in arcu in aliquam. Quisque aliquam porta odio 
         in fringilla. Vivamus nisl leo, blandit at bibendum eu, 
         tristique eget risus. Integer aliquet quam ut elit suscipit, 
         id interdum neque porttitor. Integer 
         faucibus ligula.</p>
         <p>Vestibulum quis quam ut magna consequat faucibus. 
         Pellentesque eget nisi a mi suscipit tincidunt. Ut tempus 
         dictum risus. Pellentesque viverra sagittis quam at mattis. 
         Suspendisse potenti. Aliquam sit amet gravida nibh, 
         facilisis gravida odio. Phasellus auctor velit at lacus 
         blandit, commodo iaculis justo  viverra. Etiam vitae est 
         arcu. Mauris vel congue dolor. Aliquam eget mi mi. Fusce 
         quam tortor, commodo ac dui quis, bibendum viverra erat. 
         Maecenas mattis lectus enim, quis tincidunt dui molestie 
         euismod. Curabitur et diam tristique, accumsan nunc eu, 
         hendrerit tellus.</p>
         <hr>
         <h2 id="two">Tutorial Two</h2>
         <p> Nullam hendrerit justo non leo aliquet imperdiet. Etiam 
         in sagittis lectus. Suspendisse ultrices placerat accumsan. 
         Mauris quis dapibus orci. In dapibus velit blandit pharetra 
         tincidunt. Quisque non sapien nec lacus condimentum facilisis 
         ut iaculis enim. Sed viverra interdum bibendum. Donec ac 
         sollicitudin dolor. Sed fringilla vitae lacus at rutrum. 
         Phasellus congue vestibulum ligula sed consequat.</p>
         <p>Vestibulum consectetur scelerisque lacus, ac fermentum 
         lorem convallis sed. Nam odio tortor, dictum quis malesuada at, 
         pellentesque vitae orci. Vivamus elementum, felis eu auctor 
         lobortis, diam velit egestas lacus, quis fermentum metus ante 
         quis urna. Sed at facilisis libero. Cum sociis natoque 
         penatibus et magnis dis parturient montes, nascetur ridiculus 
         mus. Vestibulum bibendum blandit dolor. Nunc orci dolor, 
         molestie nec nibh in, hendrerit tincidunt ante. Vivamus sem 
         augue, hendrerit non sapien in, mollis ornare augue.</p>
         <hr>
         <h2 id="three">Tutorial Three</h2>
         <p>Integer pulvinar leo id risus pellentesque vestibulum. 
         Sed diam libero, sodales eget sapien vel, porttitor bibendum 
         enim. Donec sed nibh vitae lorem porttitor blandit in nec ante. 
         Pellentesque vitae metus ipsum. Phasellus sed nunc ac sem 
         malesuada condimentum. Etiam in aliquam lectus. Nam vel sapien 
         diam. Donec pharetra id arcu eget blandit. Proin imperdiet 
         mattis augue in porttitor. Quisque tempus enim id lobortis 
         feugiat. Suspendisse tincidunt risus quis dolor fringilla 
         blandit. Ut sed sapien at purus lacinia porttitor. Nullam 
         iaculis, felis a pretium ornare, dolor nisl semper tortor, vel 
         sagittis lacus est consequat eros. Sed id pretium nisl. 
         Curabitur dolor nisl, laoreet vitae aliquam id, tincidunt sit 
         amet mauris. </p>
         <p>Phasellus vitae suscipit justo. Mauris pharetra feugiat 
         ante id lacinia. Etiam faucibus mauris id tempor egestas. Duis 
         luctus turpis at accumsan tincidunt. Phasellus risus risus, 
         volutpat vel tellus ac, tincidunt fringilla massa. Etiam 
         hendrerit dolor eget ante rutrum adipiscing. Cras interdum 
         ipsum mattis, tempus mauris vel, semper ipsum. Duis sed dolor 
         ut enim lobortis pellentesque ultricies ac ligula. Pellentesque 
         convallis  elit nisi, id vulputate ipsum ullamcorper ut. Cras 
         ac pulvinar purus, ac viverra est. Suspendisse potenti. Integer 
         pellentesque neque et elementum tempus. Curabitur bibendum in 
         ligula ut rhoncus.</p>
         <p>Quisque pharetra velit id velit iaculis pretium. Nullam a
         justo sed ligula porta semper eu quis enim. Pellentesque 
         pellentesque, metus at facilisis hendrerit, lectus velit 
         facilisis leo, quis volutpat turpis arcu quis enim. Nulla 
         viverra lorem elementum interdum ultricies. Suspendisse 
         accumsan quam nec ante mollis tempus. Morbi vel accumsan diam, 
         eget convallis tellus. Suspendisse potenti.</p>
         <h2 id="three">Tutorial Four</h2>
         <p>Integer pulvinar leo id risus pellentesque vestibulum. 
         Sed diam libero, sodales eget sapien vel, porttitor bibendum 
         enim. Donec sed nibh vitae lorem porttitor blandit in nec ante. 
         Pellentesque vitae metus ipsum. Phasellus sed nunc ac sem 
         malesuada condimentum. Etiam in aliquam lectus. Nam vel sapien 
         diam. Donec pharetra id arcu eget blandit. Proin imperdiet 
         mattis augue in porttitor. Quisque tempus enim id lobortis 
         feugiat. Suspendisse tincidunt risus quis dolor fringilla 
         blandit. Ut sed sapien at purus lacinia porttitor. Nullam 
         iaculis, felis a pretium ornare, dolor nisl semper tortor, vel 
         sagittis lacus est consequat eros. Sed id pretium nisl. 
         Curabitur dolor nisl, laoreet vitae aliquam id, tincidunt sit 
         amet mauris. </p>
         <p>Phasellus vitae suscipit justo. Mauris pharetra feugiat 
         ante id lacinia. Etiam faucibus mauris id tempor egestas. Duis 
         luctus turpis at accumsan tincidunt. Phasellus risus risus, 
         volutpat vel tellus ac, tincidunt fringilla massa. Etiam 
         hendrerit dolor eget ante rutrum adipiscing. Cras interdum 
         ipsum mattis, tempus mauris vel, semper ipsum. Duis sed dolor 
         ut enim lobortis pellentesque ultricies ac ligula. Pellentesque 
         convallis  elit nisi, id vulputate ipsum ullamcorper ut. Cras 
         ac pulvinar purus, ac viverra est. Suspendisse potenti. Integer 
         pellentesque neque et elementum tempus. Curabitur bibendum in 
         ligula ut rhoncus.</p>
         <p>Quisque pharetra velit id velit iaculis pretium. Nullam a
         justo sed ligula porta semper eu quis enim. Pellentesque 
         pellentesque, metus at facilisis hendrerit, lectus velit 
         facilisis leo, quis volutpat turpis arcu quis enim. Nulla 
         viverra lorem elementum interdum ultricies. Suspendisse 
         accumsan quam nec ante mollis tempus. Morbi vel accumsan diam, 
         eget convallis tellus. Suspendisse potenti.</p>
   </div><!-- /.col-* -->
  </div><!-- /.row -->
 </div><!-- /.container -->

</section>

<div id="affix-stop" style="height:10px;"></div>

<footer>
    <div class="container">
        <h3>This footer</h3>
    </div>
</footer>


<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>

<!-- Include all compiled plugins (below), or include individual files as needed -->

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>

<script type="text/javascript">

$('#affixer').affix({
    offset: {
        top: $('#affixer').offset().top - 20,
        bottom: $(document).height() - $('#affix-stop').offset().top 
    }
});

</script>

</body>
</html>

I am looking for a solution to the problem of not being able to set the 100% html & body height, while retaining the intended functionality of the Bootstrap affix plugin, specifically the use of the data-offset-bottom feature.

There is a related answer here Bootstrap 3: How to affix after 100% height but it does not address the case of using the data-offset-bottom parameter with the affix.

I discovered the bug in my code after going through a comprehensive tutorial of the Bootstrap affix plugin http://www.sitepoint.com/understanding-bootstraps-affix-scrollspy-plugins/ .

Community
  • 1
  • 1
robertdavid
  • 393
  • 4
  • 15

0 Answers0