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


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

    1. <style>
    2. body {
    3. margin: 0;
    4. }
    5. .header {
    6. width: 100%;
    7. height: 80px;
    8. line-height: 80px;
    9. background-color: pink;
    10. text-align: center;
    11. font-size: 30px;
    12. color: #fff;
    13. }
    14. .navbar {
    15. width: 100%;
    16. height: 60px;
    17. line-height: 60px;
    18. background-color: green;
    19. text-align: center;
    20. /* 兼容 */
    21. position: -webkit-sticky;
    22. position: -ms-sticky;
    23. position: -o-sticky;
    24. /* 粘性定位*/
    25. position: sticky;
    26. left: 0;
    27. top: 0;
    28. color: #fff;
    29. }
    30. .content {
    31. height: 140px;
    32. background: rgb(13, 68, 218);
    33. margin-top: 4px;
    34. text-align: center;
    35. line-height: 140px;
    36. }
    37. </style>
    38. <body>
    39. <div class="header">我是头部信息</div>
    40. <div class="navbar" id="navbar">我是导航栏</div>
    41. <div class="content"> 我是内容 </div>
    42. <div class="content"> 我是内容 </div>
    43. <div class="content"> 我是内容 </div>
    44. <div class="content"> 我是内容 </div>
    45. <div class="content"> 我是内容 </div>
    46. <div class="content"> 我是内容 </div>
    47. <div class="content"> 我是内容 </div>
    48. </body>

    position:sticky 的特征的(坑)

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

    js检测浏览器是否支持sticky属性
    1. if (CSS.supports("position", "sticky") || CSS.supports("position", "-webkit-sticky")) {
    2. console.log('支持')
    3. }
    使用js实现滚动效果

    当滚动高度 > 元素距离顶部的位置 我们需要 { 添加类,让元素固定定位};否者移除类。
    当滚动高度 > 元素距离顶部的位置 让占位元素显示在页面中。否者隐藏起来
     

    1. <style>
    2. body {
    3. margin: 0;
    4. }
    5. .header {
    6. width: 100%;
    7. height: 100px;
    8. background-color: pink;
    9. text-align: center;
    10. line-height: 100px;
    11. }
    12. .navbar {
    13. width: 100%;
    14. height: 40px;
    15. line-height: 40px;
    16. background-color: green;
    17. text-align: center;
    18. }
    19. .position {
    20. width: 100%;
    21. height: 40px;
    22. }
    23. .fixed {
    24. position: fixed;
    25. top: 0;
    26. left: 0;
    27. }
    28. .hidecss {
    29. display: none
    30. }
    31. .content {
    32. height: 1140px;
    33. background: rgb(13, 68, 218);
    34. margin-top: 4px;
    35. text-align: center;
    36. line-height: 140px;
    37. }
    38. </style>
    39. <body>
    40. <div class="header">头部信息栏</div>
    41. <div class="navbar" id="navbar">中部导航栏</div>
    42. <!-- 占位要不然滚动的时候下面的内容就会顶上去原来的位置,导致一部分内容显示不完整-->
    43. <div class="position hidecss" id="position"></div>
    44. <div class="content"> 我是内容 </div>
    45. </body>
    46. 下面是js代码
    47. var navbar = document.getElementById('navbar')
    48. var position = document.getElementById('position')
    49. var navbarTop = navbar.offsetTop; // 获取导航栏到父元素的顶部距离
    50. // 监听滚动
    51. window.onscroll = function() {
    52. // 获取滚动条距离顶部的距离
    53. var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
    54. // 滚动高度>元素距离顶部的位置时添加类,否则移除类
    55. scrollTop > navbarTop ? navbar.classList.add('fixed') : navbar.classList.remove('fixed')
    56. // 控制占位内容是否显示
    57. scrollTop > navbarTop ? position.classList.remove('hidecss') : position.classList.add('hidecss')
    58. }
    分享一下上面使用 原生js——操作类名(HTML5新增classList)
    1. classList.add( newClassName );添加新的类名,如已经存在,取消添加。
    2. 可以使用扩展运算符添加多个类。或者多个类使用逗号隔开
    3. div.classList.add("foo", "bar", "baz"); //或者多个类使用逗号隔开
    4. //扩展运算符添加多个类
    5. let manyclassArr = ['leiming1', 'leiming2']
    6. domDiv.classList.add(...manyclassArr)
    7. 移除已经存在的类名;
    8. classList.remove( oldClassName )
    9. //移除多个类值
    10. div.classList.remove("foo", "bar", "baz");
    11. 确定元素中是否包含指定的类名,返回值为truefalse;不可以检测多个类名
    12. classList.contains( oldClassName );
    13. 如果classList中存在给定的值,删除它,否则,添加它;
    14. classList.toggle( className );
    15. classList.replace( oldClassName,newClassName );
    16. 将oldClassName,newClassName类名替换为oldClassName,newClassName。

  • 相关阅读:
    如何做好水库大坝实时安全监测
    【PAT甲级】1052 Linked List Sorting
    使用 JavaScript 和 CSS 的简单字符计数器
    汽车自动驾驶是人工智能吗,自动驾驶是人工智能
    3款免费的录屏软件推荐,轻松录制高质量视频
    新库上线 | CnOpenData农产品批发价格数据
    Java--XML简介
    mysql主从和mycat读写分离的安装及验证
    在Windows系统中查找GitBash安装位置
    [Linux 基础] Linux使用git上传gitee三板斧
  • 原文地址:https://blog.csdn.net/weixin_41542329/article/details/133698620