滚动条无法滚动
来源:1-1 Header和侧栏
强强强哥
2019-09-28 19:09:37
<template>
<me-scroll :scrollbar="false">
<ul class="tab">
<li
class="tab-item"
:class="{'tab-item-active': item.id === curId}"
v-for="(item, index) in items"
:key="index"
@click="switchTab(item.id)"
>{{item.name}}</li>
</ul>
</me-scroll>
</template>
<script>
import MeScroll from 'base/scroll';
import {categoryNames} from './config';
export default {
name: 'CategoryTab',
components: {
MeScroll
},
data() {
return {
curId: ''
};
},
created() {
this.init();
this.switchTab(this.items[0].id);
},
methods: {
init() {
this.items = categoryNames;
},
switchTab(id) {
if (this.curId === id) {
return;
}
this.curId = id;
this.$emit('switch-tab', id);
}
}
};
</script>
<style lang="scss" scoped>
@import "~assets/scss/mixins";
$tab-item-height: 46px;
.tab {
width: 100%;
&-item {
height: $tab-item-height;
background-color: #fff;
border-right: 1px solid $border-color;
border-bottom: 1px solid $border-color;
color: #080808;
font-size: $font-size-l;
font-weight: bold;
text-align: center;
line-height: $tab-item-height;
@include ellipsis();
&:last-child {
border-bottom: none;
}
}
&-item-active {
background: none;
border-right: none;
color: #f23030;
}
}
</style>
// category 页面代码
<template>
<div class="category">
<div class="g-header-container">
<category-header/>
</div>
<div class="g-content-container">
<div class="sidebar">
<category-tab/>
</div>
<div class="main"></div>
</div>
</div>
</template>
<script>
import CategoryHeader from './header'
import CategoryTab from './tab'
export default {
name: 'Category',
components: {
CategoryHeader,
CategoryTab
}
}
</script>
<style scoped lang="scss">
@import "~assets/scss/mixins";
.category {
overflow:hidden;
width:100%;
height:100%;
background-color: $bgc-theme;
}
.g-content-container {
display: flex;
padding-top: $navbar-height;
}
.sidebar {
width: 80px;
height: 100%;
}
.main {
flex: 1;
height: 100%;
}
</style>
// scroll 页面代码
<template>
<swiper :options="swiperOption" ref="swiper">
<div class="mine-scroll-pull-down" v-if="pullDown">
<me-loading :text="pullDownText" inline ref="pullDownLoading"/>
</div>
<swiper-slide>
<slot></slot>
</swiper-slide>
<div class="mine-scroll-pull-up" v-if="pullUp">
<me-loading :text="pullUpText" inline ref="pullUpLoading"/>
</div>
<!-- 滚动条-->
<div class="swiper-scrollbar" v-if="scrollbar" slot="scrollbar"></div>
</swiper>
</template>
<script>
import {swiper, swiperSlide} from 'vue-awesome-swiper'
import MeLoading from 'base/loading'
import {
PULL_DOWN_HEIGHT,
PULL_DOWN_TEXT_INIT,
PULL_DOWN_TEXT_START,
PULL_DOWN_TEXT_ING,
PULL_DOWN_TEXT_END,
PULL_UP_HEIGHT,
PULL_UP_TEXT_INIT,
PULL_UP_TEXT_START,
PULL_UP_TEXT_ING,
PULL_UP_TEXT_END
} from './config'
export default {
name: 'MeScroll',
components: {
swiper,
swiperSlide,
MeLoading
},
props: {
scrollbar: {
type: Boolean,
default: true
},
// 接收来自 home组件的data数据
data: {
type: [Object, Array]
},
pullDown: {
type: Boolean,
default: false
},
pullUp: {
type: Boolean,
default: false
}
},
data () {
return {
// // 标志位 判断是否在 下拉
// pulling: false,
// pullDownText: PULL_DOWN_TEXT_INIT,
// pullUpText: PULL_UP_TEXT_INIT,
// swiperOption: {
// direction: 'vertical', // 垂直方向滑动
// slidesPerView: 'auto',
// freeMode: true, // 自由模式
// setWrapperSize: true, // 设置容器的大小
// scrollbar: {
// el: this.scrollbar ? '.swiper-scrollbar' : null, // 滚动条元素
// hide: true // 滚动条自动隐藏
// },
// on: {
// sliderMove: this.scroll,
// touchEnd: this.touchEnd
// }
// }
}
},
watch: {
// 监听传递数据的变化 调用更新滚动条的方法
data () {
this.update()
}
},
methods: {
update () {
// console.log(this.$refs.swiper)
// 调用swiper实例上的swiper.update() 方法更新滚动条
this.$refs.swiper && this.$refs.swiper.swiper.update()
},
// 一个Api 给外部组件使用 返回顶部
scrollToTop (speed, runCallbacks) {
this.$refs.swiper && this.$refs.swiper.swiper.slideTo(0, speed, runCallbacks)
},
init () {
// 标志位 判断是否在 下拉
this.pulling = false
this.pullDownText = PULL_DOWN_TEXT_INIT
this.pullUpText = PULL_UP_TEXT_INIT
this.swiperOption = {
direction: 'vertical', // 垂直方向滑动
slidesPerView: 'auto',
freeMode: true, // 自由模式
setWrapperSize: true, // 设置容器的大小
scrollbar: {
el: this.scrollbar ? '.swiper-scrollbar' : null, // 滚动条元素
hide: true // 滚动条自动隐藏
},
on: {
sliderMove: this.scroll,
touchEnd: this.touchEnd,
transitionEnd: this.scrollEnd
}
}
},
scroll () {
const swiper = this.$refs.swiper.swiper
// console.log(swiper.translate)
// 当我们滚动的时候传递一个事件
this.$emit('scroll', swiper.translate, this.$refs.swiper.swiper)
if (this.pulling) {
return
}
if (swiper.translate > 0) { // 下拉
// 判断用户是否需要下拉
if (!this.pullDown) {
return
}
if (swiper.translate > PULL_DOWN_HEIGHT) {
// 在滚动条组件里面设置一个方法 在这里调用方法 改变text内容
this.$refs.pullDownLoading.setText(PULL_DOWN_TEXT_START)
} else {
this.$refs.pullDownLoading.setText(PULL_DOWN_TEXT_INIT)
}
} else if (swiper.isEnd) { // 上拉 是否到底了
if (!this.pullUp) {
return
}
const isPullUp = Math.abs(swiper.translate) + swiper.height - PULL_UP_HEIGHT > parseInt(swiper.$wrapperEl.css('height'))
if (isPullUp) {
this.$refs.pullUpLoading.setText(PULL_UP_TEXT_START)
} else {
this.$refs.pullUpLoading.setText(PULL_UP_TEXT_INIT)
}
}
},
scrollEnd () {
const swiper = this.$refs.swiper.swiper
this.$emit('scroll-end', swiper.translate, swiper, this.pulling)
},
touchEnd () {
const swiper = this.$refs.swiper.swiper
if (this.pulling) {
return
}
if (swiper.translate > PULL_DOWN_HEIGHT) { // 下拉
// 判断用户是否需要下拉
if (!this.pullDown) {
return
}
this.pulling = true
swiper.allowTouchMove = false // 禁止触摸
swiper.setTransition(swiper.params.speed) // 速度
swiper.setTranslate(PULL_DOWN_HEIGHT) // 回到设定的位置
swiper.params.virtualTranslate = true // 定住不给回弹
this.$refs.pullDownLoading.setText(PULL_DOWN_TEXT_ING)
// 发布一个事件 已经开始下拉了
this.$emit('pull-down', this.pullDownEnd)
} else if (swiper.isEnd) { // 底部
const totalHeight = parseInt(swiper.$wrapperEl.css('height'))
const isPullUp = Math.abs(swiper.translate) + swiper.height - PULL_UP_HEIGHT > totalHeight
if (isPullUp) { // 上拉
if (!this.pullUp) {
return
}
this.pulling = true
swiper.allowTouchMove = false // 禁止触摸
swiper.setTransition(swiper.params.speed) // 速度
swiper.setTranslate(-(totalHeight + PULL_UP_HEIGHT - swiper.height)) // 回到设定的位置
swiper.params.virtualTranslate = true // 定住不给回弹
this.$refs.pullDownLoading.setText(PULL_UP_TEXT_ING)
// 发布一个事件 已经开始下拉了
this.$emit('pull-up', this.pullUpEnd)
}
}
},
pullDownEnd () {
const swiper = this.$refs.swiper.swiper
// 注意要按顺序来写 不然会出错
this.pulling = false
this.$refs.pullDownLoading.setText(PULL_DOWN_TEXT_END) // 改变提示内容
swiper.params.virtualTranslate = false // 给回弹
swiper.allowTouchMove = true // 允许触摸
swiper.setTransition(swiper.params.speed) // 速度
swiper.setTranslate(0) // 回到0的位置
// 当下拉完成时 派发一个事件
setTimeout(() => {
this.$emit('pull-down-transition-end')
}, swiper.params.speed)
},
pullUpEnd () {
const swiper = this.$refs.swiper.swiper
// 注意要按顺序来写 不然会出错
this.pulling = false
this.$refs.pullDownLoading.setText(PULL_UP_TEXT_END) // 改变提示内容
swiper.params.virtualTranslate = false // 给回弹
swiper.allowTouchMove = true // 允许触摸
}
},
created () {
this.init()
}
}
</script>
<style lang="scss" scoped>
.swiper-container {
overflow: hidden;
width: 100%;
height: 100%;
}
.swiper-slide {
height: auto;
}
.mine-scroll-pull-down,
.mine-scroll-pull-up {
position: absolute;
left: 0;
width: 100%;
}
.mine-scroll-pull-down{
height: 80px;
bottom: 100%;
}
.mine-scroll-pull-up{
height: 30px;
top: 100%;
}
</style>1回答
好帮手慕星星
2019-09-29
同学你好,
指的是左侧tab无法滚动吗?这边测试你粘贴的代码效果是可以的哦,如下:

可以将category文件夹下的config.js文件代码粘贴上来,老师再测试下。
可以看看控制台中是否有报错,如果有的话,可以将报错信息粘贴上来哦,便于准确定位问题所在。
祝学习愉快!
相似问题