视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
当position:sticky遇到bootstrap浮动布局时候的踩坑记录
2020-11-27 15:23:23 责编:小采
文档

当第一次接触到 position:sticky 这个属性,我就意识到之前的不少 js 场景可以用这个 css 属性去改写。譬如 网站 右侧的不少广告,滚动上去后需要 fixed,完全就是 sticky 的应用啊。

今天要说的是 文章详情页 右侧的目录栏,当页面下滑的时候,它也会固定到页面顶部,之前是用 js 去监听 scroll 事件,然后根据位置进行判断,toggle fixed 的方案,出于一些原因,决定对它用 sticky 去重写。

几下就写完了,去掉滚动事件监听,然后将菜单元素 .post-nav 加上 position:sticky; top:0 样式,但是,不起效!

wtf! 百思不得其解,我开始搜索原因。在 so 搜到了 这个,说到可能是元素的父级元素有对 overflow 属性进行处理,比如加了什么 overflow:hidden 啥的,但是看了下,并没有这种情况。

然后我猜想会不会是 bootstrap 布局的问题(事实上确实有关系),写下 demo:

<!DOCTYPE html>
<html>
<head>
 <title></title>
 <link href="//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>
<p class="container">
 <p class="row">
 <p class="col-md-8 main">content</p>
 <p class="col-md-4">
 <p class="menu">menu</p>
 <p class="ad">ad</p>
 <p class="guess">others</p>
 </p>
 </p>
</p>
</body>
</html>

但是没问题,突然想到网站用的 bootstrap 版本是 3.x,然后改成 3.3.7 的版本,这时候问题就出来了。

这时候问题就比较好定位了,4.x 用的是 flex 布局,而 3.x 还是 float 浮动布局,问题应该是出在这里了。

最终代码(参考 这个 issue):

<!DOCTYPE html>
<html>
<head>
 <title></title>
 <link href="//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>
<p class="container">
 <p class="row">
 <p class="col-md-8 main">content</p>
 <p class="col-md-4 side">
 <p class="menu">menu</p>
 <p class="ad">ad</p>
 <p class="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())

 // other code 
 // ...

})

总结:

下载本文
显示全文
专题