淘宝首页交互3--商品分类淡入淡出效果

1.html代码:css

<!--导航-->
                <div class="nav">
                    <ul>
                        <!-- 1 -->
                        <li class="nav_list">
                            <p class="nav_title">
                                <a href="#">女装</a>/<a href="#">男装</a>/<a href="#">内衣</a>
                            </p>
                            <!--对应隐藏的分类栏-->
                            <div class="service-float-item"  data-index="1" >
                            </div>  
                        </li>   
                        <li class="nav_list"><!-- 2 --></li>
                        <li class="nav_list"><!-- 3 --></li>
                        <li class="nav_list"><!-- 4 --></li>
                        <li class="nav_list"><!-- 5 --></li>
                        <li class="nav_list"><!-- 6 --></li>
                        <li class="nav_list"><!-- 7 --></li>
                        <li class="nav_list"><!-- 8 --></li>
                        <li class="nav_list"><!-- 9 --></li>
                    </ul>    
                </div> 
                       

2.js代码:html

/*导航栏*/
function side_nav(){
    var Nav = document.getElementById('nav');
    var navlist = Nav.getElementsByClassName('nav_list');
    
    var hidden_column = Nav.getElementsByClassName('service-float-item');
    //鼠标移入,右边的菜单显示出来
    for(var i=0; i<navlist.length; i++){
        navlist[i].index = i;
        navlist[i].onmouseover = function(){
            
            //淡入效果
            startMove(hidden_column[this.index], { opacity:1 }, 100);

            hidden_column[this.index].style.display = 'block';
        }

        navlist[i].onmouseout = function(){

            startMove(hidden_column[this.index], { opacity: 0 }, 100);

            hidden_column[this.index].style.display = 'none';
        }
    }
}

/*原生js封装的运动框架*/
//这个缓冲运动是能够调节缓冲的速度的,变量adjust;timerInterval能够设置每次运动的时间间隔 function startMove(obj, json,adjust,timeInterval,fn) { //关闭前一个定时器,解决对同个对象同时调用多个startMove()时,定时器叠加问题。 //使用obj.timer给每一个调用startMove()的对象赋予各自的定时器,防止多个对象同时调用startMove()时,同用一个定时器,而致使互相干扰。 clearInterval(obj.iTimer); var iCur = 0; //建立一个变量,用于存储 attr属性每时每刻的值 var iSpeed = 0; obj.iTimer = setInterval(function() { var iBtn = true; // 假设:全部的值都已经到了 for ( var attr in json ) { var iTarget = json[attr]; // 目标点,json数据格式 if (attr == 'opacity') { // *100 会有偏差 0000007 之类的 因此要用 Math.round() 会四舍五入 //针对在FF中opacity属性值为浮点数值问题,将属性值 四舍五入、转换成浮点型。 //乘以100,使opacity属性值与IE统一为百分数 iCur = Math.round(getStyle( obj, 'opacity' ) * 100); } else { iCur = parseInt(getStyle(obj, attr)); // cur 当前移动的数值 默认值 } //建立 递减的速度iSpeed变量。实现属性值的变速改变, 物体运动的速度 数字越小动的越慢 /adjust : 自定义的数字 iSpeed = ( iTarget - iCur ) / adjust; //(目标值‐当前值)/缩放系数=速度 //取整,解决浏览器忽略小于1px的数值 致使运动结束时,离目标值Itarget少几个像素的问题 iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed); // 某个值不等于目标点 if (iCur != iTarget) { iBtn = false; if (attr == 'opacity') { // 分别对IE和FF设置opacity属性值 obj.style.opacity = (iCur + iSpeed) / 100;//for 标准 obj.style.filter = 'alpha(opacity='+ (iCur + iSpeed) +')';//for IE } else { obj.style[attr] = iCur + iSpeed + 'px'; //给指定属性attr 添加值cur+iSpeed } } } // 都达到了目标点 if (iBtn) { clearInterval(obj.iTimer); fn && fn.call(obj); //只有传了这个函数才去调用 } },timeInterval); } //getStyle()函数 用于兼容IE和FF:获取 对象的 非行间样式中的属性的值。 obj:元素对象。 attr:属性名。 // 获取实际样式函数 function getStyle(obj, attr) { if (obj.currentStyle) { return obj.currentStyle[attr];//for IE } else { return getComputedStyle(obj, false)[attr];//for 标准 } }

注意:json

/*
* 在IE中,设置opacity属性时,元素样式中须要设置opacity属性,才能读取到opacity值。
*
* obj:元素对象。 attr:用引号包围的属性名。 iTarget:属性目标值。
*/浏览器

/*
* getComputedStyle是能够把一个元素全部的样式获取出来;
*
* 而元素的style只能获取到元素的style属性里面的值,若是元素的样式是外联的,就没办法获取了。
*
* currentStyle是ie出的一个产物,做用和getComputedStyle同样
*
* getComputedStyle是一个能够获取当前元素全部最终使用的CSS属性值。返回的是一个css样式声明对象
*/框架


缓冲动画:ide

逐渐变慢,最后中止
距离越远速度越大
速度由距离决定
速度=(目标值-当前值)/缩放系数
Bug :速度取整(使用Math方法),否则会闪
向上取整。Math.ceil(iSpeed)
向下取整。Math.floor(iSpeed)函数

经过查找发现element.currentStyle(attr)能够获取计算过以后的属性。
可是由于兼容性的问题,需封装getStyle函数。(万恶的IE)动画


透明度兼容处理:this

判断attr是否是透明度属性opacity 。
对于速度进行处理。
为透明度时,因为获取到的透明度会是小数,因此须要 * 100
而且因为计算机储存浮点数的问题,还须要将小数,进行四舍五入为整数。使用: Math.round(parseFloat(getStyle(element, attr)) * 100)。
不然,继续使用默认的速度。
对结果输出部分进行更改。
判断是透明度属性,使用透明度方法
不然,使用使用默认的输出格式。spa

相关文章
相关标签/搜索