首页 > 其他分享 >使用css 与 js 两种方式实现导航栏吸顶效果

使用css 与 js 两种方式实现导航栏吸顶效果

时间:2022-10-19 21:33:33浏览次数:53  
标签:sticky navbar classList 栏吸顶 height color position js css

场景描述

简单的说一下场景描述:这个页面有三个部分组成的.
顶部的头部信息--导航栏--内容
当页面滚动的时候。导航栏始终是固定在最顶部的。
我们使用的第一种方案就是使用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。

标签:sticky,navbar,classList,栏吸顶,height,color,position,js,css
From: https://www.cnblogs.com/IwishIcould/p/16807861.html

相关文章

  • 使用CSS变量实现主题定制真的很简单
    本文为Varlet组件库源码主题阅读系列第六篇,Varlet支持自定义主题及暗黑模式,本篇文章我们来详细看一下这两者的实现。主题定制Varlet是通过css变量来组织样式的,什么是cs......
  • JS事件冒泡与事件委派(委托)
    学到了学到了看了这篇后博客后,对事件冒泡和事件委托有了清晰的理解https://blog.csdn.net/weixin_48769418/article/details/115045810 一、事件冒泡指的是事件的......
  • jQuery中的CSS(二)
    一:获取样式和设置样式      4.移除样式: 5.切换样式 6.判断是否包含某个样式二:设置或获取HTML、文本和值html()取得第一个匹配元素的html内容。这个函数不能用于XML......
  • CSS背景图无法铺满的问题
    html和body设置为100%,当body中的内容超出后,设置的背景图片无法铺满整个屏幕。点击查看代码html,body{width:100%;height:100%;}.home{width:100%;......
  • jsp与jsp之间的跳转----当有一个jsp在WEB-INF下
    不通过action来处理跳转,直接从test.jsp页面跳到WEB-INF下的test1.jsp。我们有时候会试试绝对路径的写法<%=request.getContext()=%>/WEB-INF/test1.jsp,但是还是不行。因为......
  • How to get the return value of the setTimeout inner function in js All In One
    HowtogetthereturnvalueofthesetTimeoutinnerfunctioninjsAllInOne在js中如何获取setTimeout内部函数的返回值✅Promisewrap&Async/Await......
  • 事件默认的参数,JS字符串拼接,HTML DOM 事件
    JS字符串拼接的几种方式 https://blog.csdn.net/u012320487/article/details/123822785传参数时保持默认的参数<inputtype="text"v-model="item.count"@change="u......
  • JSTL 判断<c:if test="true"></c:if>但是不执行的问题
    问题:JSTL判断<c:iftest="true"></c:if>但是不执行原因:JSTL语法的问题<c:iftest="${requestScope.page.pageNo>1} ">.......</c:if>在test中的}和"之......
  • Vue学习笔记之vue.js 两个等号 == 和三个等号===的区别
    /**==用于比较两者是否相等,忽略数据类型===用于更严谨的比较,值和值的数据类型都需要同时比较*/<!DOCTYPEhtml><htmllang="en"><head><metacharset="......
  • css属性学习 text-align-last
     该属性用于决定元素的最后一个一行如何排列且只在text-align:justify;的情况下生效text-align-last:justify;注意:在英文中使用时需要在要隔开的地方加空格有了......