仿简书,知乎pc官网顶部导航栏上下滚动效果

描述:简书,知乎顶部导航栏,当鼠标上下滚动时切换不同导航栏,非常符合用户习惯。

aHR0cHM6Ly93ZWJyYWJiaXQub3NzLWNuLWJlaWppbmcuYWxpeXVuY3MuY29tL2F2YXRhci8lRTclQUUlODAlRTQlQjklQTYuZ2lm.gif

先上代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <div class="nav-bar-wrapper fixed">
  13. <div class="content-wrapper">
  14. <div class="nav-bar-fixed">
  15. <div class="top-navBar" :class="{'up': isUp}">
  16. <div class="nav-bar-content">
  17. <div class="content-wrapper flex-sb">
  18. <h1 class="logo">
  19. <a href="" title="webrabbit博客">
  20. <img src="" alt="webrabbit博客">
  21. </a>
  22. </h1>
  23. <div class="nav-bar-item">
  24. <ul>
  25. <li><a href="">首页</router-link></li>
  26. <li><a href="">webrabbit开源博客</router-link></li>
  27. <li><a href="/">IT技术笔记</a></li>
  28. <li><a href="/">其他分享</a></li>
  29. </ul>
  30. </div>
  31. </div>
  32. </div>
  33. <div class="nav-bar-content">
  34. <div class="content-wrapper flex-sb">
  35. <h1 class="logo">
  36. <a href="/" title="webrabbit博客">
  37. <img src="" alt="webrabbit博客">
  38. </a>
  39. </h1>
  40. <div class="nav-bar-item">
  41. <ul>
  42. <li><a href="">首页</router-link></li>
  43. <li><a href="">webrabbit开源博客</router-link></li>
  44. <li><a href="/">IT技术笔记</a></li>
  45. <li><a href="/">其他分享</a></li>
  46. </ul>
  47. </div>
  48. </div>
  49. </div>
  50. </div>
  51. </div>
  52. </div>
  53. </div>
  54. <div class="app-main">
  55. 滚动一下试试
  56. </div>
  57. </div>
  58. </body>
  59. </html>
  60. <script>
  61. var vm = new Vue({
  62. el: '#app',
  63. data() {
  64. return {
  65. isUp: false, // 判断是否是向上滚动
  66. changeUpDir: 0, // 设置从向下滚动到向上滚动时的位置(距离滚动条顶部)
  67. changeDownDir: 0 // 设置从向上滚动到向下滚动时的位置(距离滚动条顶部)
  68. }
  69. },
  70. mounted() {
  71. const _this = this
  72. let scrollTop = 0 // 初始化滚动条为位置为0
  73. let topValue = this.getScrollTop() // 设置一个标识位,即复制一个滚动条位置,但是这个位置获取的时间比 scrollTop慢,
  74. document.onscroll = function() {
  75. scrollTop = _this.getScrollTop() // 滚动条的位置
  76. if (scrollTop <= topValue) { // 当后者滚动条大于前者滚动条时,即认为滚动条向上运动,但是我们设置一个临界值,当大于这个临界值时,即认为是用户有意向上滚动
  77. _this.changeUpDir = scrollTop // changeUpDir 这个是 刚好从向下滚动到向上滚动改变方向时的位置
  78. if (_this.changeDownDir - scrollTop > 120) { // 这个是else 里面记录的值减滚动条位置 大于120 即认为是向上滚动
  79. _this.isUp = true
  80. }
  81. } else {
  82. _this.changeDownDir = scrollTop
  83. if (scrollTop - _this.changeUpDir > 120) {
  84. _this.isUp = false
  85. }
  86. }
  87. setTimeout(function() { topValue = scrollTop }, 0)
  88. }
  89. },
  90. methods: {
  91. getScrollTop() { // 获取滚动条位置
  92. var scrollTop=0;
  93. if(document.documentElement&&document.documentElement.scrollTop) {
  94. scrollTop=document.documentElement.scrollTop;
  95. } else if(document.body) {
  96. scrollTop=document.body.scrollTop;
  97. }
  98. return scrollTop;
  99. }
  100. }
  101. })
  102. </script>
  103. <style scoped lang="scss">
  104. .nav-bar-wrapper {
  105. width: 100%;
  106. height: 78px;
  107. border-bottom: 1px solid #f0f0f0;
  108. box-shadow: 0 2px 10px rgba(0,0,0,.05);
  109. }
  110. .nav-bar-wrapper .content-wrapper {
  111. width: 90%;
  112. margin: 0 auto;
  113. }
  114. .nav-bar-wrapper .nav-bar-content h1 {
  115. margin: 0;
  116. }
  117. .nav-bar-wrapper .nav-bar-content h1:hover {
  118. animation: logo .6s;
  119. }
  120. .nav-bar-content .nav-bar-item ul li {
  121. margin:0 10px;
  122. color: #777;
  123. }
  124. .nav-bar-content .nav-bar-item ul li:hover {
  125. color: #3399CC;
  126. }
  127. .fixed {
  128. position: fixed;
  129. top: 0;
  130. left: 0;
  131. z-index: 800;
  132. background: #fff;
  133. }
  134. @keyframes logo {
  135. 0% {
  136. transform: scale(1);
  137. }
  138. 25% {
  139. transform: scale(1.1);
  140. }
  141. 50% {
  142. transform: scale(1);
  143. }
  144. 75% {
  145. transform: scale(1.1);
  146. }
  147. 100% {
  148. transform: scale(1);
  149. }
  150. }
  151. .nav-bar-fixed {
  152. position: fixed;
  153. width: 100%;
  154. top: 30px;
  155. left: 0;
  156. height: 48px;
  157. overflow: hidden;
  158. }
  159. .top-navBar {
  160. width: 100%;
  161. border-bottom: 1px solid #f0f0f0;
  162. box-shadow: 0 2px 10px rgba(0,0,0,.05);
  163. overflow: hidden;
  164. transition: all .3s cubic-bezier(.645,.045,.355,1);
  165. transform: translateY(-48px);
  166. }
  167. .up {
  168. transform: translateY(0px);
  169. }
  170. ul li {
  171. display: inline-block;
  172. list-style: node;
  173. }
  174. .app-main {
  175. height: 2000px;
  176. font-size: 100px;
  177. writing-mode:tb-rl;
  178. margin: 110px auto;
  179. }
  180. .flex-sb {
  181. display: flex;
  182. justify-content: space-between;
  183. align-items: center;
  184. flex-wrap: wrap;
  185. }
  186. </style>

这里有两个主要的点
1,html 布局
2,isUp为true 或false的判断

文章由官网发布,如若转载,请注明出处:https://www.veimoz.com/113
0 评论
3.7k

发表评论

!