最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

原生JavaScript實現(xiàn)滾動條效果

 更新時間:2020年03月24日 09:30:24   作者:藤原國清  
這篇文章主要介紹了原生JavaScript實現(xiàn)滾動條效果的相關(guān)資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例講解原生JavaScript實現(xiàn)滾動條效果的相關(guān)代碼,分享給大家供大家參考,具體內(nèi)容如下

原理是對滑動條塊進行監(jiān)聽,按下鼠標按鍵后,監(jiān)聽鼠標移動,然后根據(jù)滑動條塊移動的百分比算出滾動區(qū)域的滾動程度,用marginLeft進行滾動,具體的寫在注釋里。

整體弄成了一個對象,防止各種亂七八糟的數(shù)據(jù)污染全局變量。另外,對象內(nèi)部調(diào)用的函數(shù)也都寫到了對象構(gòu)造函數(shù)的里面,由于對象作用域鏈的原理,外部無法進行調(diào)用,防止不小心在外部調(diào)用。

<!DOCTYPE html>
<html>
<head>
 <title>Blank Page for Rich Text Editing</title>
 <meta http-equiv="content-type" name="author" content="Fujihara No Kokukiyo" />
 <meta charset="utf-8" />
</head>
<style rel="stylesheet" type="text/css">
 .outer{width:500px;border:1px solid black;overflow:hidden;margin:50px 0 0 100px;}
 .test_div{width:1200px;background-image:linear-gradient(90deg,lightcoral 0%,lightgreen 50%,lightblue 100%);height:150px;}
 .slider_bar,.slider_block{ border-radius:5px;}
 .slider_bar{position:relative;width:80%;margin:5px auto 5px auto;background-color:lightgreen;height:5px;}
 .slider_block{width:20px;height:5px;background-color:grey;cursor:pointer;position:absolute;}
</style>
<script type="text/javascript">
 window.onload=function(){
  /**
   * 滑動條對象構(gòu)造函數(shù),
   * 內(nèi)含其他功能性函數(shù),利用函數(shù)作用域鏈的原理,防止自己隨意調(diào)用
   * 兼容:firefox、opera、chrome
   * ie沒試,然而顯然不兼容舊版本ie(8及之前),因為舊版本ie添加事件監(jiān)聽函數(shù)的方法不同。如若要兼容ie,還需要添加其他函數(shù)
   * js生成的滑動條類名為slider_bar、滑動塊類型為slider_block,可用css樣式自己設置大小、顏色等。
   * 滑動條左右padding未限制滑動條界限,如若需要限制,須在計算部分進行細小修改,加算padding,此處略去。
   *
   * @param {DOMElement} slider_content 被滾動的元素(不是被滾動元素的父元素)
   */
  function Slider(slider_content){
   //slider_instance為對象本身(在事件處理函數(shù)中會進行訪問,而事件處理函數(shù)中的this對象已被注入為event.currentTarget,因此預先存儲)
   var slider_instance=this;
   //this.slider_content為被滾動的元素
   this.slider_content=slider_content;
   //this.outer為被滾動元素的父元素
   this.outer=slider_content.parentNode;
   //創(chuàng)建滑動條
   this.slider_bar=createSliderBar();
   //創(chuàng)建滑動條塊
   this.slider_block=createSliderBlock();
   //拼裝
   this.slider_bar.appendChild(this.slider_block);
   this.outer.appendChild(this.slider_bar);
   //被滾動元素可被滾動的總寬度
   this.slider_content_width=this.slider_content.offsetWidth-this.outer.clientWidth;
   //滑動條塊可滑動的總寬度
   this.slider_bar_width=this.slider_bar.clientWidth-this.slider_block.offsetWidth;
   //被滾動元素的左邊距(相對父元素)
   this.slider_content_left=0;
   //滾動塊的左邊距(相對父元素)
   this.slider_block_left=0;
   //滑動條的左邊距(相對視口)
   this.slider_bar_pageLeft=getPageLeft(this.slider_bar);
   //滑動條塊添加鼠標壓鍵事件
   this.slider_block.addEventListener("mousedown",mousedownHandler,false);
   //離開父元素后取消鼠標移動事件
   this.outer.addEventListener("mouseleave",mouseupHandler,false);
   //鼠標彈鍵時取消鼠標移動事件
   this.outer.addEventListener("mouseup",mouseupHandler,false);
   /**
    * 創(chuàng)建滑動條
    */
   function createSliderBar(){
    var slider_bar=document.createElement("div");
    slider_bar.className="slider_bar";
    return slider_bar;
   }
   /**
    * 創(chuàng)建滑動條塊
    */
   function createSliderBlock(){
    var slider_block=document.createElement("div");
    slider_block.className="slider_block";
    return slider_block
   }
   /**
    * 鼠標按下事件處理
    */
   function mousedownHandler(event){
    //計算鼠標相對滑動塊的左邊距,進而在鼠標移動事件處理函數(shù)中使用
    //鼠標相對滑動塊左邊距=鼠標相對視口左邊距-滑動塊相對視口左邊距
    slider_instance.mouseLeft=event.clientX-getPageLeft(this);
    console.log(getPageLeft(this));
    slider_instance.outer.addEventListener("mousemove",mousemoveHandler,false);
   }
   /**
    * 鼠標移動事件處理
    */
   function mousemoveHandler(event){
    //計算出應當設置的滑動塊左邊距(相對于父容器)
    //滑動塊相對于滑動條左邊距=鼠標相對于視口左邊距-滑動條相對于視口左邊距-鼠標相對于滑動塊左邊距
    var blockLeft=event.clientX-slider_instance.slider_bar_pageLeft-slider_instance.mouseLeft;
    //如若滑動塊相對于父容器左邊距大于滑動塊可移動寬度或小于0,表示過界;設置為左右界限值
    if(blockLeft>slider_instance.slider_bar_width){
     blockLeft=slider_instance.slider_bar_width
    }else if(blockLeft<0){
     blockLeft=0;
    }
    //設置滑動塊的新位置
    slider_instance.slider_block.style.left=blockLeft+"px";
    //按照滾動塊已滾動的百分比,設置被滾動元素的marginLeft(負值),進而讓其滾動起來
    //被滾動元素的左margin=-(滑動塊相對于滑動條左邊距/可滑動最大寬度*可滾動元素的最大寬度)
    slider_instance.slider_content.style.marginLeft="-"+(blockLeft/slider_instance.slider_bar_width*slider_instance.slider_content_width)+"px";
   }
   /**
    * 鼠標鍵彈起事件處理
    */
   function mouseupHandler(event){
    slider_instance.outer.removeEventListener("mousemove",mousemoveHandler,false);
   }
   /**
    * 獲得元素的視口左邊距
    */
   function getPageLeft(el){
    var result=el.offsetLeft;
    var parent=el.offsetParent;
    while(parent!==null){
     result+=parent.offsetLeft;
     parent=parent.offsetParent;
    }
    return result;
   }
  }
  //用test_div元素進行展示
  new Slider(document.getElementsByClassName("test_div")[0]);

 }
</script>
<body>
<div class="outer">
 <div class="test_div"></div>
</div>
</body>
</html>

希望本文所述對大家學習javascript程序設計有所幫助。

相關(guān)文章

  • php中給js數(shù)組賦值方法

    php中給js數(shù)組賦值方法

    PHP函數(shù)庫提供了編/解碼JSON的函數(shù):json_encode()和json_decode(),可以比較方便的傳遞數(shù)組或?qū)ο蠼ojavascript
    2014-03-03
  • JavaScript樹結(jié)構(gòu)深度優(yōu)先算法

    JavaScript樹結(jié)構(gòu)深度優(yōu)先算法

    這篇文章主要介紹了JavaScript樹結(jié)構(gòu)深度優(yōu)先算法,樹結(jié)構(gòu)可以說是前端中最常見的數(shù)據(jù)結(jié)構(gòu)之一,比如說DOM樹、級聯(lián)選擇、樹形組件,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-07-07
  • 微信JS接口大全

    微信JS接口大全

    這篇文章主要為大家分享了最全面詳細的微信JS接口大全,希望對大家有幫助,感興趣的小伙伴們可以參考一下
    2016-08-08
  • HTML+CSS+JS實現(xiàn)抓娃娃機游戲

    HTML+CSS+JS實現(xiàn)抓娃娃機游戲

    這篇文章主要介紹了如何利用HTML+CSS+JS制作抓娃娃機游戲,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 前端如何實現(xiàn)對本地文件的IO操作詳解

    前端如何實現(xiàn)對本地文件的IO操作詳解

    這篇文章主要給大家介紹了關(guān)于前端如何實現(xiàn)對本地文件IO操作的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • 自制的文件上傳JS控件可支持IE、chrome、firefox etc

    自制的文件上傳JS控件可支持IE、chrome、firefox etc

    這篇文章主要介紹了自制的文件上傳JS控件可支持IE、chrome、firefox etc,需要的朋友可以參考下
    2014-04-04
  • 有關(guān)json_decode亂碼及NULL的問題

    有關(guān)json_decode亂碼及NULL的問題

    json decode出現(xiàn)中文亂碼,返回null,很多朋友都遇到過吧,該怎么解決呢?下面小編把解決辦法分享在腳本之家網(wǎng)站上,供大家學習
    2015-10-10
  • 原生JS實現(xiàn)簡單計算器功能

    原生JS實現(xiàn)簡單計算器功能

    這篇文章主要為大家詳細介紹了原生JS實現(xiàn)簡單計算器功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 微信JSSDK調(diào)用微信掃一掃功能的方法

    微信JSSDK調(diào)用微信掃一掃功能的方法

    這篇文章主要為大家詳細介紹了微信JSSDK調(diào)用微信掃一掃功能的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • javascript+xml實現(xiàn)簡單圖片輪換(只支持IE)

    javascript+xml實現(xiàn)簡單圖片輪換(只支持IE)

    看著許多網(wǎng)站都有廣告自動輪換;自己試著寫了一個圖片輪換,代碼和功能都很簡單,只支持IE的,FF的還要加些東東,需要了解的朋友可以參考下
    2012-12-12

最新評論

手机| 巴林左旗| 乌恰县| 阜南县| 湄潭县| 广南县| 庆阳市| 秦皇岛市| 山丹县| 潮州市| 嘉鱼县| 资源县| 滦平县| 和政县| 邻水| 龙州县| 平阴县| 定远县| 柏乡县| 日喀则市| 景洪市| 林周县| 西和县| 双流县| 肇源县| 延安市| 白城市| 许昌市| 莱州市| 宁河县| 和田县| 灯塔市| 寿宁县| 东方市| 桃园县| 南汇区| 黄大仙区| 威宁| 永昌县| 互助| 庆城县|