DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> 原生JavaScript實現滾動條效果
原生JavaScript實現滾動條效果
編輯:關於JavaScript     

本文實例講解原生JavaScript實現滾動條效果的相關代碼,分享給大家供大家參考,具體內容如下

原理是對滑動條塊進行監聽,按下鼠標按鍵後,監聽鼠標移動,然後根據滑動條塊移動的百分比算出滾動區域的滾動程度,用marginLeft進行滾動,具體的寫在注釋裡。

整體弄成了一個對象,防止各種亂七八糟的數據污染全局變量。另外,對象內部調用的函數也都寫到了對象構造函數的裡面,由於對象作用域鏈的原理,外部無法進行調用,防止不小心在外部調用。

<!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(){
    /**
     * 滑動條對象構造函數,
     * 內含其他功能性函數,利用函數作用域鏈的原理,防止自己隨意調用
     * 兼容:firefox、opera、chrome
     * ie沒試,然而顯然不兼容舊版本ie(8及之前),因為舊版本ie添加事件監聽函數的方法不同。如若要兼容ie,還需要添加其他函數
     * js生成的滑動條類名為slider_bar、滑動塊類型為slider_block,可用css樣式自己設置大小、顏色等。
     * 滑動條左右padding未限制滑動條界限,如若需要限制,須在計算部分進行細小修改,加算padding,此處略去。
     *
     * @param {DOMElement} slider_content 被滾動的元素(不是被滾動元素的父元素)
     */
    function Slider(slider_content){
      //slider_instance為對象本身(在事件處理函數中會進行訪問,而事件處理函數中的this對象已被注入為event.currentTarget,因此預先存儲)
      var slider_instance=this;
      //this.slider_content為被滾動的元素
      this.slider_content=slider_content;
      //this.outer為被滾動元素的父元素
      this.outer=slider_content.parentNode;
      //創建滑動條
      this.slider_bar=createSliderBar();
      //創建滑動條塊
      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);
      /**
       * 創建滑動條
       */
      function createSliderBar(){
        var slider_bar=document.createElement("div");
        slider_bar.className="slider_bar";
        return slider_bar;
      }
      /**
       * 創建滑動條塊
       */
      function createSliderBlock(){
        var slider_block=document.createElement("div");
        slider_block.className="slider_block";
        return slider_block
      }
      /**
       * 鼠標按下事件處理
       */
      function mousedownHandler(event){
        //計算鼠標相對滑動塊的左邊距,進而在鼠標移動事件處理函數中使用
        //鼠標相對滑動塊左邊距=鼠標相對視口左邊距-滑動塊相對視口左邊距
        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程序設計有所幫助。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved