场景描述

简单的说一下场景描述:这个页面有三个部分组成的.
顶部的头部信息--导航栏--内容
当页面滚动的时候。导航栏始终是固定在最顶部的。
我们使用的第一种方案就是使用css的粘性定位 position: sticky; [ˈstɪ ki]

先说一下css的position的属性

position的属性我们一般认为有
position:absolute
postion: relative
position:static
position:fixed
position:inherit;
position:initial;
position:unset;
但是我最近发现了一个定位position:sticky 这个可以称为粘性定位。
这个粘性定位的元素会始终在那个位置

css 实现导航吸顶效果

<style>
body {
margin: 0;
} .header {
width: 100%;
height: 80px;
line-height: 80px;
background-color: pink;
text-align: center;
font-size: 30px;
color: #fff;
} .navbar {
width: 100%;
height: 60px;
line-height: 60px;
background-color: green;
text-align: center;
/* 兼容 */
position: -webkit-sticky;
position: -ms-sticky;
position: -o-sticky;
/* 粘性定位*/
position: sticky;
left: 0;
top: 0;
color: #fff;
} .content {
height: 140px;
background: rgb(13, 68, 218);
margin-top: 4px;
text-align: center;
line-height: 140px;
}
</style>
<body>
<div class="header">我是头部信息</div>
<div class="navbar" id="navbar">我是导航栏</div>
<div class="content"> 我是内容 </div>
<div class="content"> 我是内容 </div>
<div class="content"> 我是内容 </div>
<div class="content"> 我是内容 </div>
<div class="content"> 我是内容 </div>
<div class="content"> 我是内容 </div>
<div class="content"> 我是内容 </div>
</body>

position:sticky 的特征的(坑)

1、sticky 不会触发 BFC。如果不知道 BFC 可以看这里。
2、样式表 z-index 无效。行内 style 写有效。【这个我没有去验证过】

js检测浏览器是否支持sticky属性

if (CSS.supports("position", "sticky") || CSS.supports("position", "-webkit-sticky")) {
console.log('支持')
}

使用js实现滚动效果

当滚动高度 > 元素距离顶部的位置 我们需要 { 添加类,让元素固定定位};否者移除类。
当滚动高度 > 元素距离顶部的位置 让占位元素显示在页面中。否者隐藏起来
<style>
body {
margin: 0;
} .header {
width: 100%;
height: 100px;
background-color: pink;
text-align: center;
line-height: 100px;
} .navbar {
width: 100%;
height: 40px;
line-height: 40px;
background-color: green;
text-align: center;
} .position {
width: 100%;
height: 40px;
} .fixed {
position: fixed;
top: 0;
left: 0;
} .hidecss {
display: none
} .content {
height: 1140px;
background: rgb(13, 68, 218);
margin-top: 4px;
text-align: center;
line-height: 140px;
}
</style>
<body>
<div class="header">头部信息栏</div>
<div class="navbar" id="navbar">中部导航栏</div>
<!-- 占位要不然滚动的时候下面的内容就会顶上去原来的位置,导致一部分内容显示不完整-->
<div class="position hidecss" id="position"></div>
<div class="content"> 我是内容 </div>
</body>
下面是js代码
var navbar = document.getElementById('navbar')
var position = document.getElementById('position')
var navbarTop = navbar.offsetTop; // 获取导航栏到父元素的顶部距离
// 监听滚动
window.onscroll = function() {
// 获取滚动条距离顶部的距离
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
// 滚动高度>元素距离顶部的位置时添加类,否则移除类
scrollTop > navbarTop ? navbar.classList.add('fixed') : navbar.classList.remove('fixed')
// 控制占位内容是否显示
scrollTop > navbarTop ? position.classList.remove('hidecss') : position.classList.add('hidecss')
}

分享一下上面使用 原生js——操作类名(HTML5新增classList)

classList.add( newClassName );添加新的类名,如已经存在,取消添加。
可以使用扩展运算符添加多个类。或者多个类使用逗号隔开
div.classList.add("foo", "bar", "baz"); //或者多个类使用逗号隔开
//扩展运算符添加多个类
let manyclassArr = ['leiming1', 'leiming2']
domDiv.classList.add(...manyclassArr) 移除已经存在的类名;
classList.remove( oldClassName )
//移除多个类值
div.classList.remove("foo", "bar", "baz"); 确定元素中是否包含指定的类名,返回值为true 、false;不可以检测多个类名
classList.contains( oldClassName ); 如果classList中存在给定的值,删除它,否则,添加它;
classList.toggle( className ); classList.replace( oldClassName,newClassName );
将oldClassName,newClassName类名替换为oldClassName,newClassName。

使用css 与 js 两种方式实现导航栏吸顶效果的更多相关文章

  1. 原生js更改css样式的两种方式

    下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3  &quo ...

  2. 【javascript】原生js更改css样式的两种方式

    下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3  &quo ...

  3. js中获取css样式的两种方式

    1. 对象.style.样式名  弊端就是只能获取行内样式 2.window.getComputedStyle(对象,null); 最好用第二种方式 <!DOCTYPE html> < ...

  4. 日期选择器(Query+bootstrap和js两种方式)

    日期选择是在下拉列表中选择年.月.日,年显示前后的五年,12个月,日就是有30.31.29.28天的区别,随着月份的变而变 一.js方式的日期选择 (1)首先就是三个下拉列表了,点击年.月.日显示列表 ...

  5. CSS&JS两种方式实现手风琴式折叠菜单

    <div class="accordion"> <div id="one" class="section"> < ...

  6. JavaScript判断各浏览器CSS前缀的两种方式

    不管浏览器更新的多快,号称多么支持标准.厂商不同,他们之间还是有很多差异.我们需要区分出这些差异,针对不同的浏览器做不同的处理. 比如 CSS 前缀,IE 的是 "-ms-",旧版 ...

  7. CSS和JS两种颜色渐变文字效果代码

    js实现颜色渐变文字效果代码: <!-- js颜色渐变色文字 --> <div id="moml"> <div style="text-al ...

  8. 获取表单选中的值(利用php和js两种方式)

    php代码中获取表单中单选按钮的值: (单选按钮只能让我们选择一个,这里有一个“checked”属性,这是用来默认选取的,我们每次刷新我们的页面时就默认为这个值.) 例: <form name= ...

  9. javascript实例:两种方式实现tab栏选项卡

    方法1: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  10. 原生js实现导航栏吸顶

    实现滑动滚动条让导航栏吸顶原理:主要是通过监听scroll,设定一个滚动条垂直位移作为临界,让导航栏吸顶或者取消吸顶. 话不多说了,代码如下: window.onscroll = function ( ...

随机推荐

  1. 带你认识三种kafka消息发送模式

    摘要:在kafka-0.8.2之后,producer不再区分同步(sync)和异步方式(async),所有的请求以异步方式发送,这样提升了客户端效率. 本文分享自华为云社区<kafka消息发送模 ...

  2. 使用 Diffusers 通过 DreamBooth 来训练 Stable Diffusion.md

    邀请参与我们的 DreamBooth 微调编程马拉松活动! DreamBooth 是一种使用专门的微调形式来训练 Stable Diffusion 的新概念技术.一些人用他仅仅使用很少的他们的照片训练 ...

  3. Python中节省内存的方法之一:__slots__属性

    Python是一门动态语言,可以在运行过程中,修改实例的属性和增删方法.任何实例都包含一个字典__dict__,该字典保存了实例所有的属性和方法.Python也通过这个字典可以将任意属性绑定到实例上. ...

  4. Linux--内存管理浅谈

    本文旨在宏观的了解linux的内存管理制度,理解相关概念,故很多方面不作过深叙述,感兴趣的可自行研究:如有错误,请指出. 一.进程与内存 当一个进程启动时,它需要获取系统分配给它的内存空间,并且设置好 ...

  5. 【辅助工具】SVN使用

    1.在对应路径下右键SVN checkout 2.输入对应的网址.用户名.密码 3.提交右键选择SVN commit.覆盖选择SVN update 4.编辑的时候右键TortoiseSVN-get l ...

  6. java两个list取交集

    直接上代码 List<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(2); list1.add(3); ...

  7. C#设计模式05——抽象工厂的写法

    C# 抽象工厂是一种创建型设计模式,它提供了一种封装一组相关或相互依赖对象创建的方法.该模式使得客户端能够创建与应用程序所使用的特定工厂无关的对象. 以下是C#抽象工厂5W1H的解释: 1. What ...

  8. 05_二叉树的层次遍历II

    二叉树的层序遍历 II 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 . (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 示例 1: 输入:root = [3,9,20 ...

  9. 关闭 cockpit 登陆提示

    sudo rm /etc/issue.d/cockpit.issue sudo rm /etc/motd.d/cockpit

  10. 【ArgParse】一个开源的入参解析库

    项目地址:argtable3 本地验证: 编译构建 新增验证 // examples/skull.c #include "argtable3.h" int main(int arg ...