js元素在中心點由小變大顯示效果和隱藏

antzone發表於2017-04-07

在不少的功能中有類似的,效果,那麼就是元素能夠從中心點進行放大和縮小。

下面就通過程式碼例項介紹一下如何利用javascript實現此功能。

程式碼如下:

[HTML] 純文字檢視 複製程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<style type="text/css">
#main{
  width:500px; 
  margin:100px;
  height:500px;
  border:1px solid red
}
#test{
  border:1px solid red;
  display:none;
  width:10px;
  height:10px; 
  background:yellow
}
</style>
<script type="text/javascript">
function $(o){
  return document.getElementById(o);
}
 
function XslideDown(obj,type,mX,num) {
  if(!type){return;}
  try{
    var type1=type=="height"?"marginTop":"marginLeft";
    var type2=type=="height"?"top":"left";
    XSetCss(obj,[type1,XgetOffset(obj)[type2]+"px"]);
    XSetCss(obj,[type,XgetOffset(obj)[type]+num+"px"]);
    if(XgetOffset(obj)[type]<mX){
      setTimeout(function(){XslideDown(obj,type,mX,num);},10); 
    }
    else{
      XSetCss(obj,[type,mX])
    }
  }
  catch(e){}
}
 
function XslideUp(obj,type,mX,num) {
  if(!type){return;}
  try{
    var type1=type=="height"?"marginTop":"marginLeft";
    var type2=type=="height"?"top":"left";
    XSetCss(obj,[type1,XgetOffset(obj)[type2]+"px"]);
    XSetCss(obj,[type,XgetOffset(obj)[type]-num+"px"]);
    if(XgetOffset(obj)[type]>mX){ 
      setTimeout(function(){XslideUp(obj,type,mX,num);},1); 
    }
    else{
      XSetCss(obj,[type,mX])
      obj.style.display="none";
    }
  }
  catch(e){}
}
 
function XSetCss(obj,cssArgs){
  if(arguments.length==2){ 
    if(cssArgs.constructor==Object){
      for(var o in cssArgs){
        if(obj.style[o]!="undefiend"){
          obj.style[o]=cssArgs[o]; 
        } 
      } 
    }
    if(cssArgs.constructor==Array&&cssArgs.length==2){
      obj.style[cssArgs[0]]=cssArgs[1]; 
    }
  }
}
 
function XgetOffset(obj){
  return {
    height:obj.offsetHeight,
    width:obj.offsetWidth,
    top:parseInt((obj.parentNode.offsetHeight-obj.offsetHeight)/2),
    left:parseInt((obj.parentNode.offsetWidth-obj.offsetWidth)/2)
  }
}
 
function XopenDiv(o){
  o.style.display="block";
  XslideDown(o,"width",400,10);
  XslideDown(o,"height",400,10);
}
function XcloseDiv(o){
  XslideUp(o,"width",10,10);
  XslideUp(o,"height",10,10);
}
 
window.onload=function(){
  $("bt").onclick=function(){
    XopenDiv($("test"))
  }
  $("bt1").onclick=function(){
    XcloseDiv($("test"))
  }
}
</script>
</head>
<body>
<input type="button" value="開啟" id="bt" />
<input type="button" value="關閉" id="bt1" />
<div id="main">
  <div id="test"></div>
</div>
</body>
</html>

上面的程式碼實現了我們的要求,下面介紹一下它的實現過程。

一.程式碼註釋:

(1).function $(o){  

  return document.getElementById(o);

},模擬實現了jQuery的id選擇器。

(2).function XslideDown(obj,type,mX,num) {},此函式實現了div元素擴充套件效果,第一個引數是要擴充套件的元素物件,第二個引數是width或者height屬性,第三個引數規定最大的尺寸,第四個參數列示每次增加的數目。

(3).if(!type){return;},如果不存在,那麼直接返回。

(4).try{} catch{}語句這裡也是為了安全起見。

(5).var type1=type=="height"?"marginTop":"marginLeft",如果type是"height",那麼就返回marginTop,否則返回marginLeft。

(6).var type2=type=="height"?"top":"left",和上面一樣的道理。

(7).XSetCss(obj,[type1,XgetOffset(obj)[type2]+"px"]),設定元素的左邊距和上邊距。

(8).XSetCss(obj,[type,XgetOffset(obj)[type]+num+"px"]),設定元素的width或者height值,每一次執行都會增加一定的尺寸。

(9).if(XgetOffset(obj)[type]<mX){

  setTimeout(function(){XslideDown(obj,type,mX,num);},10); 

},如果元素還沒有到達最大尺寸,那麼就採用遞迴的方式繼續執行上面的程式碼。

(10).else{

  XSetCss(obj,[type,mX+"px"])

},否則的話,設定為最大尺寸。

(11).function XSetCss(obj,cssArgs){

  if(arguments.length==2){ 

    if(cssArgs.constructor==Object){

      for(var o in cssArgs){

        if(obj.style[o]!="undefiend"){

          obj.style[o]=cssArgs[o]; 

        } 

      } 

    }

    if(cssArgs.constructor==Array&&cssArgs.length==2){

      obj.style[cssArgs[0]]=cssArgs[1]; 

    }

  }

},上面的程式碼就是設定元素的css屬性,第一個引數就是元素物件,第二個引數是一個Object物件或者陣列。

只是這兩種不同的資料型別,讀取屬性值得方式不同。

(12).function XgetOffset(obj){

  return {

    height: obj.offsetHeight,

    width: obj.offsetWidth,

    top:parseInt((obj.parentNode.offsetHeight-obj.offsetHeight)/2),

    left:parseInt((obj.parentNode.offsetWidth-obj.offsetWidth)/2)

  }

},此方法返回一個物件,物件包含四個屬性,分別是元素的長寬,還有元素能夠實現居中的上邊距和左邊距尺寸。

二.相關閱讀:

(1).三元運算子可以參閱javascript 三元運算子一章節。

(2).setTimeout()方法可以參閱setTimeout()一章節。

(3).constructor屬性可以參閱javascript constructor一章節。

(4).for in語句可以參閱javascript for in一章節。

(5).offsetHeight可以參閱js offsetHeight一章節。

(6).parseInt()可以參閱javascript parseInt()一章節。

相關文章