上下左右滑动时固定表头、列&上拉加载
思路
显示结构
.cross
.row
.row
data.clos
data
data
data.clos
data
data
思路步骤
配置BScroll
配置项
声明BScroll
的scroll
事件函数:onScroll
,在里面取得全部.cross
/.row
/.clos
元素,并对每一个元素添加transform
样式,且记录实时滚动的x,y
值。.cross
的x,y
实时同步;.row
的x
为0,y
同步;.clos
的x
同步,y
为0。
声明BScroll
的pullUpLoad
事件(上拉加载)函数:onPullUpLoad
,在函数里获取数据,用this.$nextTick()
获取全部.cross
/.row
/.clos
元素,并对每一个元素添加transform
样式,设置为声明时所记录的实时滚动的x,y
值。
代码
// html
< div class = " wrapper" >
< div class = " content" ref = " BScroll" >
< table>
< tr>
< th class = " cross" > </ th>
< th class = " rows" > </ th>
< th class = " rows" > </ th>
</ tr>
< tr>
< td class = " clos" > </ td>
< td> </ td>
< td> </ td>
</ tr>
< tr>
< td class = " clos" > </ td>
< td> </ td>
< td> </ td>
</ tr>
</ table>
< div class = " loadMore" > 上拉加载更多....</ div>
</ div>
</ div>
< style> .content { overflow : hidden; max-height : max-height; } </ style>
data ( ) {
return {
scroller: null ,
X : 0 ,
Y : 0 ,
flag: false ,
}
} ,
_init ( ) {
const that = this
this . scroller = new BScroll ( this . $refs. BScroll, {
preventDefault: false ,
probeType: 3 ,
scrollX: true ,
scrollY: true ,
momentum: false ,
directionLockThreshold: 0 ,
bounce: {
top: false ,
bottom: true ,
left: false ,
right: false
} ,
pullUpLoad: {
threshold: 50
}
} )
function _onScroll ( ) {
const frozenCrosses = document. querySelectorAll ( '#wrapper .cross' ) ;
const frozenRows = document. querySelectorAll ( '#wrapper .rows' ) ;
const frozenClos = document. querySelectorAll ( '#wrapper .clos' ) ;
const loadMore = document. querySelectorAll ( '#wrapper .loadMore' ) ;
that. X = this . x
that. Y = this . y
frozenCrosses. forEach ( ( el) => {
el. style. transform = `translate( ${ this . x} px, ${ this . y} px, 0px)`
} )
frozenRows. forEach ( ( el) => {
el. style. transform = `translate(0px, ${ this . y} px, 0px)`
} )
frozenClos. forEach ( ( el) => {
el. style. transform = `translate( ${ this . x} px, 0px, 0px)`
} )
loadMore. forEach ( ( el) => {
el. style. transform = `translate(0px, ${ this . y} px, 0px)`
} )
}
function _onPullUpLoad ( ) {
if ( ! that. flag) {
that. $nextTick ( ( ) => {
const frozenCrosses = document. querySelectorAll ( '#wrapper .cross' ) ;
const frozenRows = document. querySelectorAll ( '#wrapper .rows' ) ;
const frozenClos = document. querySelectorAll ( '#wrapper .clos' ) ;
const loadMore = document. querySelectorAll ( '#wrapper .loadMore' ) ;
frozenCrosses. forEach ( ( el) => {
el. style. transform = `translate3d( ${ that. x} px, ${ that. y} px, 0px)`
} )
frozenRows. forEach ( ( el) => {
el. style. transform = `translate3d(0px, ${ that. y} px, 0px)`
} )
frozenClos. forEach ( ( el) => {
el. style. transform = `translate3d( ${ that. x} px, 0px, 0px)`
} )
loadMore. forEach ( ( el) => {
el. style. transform = `translate3d(0px, ${ that. y} px, 0px)`
} )
} )
that. scroller. finishPullUp ( )
that. scroller. refresh ( )
}
}
this . scroller. on ( 'scroll' , _onScroll)
this . scroller. on ( 'scrollEnd' , _onScroll)
this . scroller. on ( 'pullingUp' , _onPullUpLoad)
this . scroller. on ( 'beforeScrollStart' , ( ) => {
setTimeout ( ( ) => {
this . scroller. refresh ( )
} , 20 )
} )
} ,
mounted ( ) {
this . $nextTick ( ( ) => {
this . _init ( )
} )
}