婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > html中dom元素滾動條滾動控制小結詳解

html中dom元素滾動條滾動控制小結詳解

熱門標簽:貴陽ai外呼系統 電銷外呼線路改不外呼線路 智能電銷機器人廣告語 crm外呼系統好不好 電話機器人批發 愛巢地圖標注 強訊外呼系統 重慶人工智能電銷機器人報價 長春極信防封電銷卡公司

不知道大家有沒有遇到過這樣的需求,在某個 dom 元素中添加新的子元素,然后要求如果新添加的新元素超出容器的范圍,那么我們需要自動滾動到新添加的子元素的位置,如下圖所示效果:

那么接下來我們一邊學習一些 dom 元素滾動相關的知識點,一邊實現一個上圖的效果和一些其他滾動相關的功能。

需要了解的dom屬性和方法 scrollTop、clientHeight和scrollHeight

scrollTop 屬性是一個描述容器元素內容的top值與容器元素( viewport )視口頂部 top 值之間的差值,即容器中內容向上滑動后超出容器視口的部分。可以通過修改此屬性控制滾動狀態。

clientHeight 是描述容器高度的 dom 屬性。

scrollHeight 是描述容器內容高度的 dom 屬性。

三個屬性的關系如下圖所示:

getBoundingClientRect()

此方法用來獲取元素布局所需的一些幾何屬性,比如 leftrighttopbottomheightwidth 等。

srollBy(x,y)

dom 容器的 scrollTo 方法可以用來直接控制滾動條滾動指定的距離。當需要滾動到指定元素時,使用此方法比較方便。

srollTo(x,y)

dom 容器的 scrollTo 方法可以用來直接控制滾動條滾動到指定位置。在控制滾動條滾動到頂部或者底部的時候使用此方法比較方便。

實現滾動控制 準備

我們先準備一個 html

<!DOCTYPE html>
<html>
    <head>
       <title>滾動條設置詳解</title>
       <style>
          #scroll_container{
              height: 500px;
              width: 500px;
              overflow-y: scroll;
              padding: 50px;
              box-sizing: border-box;
          }
          .scroll_item{
              height: 200px;
              width: 500px;
              margin-top: 20px;
              background-color: aquamarine;
              display: flex;
              align-items: center;
              justify-content: center;
          }
       </style>
    </head>
    <body>
       <div  id="scroll_container">
           <div  id="scroll_container">
               <div id="item1" class="scroll_item">
                   <span>1</span>
               </div>
               <div id="item2" class="scroll_item">
                    <span>2</span>
                </div>
                <div id="item3" class="scroll_item">
                    <span>3</span>
                </div>
                <div id="item4" class="scroll_item">
                    <span>4</span>
                </div>
                <div id="item5" class="scroll_item">
                    <span>5</span>
                </div> 
           </div>
           <button onclick="addItem()">添加一個元素</button>
       </div>
    </body>
    <script>
        let container=document.getElementById("scroll_container");
        let index=5;
        //添加一個元素
        function addItem(){
            index+=1;
            let item=`<div id="${'item'+index}" class="scroll_item">
                            <span>${index}</span>
                        </div>`;
            container.innerHTML+=item;  
            setTimeout(()=>{
                scrollToIndex();
            })
         }
    </script>
</html>

上面的代碼包含一個可滾動的區域,并可以為滾動區域添加元素,也可以滾動到指定的元素位置,大致效果如下圖。

使用scrollTop實現

基礎實現

之前已經說明過 scrollTop 的含義,我們可以通過修改容器元素 scrollTop 值來控制滾動條滾動。 scrollTop 的值越大,滾動條相對于原始狀態( scrollTop 為0時)的滾動距離越大。

了解了 scrollTop 的含義,我們就可以利用 scrollTop 來實現滾動條的控制,那么我們先實現一個滾動到底部的實現,為上面的代碼添加一個 scrollToBottom() 的方法:

function scrollToBottom(){
    let y=container.scrollHeight-container.clientHeight;
    container.scrollTop=y;
}

對應的如果想要實現滾動到頂部我們只需要設置 scrollTop 為0即可:

function scrollToTop(){
    container.scrollTop=0;
} 

結合 getBoundingClientRect() 方法我們也可以輕松實現滾動到指定元素,其中 getBoundingClientRect().top 表示子元素頂部距離父元素視口頂部的距離:

function scrollToElement(el){
     container.scrollTop+=el.getBoundingClientRect().top;
}

添加動畫

滾動到底部

但是上面代碼的滾動未免太生硬了,我們可以為它添加一下動畫效果,可以借助 setInterval() 實現一下。分析一下實現動畫效果的過程,動畫的實現無外乎是把一個變量的變化在一定的時間內完成,因此我們首先需要知道兩個變量,變量( scrollTop )偏移量和變化所需時間,而偏移量就是 scrollTop 的最終值減去原始值,變化時長一般設置成可以修改的參數。了解了以上過程,我們先以滾動到底部為例:

//首先編寫一個scrollToBottom函數
function scrollToBottom(el){
              if(!el){
                  el=container;
              }
              //原始值
              let startTop=el.scrollTop;
              //最終值
              let endTop=el.scrollHeight-el.clientHeight;
              //生成一個動畫控制函數
              let scrollAnimationFn=doAnimation(startTop,endTop,300,el);
              //執行動畫,每10ms執行一次
              let interval=setInterval(()=>{
                scrollAnimationFn(interval)
              },10)
 }
/**
 * @description: 一個生成動畫控制函數的工廠函數(使用閉包)
 * @param {
    startValue:變量原始值
    endValue:變量最終值
    duration:動畫時長
    el:執行滾動動畫的元素
 } 
 * @return: null
 */
function doAnimation(startValue,endValue,duration,el){
              //使用閉包保存變量dy和step(每次動畫滾動的距離)
              let dy=0;
              let step=(endValue-startValue)/(duration/10);
              //返回動畫控制函數
              return function(interval){
                  dy+=step;
                  if(dy>=endValue-startValue){
                      clearInterval(interval);
                  }
                  el.scrollTop+=step;
              }
 }

修改addItem函數添加滾動到底部動畫:

function addItem(){
            index+=1;
            let item=`<div id="${'item'+index}" class="scroll_item">
                            <span>${index}</span>
                        </div>`;
            container.innerHTML+=item;  
            setTimeout(()=>{
                // scrollToIndex();
                scrollToBottom(container);
            })
           
 }

然后為html加入一個滾動到底部的按鈕:

<button onclick="scrollToBottom()">滾動到底部</button>

滾動到頂部

按照上面的方法也可以實現一個常用的帶動畫滾動到頂部:

//編寫一個scrollToTop函數
function scrollToTop(el){
              if(!el){
                  el=container;
              }
              //原始值
              let startTop=el.scrollTop;
              //最終值
              let endTop=0;
              //生成一個動畫控制函數
              let scrollAnimationFn=doAnimation(startTop,endTop,300,el);
              //執行動畫,每10ms執行一次
              let interval=setInterval(()=>{
                scrollAnimationFn(interval)
              },10)
 }

為了適配滾動到底部我們需要修改一下動畫停止的時機判斷,修改后的 doAnimation() 函數如下:

function doAnimation(startValue,endValue,duration,el){
              //使用閉包保存變量dy和step(每次動畫滾動的距離)
              let dy=0;
              let step=(endValue-startValue)/(duration/10);
              return function(interval){
                  dy+=step;
                  //這里改成使用絕對值判斷
                  if(Math.abs(dy)>=Math.abs(endValue-startValue)){
                      clearInterval(interval);
                  }
                  el.scrollTop+=step;
              }
 }

最后我們再給 html 添加一個滾動到底部按鈕:

<button onclick="scrollToTop()">滾動到頂部</button>

實現效果如下圖:

滾動到指定元素

首先為html元素添加所需的按鈕和輸入框:

<input type="number" placeholder="請輸入要滾動到的元素index" style="width: 200px;"/>
<button onclick="scrollToElement()">滾動到指定元素</button>

添加一個滾動指定元素的動畫執行函數:

function scrollToElement(containerEl,el){
            if(!containerEl){
                //父元素
                containerEl=container;
            }
            if(!el){
                //獲取到要滾動到的元素
                let input=document.getElementsByTagName('input')[0];
                let id='item'+input.value;
                if(!input.value){
                    id='item'+index;
                }
                el=document.getElementById(id);
            }
            let startTop=containerEl.scrollTop;
            let endTop=startTop+el.getBoundingClientRect().top;
            let scrollAnimationFn=doAnimation(startTop,endTop,300,containerEl);
            let interval=setInterval(()=>{
                scrollAnimationFn(interval)
            },10)
}

實現效果如下:

使用scrollTo()實現

scrollTo(x,y) 的使用方法與 scrollTop 屬性的使用方法基本一致,父元素的 scrollTo() 方法可以控制滾動條滾動到指定位置,實際上相當于設置 scrollTop 的值。舉個例子說明一下:

//這里以y軸滾動為例
element.scrollTo(0,y);
element.scrollTop=y;
//上面兩句的效果相同。

所以,使用 scrollTo() 方法控制滾動條與使用scrollTop基本一致,我們只需要簡單修改 doAnimation() 函數,代碼如下:

function doAnimation(startValue,endValue,duration,el){
              //使用閉包保存變量dy和step(每次動畫滾動的距離)
              let dy=0;
              let step=(endValue-startValue)/(duration/10);
              return function(interval){
                  dy+=step;
                  if(Math.abs(dy)>=Math.abs(endValue-startValue)){
                      clearInterval(interval);
                  }
                  //el.scrollTop+=step;//這行代碼修改為如下
                  el.scrollTo(0,el.scrollTop+step);
              }
}

執行效果與使用 scrollTop 實現一致。

使用scrollBy()實現

基礎實現

我們同樣可以使用 scrollBy(x,y) 實現對滾動條的控制,上面已經說明過, scrollBy() 方法是控制滾動條滾動指定距離(注意不是位置)。使用scrollBy()可以很方便的實現滾動到指定元素的需求,代碼如下:

function scrollToElement(containerEl,el){
    //因為getBoundingClientRect().top即為子元素頂部距離父元素頂部的距離,所以這個值就是子元素相對于父元素的偏移量,我們傳入這個值到scrollBy中,即滾動到指定元素
    containerEl.scrollBy(0,el.getBoundingClientRect().top);
}

滾動到底部:

function scrollToBottom(containerEl){
    let dy=containerEl.scrollHeight-containerEl.clientHeight;
    containerEl.scrollBy(0,dy);
}

滾動到頂部

function scrollToTop(containerEl){
    let dy=-(containerEl.scrollHeight-containerEl.clientHeight);
    containerEl.scrollBy(0,dy);
}

添加動畫

這里我們修改一下動畫生成的函數,因為這里我們 scrollBy() 的參數就是變量的偏移量,所以做出如下修改:

function scrollToBottom(containerEl){
              if(!containerEl){
                containerEl=container;
              }
              //dy即為偏移量
              let dy=containerEl.scrollHeight-containerEl.clientHeight;
              let scrollAnimationFn=doAnimation(dy,300,containerEl);
              let interval=setInterval(()=>{
                scrollAnimationFn(interval)
              },10)
         }
         function scrollToTop(containerEl){
              if(!containerEl){
                containerEl=container;
              }
              //dy即為偏移量
              let dy=-(containerEl.scrollHeight-containerEl.clientHeight);
              let scrollAnimationFn=doAnimation(dy,300,containerEl);
              let interval=setInterval(()=>{
                scrollAnimationFn(interval)
              },10)
         }
         function scrollToElement(containerEl,el){
            if(!containerEl){
                containerEl=container;
            }
            if(!el){
                let input=document.getElementsByTagName('input')[0];
                let id='item'+input.value;
                if(!input.value){
                    id='item'+index;
                }
                el=document.getElementById(id);
            }
           //dy即為偏移量
            let dy=el.getBoundingClientRect().top;
            let scrollAnimationFn=doAnimation(dy,300,containerEl);
            let interval=setInterval(()=>{
                scrollAnimationFn(interval)
            },10)
         }
         /**
          * @description: 
          * @param {type} 
          * @return: 
          */
         function doAnimation(dy,duration,el){
              //使用閉包保存變量exe_dy和step等變量(每次動畫滾動的距離)
              let exe_dy=0;//已經執行的偏移量
              let step=dy/(duration/10);
              return function(interval){
                  exe_dy+=step;
                  if(Math.abs(exe_dy)>=Math.abs(dy)){
                      clearInterval(interval);
                  }
                  el.scrollBy(0,step);
              }
         }

執行效果與使用 scrollTop 實現一致。

最后

以上:point_up_2:就是自己對dom滾動條控制的詳細總結和講解,以及一些基本使用方法。

到此這篇關于html中dom元素滾動條滾動控制小結詳解的文章就介紹到這了,更多相關dom元素滾動條滾動內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章,希望大家以后多多支持腳本之家!

標簽:吳忠 清遠 廣安 山南 保定 陜西 內蒙古 上海

巨人網絡通訊聲明:本文標題《html中dom元素滾動條滾動控制小結詳解》,本文關鍵詞  html,中,dom,元素,滾動,條,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《html中dom元素滾動條滾動控制小結詳解》相關的同類信息!
  • 本頁收集關于html中dom元素滾動條滾動控制小結詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美综合亚洲图片综合区| 2023国产精品视频| 成人午夜免费电影| 青青草国产精品亚洲专区无| 亚洲国产一区二区三区| 色哟哟一区二区三区| 日韩精品高清不卡| 国产在线精品一区二区三区不卡 | 99久久久精品免费观看国产蜜| 日本sm残虐另类| 亚洲欧美精品午睡沙发| 五月婷婷激情综合网| 天天色天天爱天天射综合| 国产成人小视频| 91麻豆精品国产自产在线 | 福利一区福利二区| 精品国产一区久久| 亚洲人吸女人奶水| 久久美女艺术照精彩视频福利播放 | 欧美日韩一区三区| 欧美国产激情一区二区三区蜜月| 欧美日韩夫妻久久| 日本丶国产丶欧美色综合| 日韩女优视频免费观看| 久久久蜜桃精品| 日本一区二区不卡视频| 午夜精品久久久久影视| 成人av片在线观看| 欧美专区日韩专区| 亚洲欧美日韩成人高清在线一区| www欧美成人18+| 麻豆精品久久精品色综合| 婷婷国产v国产偷v亚洲高清| 亚洲人xxxx| 丁香网亚洲国际| 午夜精品成人在线视频| 欧洲生活片亚洲生活在线观看| eeuss国产一区二区三区| 99re热视频精品| 国产精品久久久久精k8| 国产欧美精品一区| 亚洲123区在线观看| 成人免费福利片| 欧美精品一区在线观看| 国产亚洲一区二区三区| 91美女蜜桃在线| 日韩一区中文字幕| 一本色道久久综合亚洲aⅴ蜜桃| 久久国产生活片100| 国产伦精一区二区三区| 亚洲黄色尤物视频| 国产一区二区三区四| 蜜臀精品一区二区三区在线观看| 精品第一国产综合精品aⅴ| 一本大道久久a久久精二百| 欧美日韩成人在线| 精品无码三级在线观看视频| 欧美精品aⅴ在线视频| 日本va欧美va欧美va精品| 国产精品美女www爽爽爽| 麻豆国产欧美日韩综合精品二区 | 日韩电影在线一区| 国产精品久久久久影院老司| 日本高清不卡在线观看| 国产麻豆精品在线| 一区精品在线播放| 国产精品久久久久一区二区三区| 久久久综合视频| 中文字幕欧美日本乱码一线二线| 久久综合色8888| av一区二区三区在线| 99视频一区二区三区| 91欧美一区二区| 717成人午夜免费福利电影| 国产精品主播直播| 国产女主播一区| 午夜精品一区二区三区电影天堂 | 国产精品入口麻豆九色| 一区在线观看视频| 另类小说综合欧美亚洲| 亚洲视频在线观看三级| 日本午夜一区二区| gogogo免费视频观看亚洲一| 在线观看一区日韩| 国内精品国产三级国产a久久| 欧洲色大大久久| 国产精品久久久久久户外露出| 成人激情午夜影院| 国产在线观看一区二区| 岛国一区二区三区| 国产成人av电影在线观看| 欧美日韩国产综合久久| 国产欧美日韩精品一区| 老司机午夜精品99久久| 91精品国产综合久久久蜜臀粉嫩 | 日韩一级二级三级| 亚洲欧美区自拍先锋| 国产一区二区毛片| 国产大陆a不卡| 日一区二区三区| 久久不见久久见中文字幕免费| 亚洲男人天堂av| 综合久久给合久久狠狠狠97色| 久久er精品视频| 欧美久久久久久久久| 一区二区久久久久久| 欧美另类高清zo欧美| 欧美日韩一区高清| 性久久久久久久| 日韩欧美中文字幕制服| 亚洲bt欧美bt精品777| 国产成人在线看| 久久av资源站| 一区免费观看视频| 欧美亚一区二区| 日韩一区二区免费在线电影| 久久精品av麻豆的观看方式| 4438x成人网最大色成网站| 日韩欧美国产一区二区在线播放| 久久久精品综合| 欧美欧美欧美欧美首页| 色屁屁一区二区| 蜜桃av噜噜一区| 欧美不卡一区二区三区| 日韩av电影一区| 中文字幕欧美激情一区| 精品欧美乱码久久久久久| 国产一区二区在线观看视频| 色噜噜偷拍精品综合在线| 老司机午夜精品| 欧美三区在线观看| 色综合色综合色综合色综合色综合 | 一区二区三区四区av| 久久久久国产精品麻豆ai换脸| 欧美这里有精品| 国产精品国产三级国产aⅴ中文| 亚洲成人av一区二区| 在线区一区二视频| 成人app在线观看| 激情综合五月天| 免费成人在线观看| 男男gaygay亚洲| 视频在线观看国产精品| 在线成人高清不卡| 欧美在线制服丝袜| 欧美日韩精品欧美日韩精品一| 欧美性生交片4| 在线免费av一区| 欧美三级蜜桃2在线观看| 依依成人综合视频| 欧美电影免费观看高清完整版在| 中文字幕日韩欧美一区二区三区| 国产精品欧美一区二区三区| 成人综合婷婷国产精品久久蜜臀 | 精品久久久久久久久久久久久久久久久 | 久久成人久久鬼色| 国产精品996| 亚洲欧洲成人av每日更新| 91久久国产综合久久| 午夜欧美一区二区三区在线播放| 精品理论电影在线| 国产91丝袜在线播放0| 国产99久久久久久免费看农村| 在线免费av一区| 国产在线视视频有精品| 日韩精品一区二区三区视频播放| 狠狠色丁香婷婷综合| 亚洲制服丝袜av| 久久九九久久九九| 欧美精品乱码久久久久久| 自拍av一区二区三区| 91丨porny丨首页| 国产精品高潮久久久久无| 午夜精品福利一区二区三区av | 国产精品亚洲视频| 五月婷婷另类国产| 亚洲免费观看高清完整版在线观看 | 91精品国产麻豆| 91久久精品日日躁夜夜躁欧美| 青青草精品视频| 亚洲免费色视频| 亚洲精品一二三| 尤物av一区二区| 亚洲永久免费视频| 一区二区不卡在线视频 午夜欧美不卡在| 久久久亚洲高清| 国产精品水嫩水嫩| 三级欧美韩日大片在线看| 亚洲成人三级小说| 成人国产在线观看| 日韩欧美专区在线| 天天av天天翘天天综合网| 精品无人区卡一卡二卡三乱码免费卡| 成人丝袜18视频在线观看| 欧美日韩黄视频| 亚洲影院免费观看| 欧美综合一区二区三区| 亚洲图片你懂的| 成人av先锋影音| 看电视剧不卡顿的网站|