日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

web前端學習路線分享滾動穿透方法

 好程序員IT 2019-09-03

  web前端學習路線分享滾動穿透方法,這篇文章主要介紹Html5滾動穿透的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著一起學習學習吧。

  網站需要在移動端完成適配,針對移動端H5以及web端采用的都是bluma這種flex布局解決方案

  H5中使用的列表采用的是react-virtualized 來繪制表格

  為了展示表格中單行數據的具體詳情,通常的解決方案是采用新頁面或者是彈窗來完成。

  這里采用的是彈窗的方案,點擊單行數據后的數據詳情用的是blumamodal-card。

  在點擊單行數據后,彈窗顯示詳情數據,整個modal-card設置成position:fixed;

  沒有footer部分,設置modal-card的高度為整個屏幕的高度:100vh

  表現(xiàn):

  1、chrome瀏覽器中顯示,整個modal-card占滿整個屏幕

  2、在手機端顯示也是占滿,但是問題是,根據手勢移動,會將瀏覽器的搜索框部分往上頂,此時彈窗下面的數據列表頁能夠進行滑動,之后彈窗的標題覆蓋瀏覽器原搜索框部分,但這之間有延遲,能清晰看到下面頁面的數據

  3、在其他手-機上會有另外一種顯示,如果滑動速度比較快,彈窗出現(xiàn)后立即滑動,就會看到在彈窗的底部就會出現(xiàn)一個小的空白,同樣彈窗下面的頁面能夠滾動,并且有明顯延遲和數據滾動顯示。

  解決方案:

 modal-card 自身解決方案:

JS + CSS overflow:hidden

通過JS動態(tài)給彈窗下面的頁面html添加css類

1

2

3

4

5

6

7

8

9

10

11

12

13

14

if ($modalButtons.length > 0) {

    $modalButtons.forEach(function ($el) {

        $el.addEventListener('click', function () {

        var target = $el.dataset.target;

        openModal(target);

        });

    });

}

function openModal(target) {

    var $target = document.getElementById(target);

    rootEl.classList.add('is-clipped');

    $target.classList.add('is-active');

}

通過 overflow:hidden 來禁止頁面的滾動

1

2

3

is-clipped {

    overflow:hidden!important

}

當彈窗關閉時,通過JS刪除掉頁面的 css 類:is-clipped

1

2

3

4

5

6

function closeModals() {

    rootEl.classList.remove('is-clipped');

    $modals.forEach(function ($el) {

        $el.classList.remove('is-active');

    });

}

但是這種方案在應用中測試過后,發(fā)現(xiàn)并不能解決問題,上面的問題還是出現(xiàn)

position:fixed 方案

JS + CSS Position:fixed + scrollTop

方案思路:

1. 彈窗時,將html的position 設置為 fixed,將彈窗關閉后,將html的postion 屬性取消。

2. 因為列表頁會出現(xiàn)滾動的情況,而點擊的行有可能是在滾動發(fā)生后,所以需要計算html頁面本身的scrollTop 值。

3. 因為彈窗時設置position為fixed后,html頁面的 scrollTop 值會變成0,會回到頁面頂部,所以在關閉彈窗后,需要手動設置html頁面的scrollTop 值,讓其滾動到html頁面原來的位置。

4. 對于兼容性,需要設置不同屬性的 scrollTop 值

彈窗之前:

1

2

3

const scrollTop = global.document.documentElement.scrollTop || global.pageYOffset || global.document.body.scrollTop;

global.document.documentElement.style.position = 'fixed';

this.scrollTop = scrollTop;

關閉彈窗:

1

2

3

4

5

6

7

8

closeModalHandler = () => {

    const { closeOrderHistoryModal } = this.props;

    global.document.documentElement.style.position = '';

    global.pageYOffset = this.scrollTop;

    global.document.documentElement.scrollTop = this.scrollTop;

    global.document.body.scrollTop = this.scrollTop;

    closeOrderHistoryModal();

}

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多