当 position:sticky 遇到 bootstrap 浮动布局时候的踩坑记录

  今天要说的是文章详情页右侧的目录栏,当页面下滑的时候,它也会固定到页面顶部,之前是用js去监听scroll事件,然后根据位置进行判断,togglefixed的方案,出于一些原因,决定对它用sticky去重写。
 
  几下就写完了,去掉滚动事件监听,然后将菜单元素.post-nav加上position:sticky;top:0样式,但是,不起效!
 
  wtf!百思不得其解,我开始搜索原因。在so搜到了这个,说到可能是元素的父级元素有对overflow属性进行处理,比如加了什么overflow:hidden啥的,但是看了下,并没有这种情况。
 
  然后我猜想会不会是bootstrap布局的问题(事实上确实有关系),写下demo:
 
  <!DOCTYPEhtml>
 
  <html>
 
  <head>
 
  <title></title>
 
  <linkhref="//cdn.bootcss.com/bootstrap/4.1.1/css/bootstrap.min.css"rel="stylesheet">
 
  <style>
 
  body{font-size:50px;font-weight:900;}
 
  .main{height:2000px;background:#eee}
 
  .menu{height:200px;background:yellow}
 
  .ad{height:200px;background:red;position:sticky;top:0px;}
 
  .guess{height:200px;background:blue;}
 
  </style>
 
  </head>
 
  <body>
 
  <pclass="container">
 
  <pclass="row">
 
  <pclass="col-md-8main">content</p>
 
  <pclass="col-md-4">
 
  <pclass="menu">menu</p>
 
  <pclass="ad">ad</p>
 
  <pclass="guess">others</p>
 
  </p>
 
  </p>
 
  </p>
 
  </body>
 
  </html>
 
  但是没问题,突然想到网站用的bootstrap版本是3.x,然后改成3.3.7的版本,这时候问题就出来了。
 
  这时候问题就比较好定位了,4.x用的是flex布局,而3.x还是float浮动布局,问题应该是出在这里了。
 
  最终代码(参考这个issue):
 
  <!DOCTYPEhtml>
 
  <html>
 
  <head>
 
  <title></title>
 
  <linkhref="//cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"rel="stylesheet">
 
  <style>
 
  body{font-size:50px;font-weight:900;}
 
  .main{height:2000px;background:#eee}
 
  .side{height:2000px;}
 
  .menu{height:200px;background:yellow}
 
  .ad{height:200px;background:red;position:sticky;top:0px;}
 
  .guess{height:200px;background:blue;}
 
  </style>
 
  </head>
 
  <body>
 
  <pclass="container">
 
  <pclass="row">
 
  <pclass="col-md-8main">content</p>
 
  <pclass="col-md-4side">
 
  <pclass="menu">menu</p>
 
  <pclass="ad">ad</p>
 
  <pclass="guess">others</p>
 
  </p>
 
  </p>
 
  </p>
 
  </body>
 
  </html>
 
  对应到开始的问题上,因为menu是属于.col-md-3元素的,所以右边的.col-md-3需要和左边的.col-md-9保持高度一致即可,加上这行代码:
 
  $('.side').height($('.main').height())
 
  因为左边的内容区域有图片的延迟加载,所以这行代码需要持续执行:
 
  $(window).scroll(function(){
 
  $('.side').height($('.main').height())
 
  //othercode
 
  //...
 
  })
 
  总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问HTML视频教程!