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

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

html中dom元素滾動條滾動控制小結(jié)詳解

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

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

那么接下來我們一邊學(xué)習(xí)一些 dom 元素滾動相關(guān)的知識點,一邊實現(xiàn)一個上圖的效果和一些其他滾動相關(guān)的功能。

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

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

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

scrollHeight 是描述容器內(nèi)容高度的 dom 屬性。

三個屬性的關(guān)系如下圖所示:

getBoundingClientRect()

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

srollBy(x,y)

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

srollTo(x,y)

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

實現(xiàn)滾動控制 準備

我們先準備一個 html

<!DOCTYPE html>
<html>
    <head>
       <title>滾動條設(shè)置詳解</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>

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

使用scrollTop實現(xiàn)

基礎(chǔ)實現(xiàn)

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

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

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

對應(yīng)的如果想要實現(xiàn)滾動到頂部我們只需要設(shè)置 scrollTop 為0即可:

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

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

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

添加動畫

滾動到底部

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

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

修改addItem函數(shù)添加滾動到底部動畫:

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>

滾動到頂部

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

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

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

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>

實現(xiàn)效果如下圖:

滾動到指定元素

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

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

添加一個滾動指定元素的動畫執(zhí)行函數(shù):

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)
}

實現(xiàn)效果如下:

使用scrollTo()實現(xiàn)

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

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

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

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);
              }
}

執(zhí)行效果與使用 scrollTop 實現(xiàn)一致。

使用scrollBy()實現(xiàn)

基礎(chǔ)實現(xiàn)

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

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);
}

添加動畫

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

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;//已經(jīng)執(zhí)行的偏移量
              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);
              }
         }

執(zhí)行效果與使用 scrollTop 實現(xiàn)一致。

最后

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《html中dom元素滾動條滾動控制小結(jié)詳解》,本文關(guān)鍵詞  html,中,dom,元素,滾動,條,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《html中dom元素滾動條滾動控制小結(jié)詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于html中dom元素滾動條滾動控制小結(jié)詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品乱人伦小说| 欧美在线你懂的| 韩日av一区二区| 国产福利一区二区| 国产一区二区久久| 国产一区二区91| 成人黄色av网站在线| www.成人在线| 欧美性大战久久久久久久蜜臀 | 五月婷婷激情综合网| 亚洲第一搞黄网站| 久久99精品久久久久久国产越南 | 99久久国产综合精品麻豆 | 肉肉av福利一精品导航| 免费观看日韩电影| 国产精品99久久久久| 99re这里只有精品首页| 欧美精品在线观看一区二区| 欧美一区二区黄| 国产精品久久久久久久午夜片| 亚洲男同性恋视频| 精品一区二区三区在线播放| 成人蜜臀av电影| 欧美精品丝袜久久久中文字幕| 久久久综合精品| 亚洲午夜久久久久中文字幕久| 久久精品久久久精品美女| 波多野结衣在线一区| 欧美日韩免费视频| 国产精品欧美综合在线| 午夜精品免费在线| 成人国产精品免费| 日韩一级成人av| 亚洲欧美日韩国产手机在线| 美女在线一区二区| 欧美在线观看一二区| 久久久久久久久久久久电影| 一区二区三区91| 国产不卡视频在线观看| 欧美美女一区二区在线观看| 中文字幕二三区不卡| 免费在线观看一区| 欧美性三三影院| 国产精品久久午夜夜伦鲁鲁| 美女www一区二区| 欧美亚洲愉拍一区二区| 国产女同性恋一区二区| 日日夜夜精品视频天天综合网| 国产69精品一区二区亚洲孕妇| 欧美一区二区在线视频| 亚洲综合无码一区二区| 99精品视频在线观看免费| www国产成人免费观看视频 深夜成人网| 亚洲一区二区欧美日韩| 91年精品国产| 亚洲视频精选在线| 国产丶欧美丶日本不卡视频| 日韩免费观看高清完整版 | 久久精品国产99国产精品| 欧美吞精做爰啪啪高潮| 亚洲宅男天堂在线观看无病毒| 91视频国产资源| 亚洲日本电影在线| 91在线观看地址| 亚洲免费观看在线观看| 色综合久久天天综合网| 国产精品国产精品国产专区不蜜| 粉嫩高潮美女一区二区三区| 久久亚洲一级片| 成人免费视频网站在线观看| 日本一二三不卡| 91亚洲国产成人精品一区二区三| 亚洲婷婷综合色高清在线| av在线一区二区| 亚洲欧美日韩国产综合| 欧美三级资源在线| 免费高清视频精品| 久久免费看少妇高潮| 成人高清免费观看| 亚洲天堂网中文字| 欧美久久免费观看| 国产一区中文字幕| 国产精品国产自产拍在线| 91极品美女在线| 日本中文字幕一区二区视频| 欧美一级黄色录像| 成人高清免费观看| 亚洲成人综合在线| 欧美大白屁股肥臀xxxxxx| 国产一区欧美二区| 国产精品高清亚洲| 69p69国产精品| 国产成人精品三级| 亚洲一级二级三级| 精品久久久久久久一区二区蜜臀| 懂色av噜噜一区二区三区av| 一卡二卡三卡日韩欧美| 日韩精品中文字幕在线不卡尤物| 国产91丝袜在线18| 亚洲一区二区三区四区五区黄| 欧美成人精品二区三区99精品| 99在线精品视频| 麻豆久久久久久| 亚洲嫩草精品久久| 2020国产精品| 欧美日韩精品福利| 岛国精品在线播放| 美女视频黄频大全不卡视频在线播放| 国产精品国产精品国产专区不片| 日韩一区二区在线观看| 99国产精品国产精品毛片| 精品在线播放午夜| 亚洲动漫第一页| 国产精品人成在线观看免费| 91精品欧美一区二区三区综合在| 成人av影院在线| 国产一区二区不卡在线| 午夜不卡av免费| 亚洲久草在线视频| 国产调教视频一区| 日韩女优电影在线观看| 欧美日韩一级二级| 日本韩国视频一区二区| 国产suv精品一区二区883| 看电影不卡的网站| 日韩高清在线电影| 亚洲成av人综合在线观看| 中文字幕一区二区三区色视频| 精品成人在线观看| 日韩一级免费一区| 91麻豆精品国产91久久久| 欧美性xxxxx极品少妇| 色综合久久久久综合体| 成人国产精品视频| 国产精品中文有码| 国内成人自拍视频| 日本成人在线看| 天天影视网天天综合色在线播放| 一区二区三区四区在线免费观看 | 欧美日韩免费电影| 欧美丝袜自拍制服另类| 色婷婷国产精品| 99久久精品国产一区二区三区| 高清日韩电视剧大全免费| 国产精品亚洲人在线观看| 久久福利资源站| 久久99精品国产91久久来源| 久久国产婷婷国产香蕉| 国产在线不卡视频| 国产69精品久久久久毛片| www.亚洲国产| 91网站在线播放| 精品1区2区3区| 日韩一卡二卡三卡| 久久久久久一二三区| 国产日韩欧美电影| 亚洲欧美偷拍三级| 亚洲激情av在线| 午夜精彩视频在线观看不卡| 日日欢夜夜爽一区| 韩国中文字幕2020精品| 波多野结衣一区二区三区 | 91精品国产91久久久久久最新毛片| 欧美日韩国产乱码电影| 日韩一区二区电影网| 国产校园另类小说区| 国产日韩欧美a| 亚洲综合小说图片| 青青国产91久久久久久| 国产乱码精品一区二区三区忘忧草 | 欧美日韩一区小说| 欧美变态口味重另类| 国产精品欧美精品| 亚洲成人资源在线| 精品系列免费在线观看| 不卡的电视剧免费网站有什么| 欧美无乱码久久久免费午夜一区| 欧美电影免费观看高清完整版在线观看 | 成人午夜激情影院| 欧美性受xxxx黑人xyx性爽| 日韩免费在线观看| 1000部国产精品成人观看| 亚洲午夜免费电影| 国产美女av一区二区三区| 欧洲色大大久久| 国产亚洲欧美一级| 亚洲va国产天堂va久久en| 丁香婷婷综合色啪| 欧美精品黑人性xxxx| 国产精品成人免费精品自在线观看| 午夜免费久久看| 成人免费视频播放| 欧美大片免费久久精品三p| 亚洲精品第1页| 国产成人精品亚洲日本在线桃色| 91搞黄在线观看| 中文字幕第一区二区| 精品在线观看视频| 91麻豆精品91久久久久同性| 亚洲精品成人悠悠色影视|