var timeclose;
 var timeopen;
 var nHeight;
 function toggle(sDivId){
      var oDiv=document.getElementById(sDivId);
      if (getStyle(oDiv,'display' )=='block'){
  nHeight=fullHeight(oDiv);
  closediv(oDiv);
                  alert(getStyle(oDiv,'display'));//这里得到的结果总是 'block‘
 }
         else if(getStyle(oDiv,'display')=='none'){
        opendiv(oDiv);
 }
   }
//收缩
function closediv(elem){
clearInterval(timeclose);
clearInterval(timeopen);
if (getStyle(elem,'display')=='block'){
       timeclose=setInterval(function(){closepanel(elem);},10);
   //alert(nHeight);
  
}
}
function closepanel(elem){
    var cy=fullHeight(elem);
if (cy>0){
    elem.style.height=(cy-Math.ceil(cy/5))+"px";
}
else{
    clearInterval(timeclose);
    elem.style.display="none";//在收缩动作完成后,设置display属性为none,但在上面检测总是为blok
}
}
//展开
function opendiv(elem){
    clearInterval(timeclose);
clearInterval(timeopen);
elem.style.display="block";
elem.style.height="1px";

timeopen=setInterval(function(){openpanel(elem);},10);

}
function openpanel(elem){
    var cy=fullHeight(elem);
if (cy<nHeight){
    elem.style.height=(cy+Math.ceil((nHeight-cy)/5))+"px";
}
else{
    clearInterval(timeopen);
}
 
 
}
-----------------------------------
自己做一个面板收缩、展开的动画效果,可是红字代码的设置办什么不起作用呢?
本人新手,求高手指教

解决方案 »

  1.   

    应该你的条件判断有问题吧。没看到fullHeight的定义
      

  2.   

    fullHeight的定义在这里:function fullHeight( elem ) {
        if ( getStyle( elem,'display')!= 'none')
            return elem.offsetHeight || getHeight( elem );
        var old = resetCSS( elem, {
            display:'',
            visibility: 'hidden',
            position: 'absolute'
        });
        var h = elem.clientHeight || getHeight( elem );    restoreCSS( elem, old );    return h;
    }这是一个得到元素高度的函数。
      

  3.   

    我的全部源码如下,请各位指教:
     var timeclose;
     var timeopen;
     var nHeight;//保存元素原始高度的参数
     function toggle(sDivId){
          var oDiv=document.getElementById(sDivId);
     if (getStyle(oDiv,'display' )=='block'){
         nHeight=fullHeight(oDiv);
         closediv(oDiv);
         alert(getStyle(oDiv,'display'));
     }
             else if(getStyle(oDiv,'display')=='none')
     {
                opendiv(oDiv);
     }
       }
    //获取元素的样式属性 
    function getStyle( elem, name ) {
        if (elem.style[name])   
            return elem.style[name];
        else if (elem.currentStyle)  
            return elem.currentStyle[name];
        else if (document.defaultView && document.defaultView.getComputedStyle) { 
            name = name.replace(/([A-Z])/g,"-$1");
            name = name.toLowerCase();
            var s = document.defaultView.getComputedStyle(elem,"");
            return s && s.getPropertyValue(name);
        } else
            return null;
    }function getHeight( elem ) {
        return parseInt( getStyle( elem, 'height' ) );  
    function fullHeight( elem ) {
        if ( getStyle( elem,'display')!= 'none')
            return elem.offsetHeight || getHeight( elem );
            var old = resetCSS( elem, {
            display:'',
            visibility: 'hidden',
            position: 'absolute'
        });
        var h = elem.clientHeight || getHeight( elem );
        restoreCSS( elem, old );
        return h;
    }function fullWidth( elem ) {
        if ( getStyle( elem, 'display' ) != 'none' )
            return elem.offsetWidth || getWidth( elem );
            var old = resetCSS( elem, {
            display: '',
            visibility: 'hidden',
            position: 'absolute'
        });    var w = elem.clientWidth || getWidth( elem );
        restoreCSS( elem, old );
        return w;
    }function resetCSS( elem, prop ) {
        var old = {};
        for ( var i in prop ) {
            old[ i ] = elem.style[ i ];
            elem.style[ i ] = prop[i];
        }
        return old;
    }function restoreCSS( elem, prop ) {
        for ( var i in prop )
            elem.style[ i ] = prop[ i ];
    }//收缩
    function closediv(elem){
    clearInterval(timeclose);
    clearInterval(timeopen);
    if (getStyle(elem,'display')=='block'){
           timeclose=setInterval(function(){closepanel(elem);},10);
      
    }
    }
    function closepanel(elem){
        var cy=fullHeight(elem);
    if (cy>0){
        elem.style.height=(cy-Math.ceil(cy/5))+"px";
    }
    else{
        clearInterval(timeclose);
        elem.style.display="none";
    //alert(getStyle(oDiv,'display'));
    }
    }
    //展开
    function opendiv(elem){
        clearInterval(timeclose);
    clearInterval(timeopen);
    elem.style.display="block";
    elem.style.height="1px";

    timeopen=setInterval(function(){openpanel(elem);},10);

    }
    function openpanel(elem){
        var cy=fullHeight(elem);
    if (cy<nHeight){
        elem.style.height=(cy+Math.ceil((nHeight-cy)/5))+"px";
    }
    else{
        clearInterval(timeopen);
    }
     
     
    }
      

  4.   

    哇,孟老大的回复啊,真是三生有幸!!问题已解决,确实是判断的问题:
    function closepanel(elem){
      var cy=fullHeight(elem);
    if (cy>0){    <-----------------------------------这里,cy总是大于0,所以不会执行else后面的语句,改为cy>10后搞定了。谢谢孟老大的提醒。
    elem.style.height=(cy-Math.ceil(cy/5))+"px";
    }
    else{
    clearInterval(timeclose);
    elem.style.display="none";
    //alert(getStyle(oDiv,'display'));
    }
    }