中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用CSS 怎么實現用戶滾動位置應用樣式

發布時間:2021-06-09 16:41:01 來源:億速云 閱讀:166 作者:Leah 欄目:web開發

今天就跟大家聊聊有關使用CSS 怎么實現用戶滾動位置應用樣式,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

通過將當前滾動偏移量添加到到 html 元素的屬性上,我們可以根據當前滾動位置設置頁面上的元素樣式。我們可以使用它來構建一個浮動在頁面頂部的導航組件。

這是我們將使用的 HTML,<header> 組件是我們希望當我們向下滾動時,始終浮動在頁面頂部的一個組件。

<header>I'm the page header</header>
<p>Lot's of content here...</p>
<p>More beautiful content...</p>
<p>Content...</p>

首先,我們將監聽 document 上的 'scroll' 事件,并且每次用戶滾動時我們都會取出當前的 scrollY 值。

document.addEventListener('scroll', () => {
  document.documentElement.dataset.scroll = window.scrollY;
});

我們將滾動位置存儲在 html 元素的數據屬性中。如果您使用開發工具查看 DOM,它將如下所示:<html data-scroll="0">
現在我們可以使用此屬性來設置頁面上的元素樣式。

/* 保證 header標簽始終高于 3em */
header {
  min-height: 3em;
  width: 100%;
  background-color: #fff;
}

/* 在頁面頂部保留與 header 的 min-height 相同的高度 */
html:not([data-scroll='0']) body {
  padding-top: 3em;
}

/* 將 header 標簽切換成 fixed 定位模式,并且將它固定在頁面頂部 */
html:not([data-scroll='0']) header {
  position: fixed;
  top: 0;
  z-index: 1;

  /* box-shadow 屬性能夠增強浮動的效果 */
  box-shadow: 0 0 .5em rgba(0, 0, 0, .5);
}

基本上就是這樣,當用戶向下滾動時,header 標簽將自動從頁面中分離并浮動在內容之上。JavaScript 代碼并不關心這一點,它的任務就是將滾動偏移量放在數據屬性中。這很完美,因為 JavaScript 和 CSS 之間沒有緊密耦合。

但仍有一些可以改進的地方,主要是在性能方面。

首先,我們必須修改 JavaScript 腳本,以適應頁面加載時滾動位置不在頂部的情況。在這樣的情況下,header 標簽將呈現錯誤的樣式。

頁面加載時,我們必須快速獲取當前的滾動偏移量,這樣確保了我們始終與當前的頁面的狀態同步。

// 讀出當前頁面的滾動位置并將其存入 document 的 data 屬性中
// 因此我們就可以在我們的樣式表中使用它
const storeScroll = () => {
  document.documentElement.dataset.scroll = window.scrollY;
}

// 監聽滾動事件
document.addEventListener('scroll', storeScroll);

// 第一次打開頁面時就更新滾動位置
storeScroll();

接下來我們將看一些性能方面改進。如果我們想要獲取 scrollY 滾動位置,瀏覽器將必須計算頁面上每個元素的位置,以確保它返回正確的位置。如果我們不強制它每次滾動都取值才是最好的做法。

要做到這一點,我們需要一個 debounce(防抖動)方法,這個方法會將我們的取值請求加入一個隊列中,在瀏覽器準備好繪制下一幀之前都不會重新取值,此時它已經計算出了頁面上所有元素的位置,所以它不會不斷重復相同的工作。

// 防抖動函數接受一個我們自定義的函數作為參數
const debounce = (fn) => {

  // 這包含了對 requestAnimationFrame 的引用,所以我們可以在我們希望的任何時候停止它
  let frame;
  
  // 防抖動函數將返回一個可以接受多個參數的新函數
  return (...params) => {
    
    // 如果 frame 的值存在,那就清除對應的回調
    if (frame) { 
      cancelAnimationFrame(frame);
    }

    // 使我們的回調在瀏覽器下一幀刷新時執行
    frame = requestAnimationFrame(() => {
      
      // 執行我們的自定義函數并傳遞我們的參數
      fn(...params);
    });

  } 
};

// Reads out the scroll position and stores it in the data attribute
// so we can use it in our stylesheets
const storeScroll = () => {
  document.documentElement.dataset.scroll = window.scrollY;
}

// Listen for new scroll events, here we debounce our `storeScroll` function
document.addEventListener('scroll', debounce(storeScroll));

// Update scroll position for first time
storeScroll();

通過標記事件為 passive 狀態,我們可以告訴瀏覽器我們的滾動事件不會被觸摸交互阻止(例如與谷歌地圖等插件交互時)。這允許瀏覽器立即滾動頁面,因為它現在知道該事件不會被阻止。

document.addEventListener('scroll', debounce(storeScroll), { passive: true });

解決了性能問題后,我們現在可以通過穩定的方式使用 JavaScript 將獲取的數據提供給 CSS,并可以使用它來為頁面上的元素添加樣式。

看完上述內容,你們對使用CSS 怎么實現用戶滾動位置應用樣式有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

css
AI

南安市| 肥东县| 奈曼旗| 庆阳市| 乌兰县| 冕宁县| 东城区| 武功县| 淅川县| 五莲县| 香格里拉县| 婺源县| 呈贡县| 柳林县| 光山县| 思南县| 聂拉木县| 紫云| 航空| 望江县| 明溪县| 章丘市| 固始县| 洪湖市| 民权县| 通河县| 长泰县| 呼和浩特市| 松阳县| 唐山市| 日喀则市| 册亨县| 瑞安市| 磴口县| 澄江县| 穆棱市| 云阳县| 南昌市| 红原县| 台北县| 磐石市|