摘要:對話內(nèi)容超過一屏,使對話內(nèi)容上移,當然是改變父元素的值啦用戶可以上下滑動對話框,就類似于滾動條效果,設(shè)置父元素高度并且,子元素高度即可。遇到問題局部滾動效果,以上想法設(shè)置父元素高度并且在端可以正常滑動,但在移動端失效。
起因
我司最近在做一個H5,有一個模擬微信對話框的需求,具體需求如下。
對話內(nèi)容固定,但需要一句一句顯示
對話內(nèi)容超過一屏后,需要使對話內(nèi)容上移
對話內(nèi)容結(jié)束后,用戶可以上下滑動對話框,查看詳細對話內(nèi)容
圖中灰色頭像表示獲取的用戶頭像
示例: 請看第二屏
初步設(shè)想使對話內(nèi)容一句一句顯示,腦子里立馬閃現(xiàn)出setInterval定時器。
對話內(nèi)容超過一屏,使對話內(nèi)容上移,當然是改變父元素的scrollTop值啦
用戶可以上下滑動對話框,就類似于滾動條效果,設(shè)置父元素高度并且 overflow:hidden,子元素高度auto即可。
獲取用戶頭像,這個薛微復雜,留做下一篇文章。
遇到問題局部滾動效果,以上想法(設(shè)置父元素高度并且 overflow:hidden)在PC端可以正常滑動,但 在移動端失效。
這種寫法,多帶帶寫沒有問題,但是IOS端出現(xiàn)卡頓現(xiàn)象,可以添加 -webkit-overflow-scrolling:touch; 解決。
但是,我司的H5頁面使用的swiper制作,大概是這個有一些影響,用戶滑動屏幕首先觸發(fā)了swiper的事件。(僅做設(shè)想,后續(xù)做進一步實踐)
于是在網(wǎng)上查了幾番,有以下幾種解決方法
用戶在解發(fā)touchmove事件時,改變元素的transform值
使用iscroll.js
使用swiper
改變元素的transform值改變元素的transform值,需要判斷用戶的滑動方向。
判斷滑動方向時,先了解兩個事件
touchstart :用戶手指按在屏幕上時觸發(fā)
touchmove:用戶滑動屏幕時觸發(fā)
了解了這兩個事件,我們可以在用戶觸發(fā)touchstart事件時,記錄手指位置,在touchmove記錄獲取手指最后停留的位置
判斷 最后停留位置 - 初始位置= pageY- startY = 即用戶滑動方向
(pageY-startY)為正數(shù)時,說明用戶向下滑動;為負數(shù)時,說明用戶向上滑動。
$(".message-wrapper").on("touchstart", function (e) { startY = e.type === "touchmove" ? e.targetTouches[0].pageY : e.pageY; }) $(".message-wrapper").on("touchmove", function (e) { pageY = e.type === "touchmove" ? e.targetTouches[0].pageY : e.pageY; })使用iscroll.js
網(wǎng)上有很多關(guān)于iscroll的資料,但是我查了一下官方的github,最近的更新在5年前,果斷不敢用~
使用swiper查了一番,swiper里的 swiper-scrollbar可以完美的實現(xiàn)這一功能,多帶帶寫這一功能,在真機測試沒有問題。然后移入到我們的項目中。出現(xiàn)以下幾個問題
局部滾動后的slide元素不顯示 分析原因出現(xiàn)這個問題的原因,是由于我司的H5項目也是由swiper制作,這意味著每一屏就相當于一個slide,當添加用swiper完成的局部滾動時,會造成后面父元素的slide元素不顯示。
解決辦法這涉及到多個swiper嵌套使用的問題,具體修改如下:
當頁面存在多個swiper,初始化時,盡量避免使用一樣的類名,如 .swiper-container,每個swiper有它多帶帶的類名
//父元素swiper//-------------------------------------------------------------swiper初始化
如果類名分開,父元素后續(xù)slide元素依然無法顯示
將子元素的初始化,寫在父元素初始化之前,加載時,優(yōu)先初始化子元素swiper
//初始化子swiper var scrollSwiper = new Swiper(".message-warp", { observer: true, observeParents: false, scrollbar: ".swiper-scrollbar", direction: "vertical", slidesPerView: "auto", mousewheelControl: true, freeMode: true, }) var swiper = new Swiper(".main-swiper", { direction: "vertical", touchRatio: 0.5, loop: false, on: { init: function () { swiperAnimate(this); }, slideChangeTransitionEnd: function (e) { swiperAnimate(this) } } });
以上方法都不能使后續(xù) 元素顯示
swiper運行時,會先給元素添加visiblity:hidden;使元素隱藏,只給當前頁的visiblity設(shè)置為visible;而swiper中,改元素顯示狀態(tài)的依據(jù)就是swiper-slide-active;
swiper默認給當前的slide添加swiper-slide-active類名。當頁面中存在swiper嵌套時,父元素的當前slide會添加該類名,子元素的當前slide也會添加該類名。
這樣當用戶滑出父元素的當前slide時父元素的swiper-slide-active被移除,而子元素的swiper-slide-active類名并沒有移除,造成swiper混亂,所以父元素后續(xù)slide的元素會無法顯示
解決辦法
我的做法是在父元素切換slide后,判斷頁面中swiper-slide-active的個數(shù),如果存在一個以上,則說明子元素的類名沒有移除。
手動將子元素的swiper-slide-active類名移除即可。
暫時還沒有想到更好的方法,如果你有更好的方法,歡迎一起討論。
if ($(".swiper-slide-active").length == 2) { $(".message-slide").removeClass("swiper-slide-active") }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104844.html
摘要:原文地址初衷如今移動端站點越來越多,滾動到底部加載數(shù)據(jù)和下拉刷新的需求非常的常見,即使現(xiàn)在很多站點也會有這樣的需求,比如百度首頁就有。 原文地址 https://github.com/fa-ge/Scrollload/blob/master/README.md 初衷 如今移動端站點越來越多,滾動到底部加載數(shù)據(jù)和下拉刷新的需求非常的常見,即使現(xiàn)在很多pc站點也會有這樣的需求,比如百度首頁...
摘要:使用方法首先看一下簡易第一步,實例化滾動對象代碼其實還是蠻簡單的,首先我們初始化一個滾動的實例,構(gòu)造函數(shù)擁有兩個參數(shù),第一個是一個負責管理頁面滾動時需要處理事務的函數(shù),這個函數(shù)接受三個參數(shù),分別表示當前頁面左移,向上移,縮放比信息。 ScrollerJS是什么 ScrollerJS是用于純邏輯的滾動縮放組件,它獨立于任何指定的渲染或者事件系統(tǒng)。上面是官方定義的,我再說一下我對這個庫的理...
摘要:寫著寫著發(fā)現(xiàn)會寫不少內(nèi)容全部寫在一篇文章里感覺太多了不方便看,所以分為上下篇吧下篇寫完啦,感興趣的朋友可以繼續(xù)關(guān)注開發(fā)仿旅游站項目總結(jié)下溫馨提示此文章,僅是做完項目后的個人覺得可以總結(jié)下來的操作思路,接觸不久的朋友應該會有收獲。 寫著寫著發(fā)現(xiàn)會寫不少內(nèi)容... 全部寫在一篇文章里感覺太多了不方便看,所以分為上下篇吧...下篇寫完啦,感興趣的朋友可以繼續(xù)關(guān)注 => Vue開發(fā)仿旅游站we...
摘要:寫著寫著發(fā)現(xiàn)會寫不少內(nèi)容全部寫在一篇文章里感覺太多了不方便看,所以分為上下篇吧下篇寫完啦,感興趣的朋友可以繼續(xù)關(guān)注開發(fā)仿旅游站項目總結(jié)下溫馨提示此文章,僅是做完項目后的個人覺得可以總結(jié)下來的操作思路,接觸不久的朋友應該會有收獲。 寫著寫著發(fā)現(xiàn)會寫不少內(nèi)容... 全部寫在一篇文章里感覺太多了不方便看,所以分為上下篇吧...下篇寫完啦,感興趣的朋友可以繼續(xù)關(guān)注 => Vue開發(fā)仿旅游站we...
閱讀 3630·2023-04-25 23:32
閱讀 2044·2019-08-30 15:55
閱讀 2659·2019-08-30 15:52
閱讀 3115·2019-08-30 10:54
閱讀 844·2019-08-29 16:16
閱讀 655·2019-08-29 15:09
閱讀 3659·2019-08-26 14:05
閱讀 1640·2019-08-26 13:22