better-scroll
github
最近專案使用了better-scroll這個外掛程式,這個外掛程式用起來還是有不少問題的。
除了普遍會遇到的無法滾動、無法點選等問題,這些作者都已經說得很清楚了。下面說說我遇到的其他問題及解決方法。
1.無法響應滑鼠滾輪滾動:
無法點選大家都知道了,在建立bscroll時傳入配置即可。但是在pc端時,你會發現滾輪無法使內容滾動,而且文件也沒有相關說明!看了原始碼後,發現配置乙個mousewheel
選項即可解決:
const scrollconfig =;
2.scrollbeh**ior
與better-scroll不相容
vue的scrollbeh**ior
可以用於配置路由,比如說滾動到錨點。但是如果你的錨點是在bscroll容器中,scrollbeh**ior
就失效了。解決:
mounted()else
}});
},
3.點選一次多次觸發
當設定click: true
,點選bscroll容器的元素時,會觸發兩次甚至多次click事件。這個問題在iscroll中也存在。解決辦法:
引入fastclick外掛程式。
原理不明。
4.position: fixed失效!
bscroll的滾動是用transform
的translate
來進行偏移,但是父元素設定了transform,所有子元素的position: fixed都不再相對於視口,而是相對於這個transform父元素!這不是什麼bug,而是規範中規定。一直以為fixed定位霸道至極,沒想到transform可以改變它的定位,學到了。
參考這樣的話,bscroll容器內的fixed定位元素就全亂套了。
google了一番,除了把fixed元素放出來,沒有什麼好辦法。有的人也說了:如果乙個元素是fixed定位,它就不應該被其他元素包裹,直接放到根元素下。
但是,你要知道,如果是使用第三方的元件庫,比如element、antdesign,我想改也改不了啊!
5.內層有原生滾動
內層有原生滾動會引起兩個問題:
(1) pc端當滑鼠移動到原生滾動元素上,滾動滾輪,內層原生滾動無響應!倒是bscroll容器發生了滾動,就好像內層這個滾動完全不存在。
解決辦法,阻止內層滾動的冒泡:
menu.addeventlistener('wheel', (e) =>);
同樣的,如果元素是第三方的元件,改起來很煩。
(2)移動端,引起外層抖動!
同樣是因為事件冒泡到外層,導致裡面滾,外面也滾。體驗極差。解決辦法:
menu.addeventlistener('touchstart', (e) =>);
同樣的,如果元素是第三方的元件,改起來很煩。
6.滾動條位置
我有兩個並列的scroll,一左一右。但是左邊scroll的滾動條竟然去到了瀏覽器右邊,檢視了一下屬性為right: 0。解決辦法,覆蓋樣式:
/deep/ div.bscroll-vertical-scrollbar
7.監聽事件
如何監聽事件文件中也沒有說:
bscroll.on('scroll', () => {});
8.容器需要固定高度
容器需要固定高度,這本來也沒什麼。如果高度是百分比,以適應容器父元素的高度變化。但是如果父元素也沒有高度呢?大家都知道,父元素沒高度時,子元素height: 100%
是無效的。我父元素要flex: 1自適應,這也是沒有高度的,父元素設定height: 100%
也是無效的。那麼如何讓父元素有高度又能自適應呢?
解決辦法:
position: absolute;height: 100%;
下面是我查問題時在issue看到的一些問題,記錄下來。(順便吐槽一下,issue也太亂了吧,完全把issue當貼吧了!github幾時能出個刪issue的功能啊!)
雙層巢狀問題
雙層巢狀使用了stoppropagation: true,但是裡面的滾動如果滾到底或者滾到頂部,觸發不了最外層的滾動。
解決辦法:內層滾動到底或者滾到頂部時,內層呼叫disable進行禁止,然後外層呼叫enable啟用。
最後,如果你不開啟preventdefault: false
,許多原生的效果都會失效。transform滾動也注定了原生滾動的失效。
總結使用心得:pc端沒必要引入!當初是考慮到專案要相容移動端才引入的。但沒想到帶來那麼多問題。如果移動端要做回彈動畫、下拉重新整理、無限滾動效果,是可以考慮使用的。如果要引入,可以做一下相容:在移動端時使用這個外掛程式,而在pc端時,呼叫destory方法銷毀bscroll,使用原生。
better scroll在vue中的坑
在我們日常的移動端專案開發中,處理滾動列表是再常見不過的需求了,以滴滴為例,可以是這樣豎向滾動的列表,如圖所示 也可以是橫向滾動的導航欄,如圖所示 我們在實現這類滾動功能的時候,會用到我寫的第三方庫,better scroll。什麼是 better scroll better scroll 是乙個移...
systemtap embedded C 踩坑筆記
官方文件 systemtap的embedded c中,不能 include 也不能用printf和print。那怎麼列印呢?用stap printf。用法與printf一樣。還可以訪問cript中的全域性變數。官方文件中的示例 global var global var2 100 function ...
Aggregation MongoDB踩坑記錄
對某些篩選條件進行分頁查詢,開始每一頁的有效data都不足pagesize,最後發現,aggregation 的pipeline是有先後順序的。錯誤 agg aggregation.newaggregation aggregation.skip curpage 1 pagesize aggregat...