better-scroll实现菜单和内容联动的效果
发布时间:2019-12-06 16:06:06 作者:闪闪发光 我要评论
这篇文章主要介绍了better-scroll实现菜单和内容联动的效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!
【 如果你想靠AI翻身,你先需要一个靠谱的工具! 】
1、基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | <!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" > < meta name = "viewport" content = "width=device-width, initial-scale=1.0" > < meta http-equiv = "X-UA-Compatible" content = "ie=edge" > < title >Document</ title > < link href = "https://unpkg.com/element-ui/lib/theme-chalk/index.css" rel = "stylesheet" > < style > *{ margin: 0; padding: 0; border: 0; outline: none; font-family: Arial; list-style: none; -webkit-font-smoothing: antialiased; } html, body, #app{ height: 100%; } #app{ padding: 20px 0; box-sizing: border-box; } .wrapper{ display: flex; height: 100%; overflow: hidden; max-width: 1200px; margin: 0 auto; } .menu{ width: 100px; height: 100%; padding-right: 20px; } .content{ flex: 1; height: 100%; overflow: hidden; position: relative; } .menu-item{ margin-bottom: 10px; } .menu-item-content{ width: 100%; padding: 7px 0; text-align: center; border: 1px solid #ddd; border-radius: 2px; color: #333; cursor: pointer; } .active{ border-color: #409EFF; background: #409EFF; color: #fff; } .content-item{ margin-bottom: 20px; } .content-item-text{ border-radius: 2px; border: 1px solid #ddd; } .content-item-text>img{ width: 100%; vertical-align: middle; } </ style > </ head > < body > < div id = "app" > < div class = "wrapper" > < div class = "menu" > < ul > < li class = "menu-item" v-for = "(item, index) in menu" :key = "index" @ click = "handleClick(index)" > < div class = "menu-item-content" :class = "{'active': getCurrentIndex() == index}" v-text = "item.label" ></ div > </ li > </ ul > </ div > < div class = "content" ref = "content" > < ul > < li class = "content-item" v-for = "(item, index) in content" :key = "index" > < div class = "content-item-text" > < img :src = "item" alt = "" > </ div > </ li > </ ul > </ div > </ div > </ div > < script src = "https://cdn.jsdelivr.net/npm/better-scroll" ></ script > < script src = "https://cdn.jsdelivr.net/npm/vue/dist/vue.js" ></ script > < script src = "https://unpkg.com/element-ui/lib/index.js" ></ script > < script > new Vue({ el: '#app', data: { contentScroll: null, listHeight: [], // 用来存储每一个子盒子的高度 currentIndex: 0, scrollY: 0, menu: [ { label: '图片一', id: 0, }, { label: '图片二', id: 1, }, { label: '图片三', id: 2, }, { label: '图片四', id: 3, }, { label: '图片五', id: 4, }, ], content: [ 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1575539093143&di=d3d787658bd0b0f21d2459d90b3bd19b&imgtype=jpg&src=http%3A%2F%2Fimg4.imgtn.bdimg.com%2Fit%2Fu%3D1735688044%2C4235283864%26fm%3D214%26gp%3D0.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1575539192878&di=f46b69a4c2db2ba2f07f0fe1cc7af952&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201210%2F04%2F20121004231502_NrBQG.jpeg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1575539157019&di=122152eaee12d6ea019b2cec2b80e468&imgtype=0&src=http%3A%2F%2Fpic44.nipic.com%2F20140723%2F18505720_094503373000_2.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1575539175569&di=d33d35a826cc700add7b7bd53f9282c0&imgtype=0&src=http%3A%2F%2Fpic37.nipic.com%2F20140103%2F10616010_215644481373_2.jpg', 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1575539212191&di=ec438ea6559d06cc1a49a27b122e8edf&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fblog%2F201312%2F09%2F20131209151602_evtcw.jpeg', ] }, methods: { initScroll() { const content = this.$refs.content; this.contentScroll = new BScroll(content, { click: true, // 因为betterscroll默认会阻止点击事件。这里要设置一下 mouseWheel: true, // 鼠标滚轮滚动 probeType: 3, scrollY: true, scrollbar: { fade: true, // 是否显示滚动条 interactive: false, // 1.8.0 新增 }, preventDefault: false, // 阻止了浏览器默认选中行为 }); // 获取滚动的值,赋值给scrollY this.contentScroll.on('scroll', pos => { this.scrollY = Math.abs(Math.round(pos.y)); }); }, getCurrentIndex() { for (let i = 0; i < this.listHeight.length ; i++) { const height = this .listHeight[i]; const height1 = this .listHeight[i + 1]; // 解决当滚动到最后时,内容不足盒子高度时,菜单显示问题。当滚动到最后,选中最后一个菜单 // maxScrollY:最大纵向滚动位置 if (Math.abs(this.contentScroll.maxScrollY) === Math.abs(this.scrollY)) { return this.content.length - 1; } if (!height1 || (this.scrollY < height1 && this.scrollY >= height)) { return i; } } }, handleClick(index) { const content = this.$refs.content; const contentList = content.getElementsByClassName('content-item'); const el = contentList[index]; // scrollToElement:滚动到目标元素 this.contentScroll.scrollToElement(el, 300); }, getHeightList() { this.listHeight = []; let height = 0; this.listHeight.push(height); const content = this.$refs.content; const contentList = content.getElementsByClassName('content-item'); for (let i = 0; i < contentList.length ; i++) { const item = contentList [i]; height += item.clientHeight; this.listHeight.push(height); } this.initScroll(); } }, mounted() { this.$nextTick(function() { // 由于图片太大,加载比较慢,造成还没有完全加载完就初始化了,导致滚动不了,所以这里加个定时器延迟下 setTimeout(() => { this.getHeightList(); }, 400); }); }, }); </ script > </ body > </ html > |
由于浏览器的兼容性,每个浏览器的滚动条样式都不尽相同,使用css样式修改的话,也只有部分浏览器能达到你想要的效果。
better-scroll模拟实现滚动条,父容器设置固定高度,并设置属性 overflow:hidden,让子元素超出父容器后隐藏,better-scroll作用在父容器上,通过transform:translate属性来让子元素滚动到想要的地方。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
如何使用CSS的object-position实现图片在img标签中的定位
该文章介绍了CSS中的object-position属性,用于精确控制替换元素在容器内的位置,通过指定水平和垂直方向的偏移量,可以实现精准定位2024-11-08- 文章主要探讨了CSS Grid布局在Internet Explorer(IE)中的不兼容问题,并提供了具体的解决方案和最佳实践,文章首先介绍了CSS Grid布局的基本概念和与传统布局方法的区别,然2024-11-08
- 本文介绍了CSS实现圆角渐变边框的方法,首先设置元素边框为1像素宽度,样式为实线,颜色为透明,然后设置元素边框圆角为10像素,再设置背景剪裁区域和背景绘制区域为内边距和边2024-10-29
- 在CSS布局中,实现元素左右排列有多种方式,Flex布局通过设置margin-left:auto或margin-right:auto实现元素靠右或靠左排列,Grid布局利用grid-template-columns和justify-self2024-10-29
- 在CSS中,隐藏滚动条同时保留滚动功能可以通过设置overflow属性和使用特定的CSS伪元素实现,例如,使用::-webkit-scrollbar针对WebKit浏览器,-ms-overflow-style适用于IE和Edg2024-10-29
- 本文详细介绍了CSS中的border属性及其相关特性,包括border-width(宽度)、border-style(样式)和border-color(颜色)等,此外,还讲述了如何独立控制元素的四个边的边框,2024-10-28
- 本文主要介绍了在网页开发中如何实现“回到顶部”的功能,通过HTML和CSS的编写,可以实现一个浮动在页面右下角的小图标,点击后即可回到页面顶部,这种设计可以提高网站的可用2024-10-28
- 盒子模型是网页布局的基础,包括边框、外边距、内边距和实际内容,通过CSS可以控制盒子之间的距离及其外观,如边框样式、边框颜色等,重要属性包括padding和margin,分别控制内2024-10-18
- 盒子模型是网页布局的基础,包括边框、外边距、内边距和实际内容,通过CSS可以控制盒子之间的距离及其外观,如边框样式、边框颜色等,重要属性包括padding和margin,分别控制内2024-10-18
CSS使用filter和backdrop-filter实现高斯模糊效果(示例代码)
本文详细介绍了CSS3中的两个实现高斯模糊效果的API:filter和backdrop-filter,filter可以直接在图像或背景图上添加多种效果,而backdrop-filter则用于在元素后的区域添加效2024-09-26
最新评论