「译」如何不用JavaScript创建一个可粘性的滚动头

原文:How to Create a Shrinking Header on Scroll Without JavaScript
原作者:Håvard Brynjulfsen
译者:33子~

想象下一个网站的头部很好并且很厚,带有大量的padding在内容的顶部和底部。当你向下滑动的时候,它会自己伸缩起来,减少一些padding,为其他内容提供了更多的空间。

通常你必须使用一些JavaScript添加一个伸缩的功能就像上面说的那样,但是有一种方法仅仅是通过CSS来实现它,因为引入了position:sticky

让我先把话说清楚:我一般不喜欢粘性头部。我认为它们占据了屏幕太多空间。是否你应该在你自己的网站上是有粘性的头部,然而,这是另一个问题。它通常依赖你的内容和是否一个始终存在的导航会增加它的价值。如果你想使用它,要额外注意避免无意覆盖或者模糊可伸缩区域的内容-------会导致数据丢失。

无论怎样,开始怎样不用JavaScript实现它,开始标记。这没啥复杂的-一个<header> 带着一个子盒子<div> ,包括logo和导航。

<header class="header-outer">
  <div class="header-inner">
    <div class="header-logo">...</div>
    <nav class="header-navigation">...</nav>
  </div>
</header>

至于样式,我们将会为父级<header> 声明一个高度(120px)并且为它设置一个灵活的容器为了它的子级居中。然乎,我们让它粘性定位。

.header-outer {
  display: flex;
  align-items: center;
  position: sticky;
  height: 120px;
}

这个里面的容器包含所有的头部元素,比如logo和导航。里面的容器在某方面来说是实际的「头」,而父元素仅有的功能是使「头」更高以至于有一些东西可以伸缩。

我们给里面的容器,.header-inner,一个70px的高度并且也让它粘性定位。

.header-inner {
  height: 70px;
  position: sticky;
  top: 0; 
}

top:0?这是确保当容器变得粘性的时候自动的固定在最顶部。

现在开始把戏了!为了里面的容器精准地粘在页面的“天花板”,我们需要给父级<header> 一个负的top值,这个top值等于父盒子和子盒子容器的高度差,使它粘住“上方”的视口。也就是70px - 120px,剩下的是-50px。让我们添加。

.header-outer {
  display: flex;
  align-items: center;
  position: sticky;
  top: -50px; /* Equal to the height difference between header-outer and header-inner */
  height: 120px;
}

现在让我们把所有东西放在一起。这个<header> 滑出框架,而里面容器整齐地在视口的顶部。

参考codepen

我们使用在其他元素上!一直弹出怎么样?
参考codepen

虽然我们可以使用CSS很好的做到,但是它也有局限性。举个例子,这个里面的容器和外面的容器使用固定的高度。这使它们容易改变,就像导航元素因为菜单项的数量超过了总共的空间而换行。

另一个限制?这个logo不能可伸缩。这可能使最大的缺点,因为logo通常是占据空间的罪魁祸首。或许有一天我们可以根据元素的粘性来应用样式……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值