• 电商商品滑动


    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style>
                *{
                    margin: 0;
                    padding: 0;
                }
                #box{
                position: relative;
                }
                #imgSmall{
                     400px;
                    height: 400px;
                    position:absolute;
                    top: 0;
                    left: 0;
                }
                #divSmall{
                     400px;
                    position: absolute;
                    top: 0;
                    left: 0;
                    height: 400px;
                }
                #divBig{
                     400px;
                    height: 400px;
                    position: absolute;
                    left:410px;
                    top: 0;
                    overflow: hidden;
                    opacity:0;
                    display: none;
                }
                #glass{
                     100px;
                    height: 100px;
                    background: rgba(0,0,0,.5);
                    position: absolute;
                    top:0;
                    left: 0;
                    overflow:hidden;
                    display: none;
                    opacity: 0;
                    cursor: pointer;
                }
                #imgSmall2{
                     400px;
                    height: 400px;    
                    position:absolute;
                    top: 0;
                    left:0;
                }
                #imgBig{
                    1600px;
                    height: 1600px;
                    position: absolute;
                    top: 0;
                    left: 0;
                }
                #mask{
                    400px;
                    height: 400px;
                    background: rgba(0,0,0,.5);
                    position: absolute;
                    top: 0;
                    left: 0;
                }
                #show{
                     400px;
                    height: 200px;
                    position: absolute;
                    top: 400px;
                    left:0;
                }
                #show div{
                    float: left;
                     20px;
                    height: 200px;
                    background: greenyellow;
                    text-align: center;
                    line-height: 200px;
                    font-size: 30px;
                    color:pink;
                }
                #show #div2{
                    360px;
                    background:yellowgreen;
                    overflow: hidden;
                }
                #div2 img{
                     150px;
                    height: 150px;
                }
                #div2 li{
                    float:left;
                    list-style: none;
                    height: 150px;
                    padding: 0 5px;
                    cursor: pointer;
                }
                #div2 ul{
                     640px;
                    padding-top:20px;
                }
            </style>
        </head>
        <body>
            <div id="box">
                <div id="divSmall">
                    <img id="imgSmall" alt="" src="img/img1.png"/>
                    <div id="mask"></div><!--设置一块幕布把原图遮起来-->
                    <div id="glass">
                        <img id="imgSmall2" src="img/img1.png"/>
                    </div>
                </div>
                <div id="divBig">
                    <img id="imgBig" src="img/img1.png" alt="" />
                </div>
            </div>
            <div id="show">
                <div id="div1">&lt;</div>
                <div id="div2">
                    <ul id="ul1">
                        <li><img src="img/img4.png" alt="" /></li>
                        <li><img src="img/img2.png" alt="" /></li>
                        <li><img src="img/img3.png" alt="" /></li>
                        <li><img src="img/img1.png" alt="" /></li>
                    </ul>
                </div>
                <div id="div3">&gt;</div>
            </div>
            <script src="startMove.js" type="text/javascript" charset="utf-8"></script>
            <script type="text/javascript">
                //当鼠标在小div上移动时
                divSmall.onmousemove = (e)=>{
                    //获取鼠标相对div整体的坐标,因为div定位相对于box定位所以
                var [x,y] = [e.clientX - box.offsetLeft,e.clientY - box.offsetTop];
                //定义鼠标在glass的中心 ,最大宽度减去元素本身一半。
                     x-=glass.offsetWidth/2;
                     y-= glass.offsetHeight/2; 
                    if(x<0){
                        x=0;//用来判断在原点位置时x轴是否会溢出,这里是左边
                    }
                    if(y<0){
                        y=0;//用来判断在原点位置时y轴是否会溢出,这里是右边
                    }
                    var maxX = divSmall.offsetWidth - glass.offsetWidth;
                    //定义glass在X轴可运动的最大范围
                    if(x>maxX){
                        x = maxX; //如果大于,就让它等于
                    }
                    var maxY = divSmall.offsetHeight - glass.offsetHeight;
                    //定义glass在Y轴可运动的最大范围
                    if(y>maxY){
                        y = maxY; //如果大于,就让它等于
                    }
                    [glass.style.left,glass.style.top] = [x+"px",y+"px"];
                    //把得到的鼠标移动的值传给glass
                    [imgBig.style.left,imgBig.style.top] = [-4*x+"px",-4*y+"px"];
                    //把得到的鼠标移动的值传给imgBig 负数是因为在操作时图片一定是相反的移动,
                    //4是倍数关系。
                    [imgSmall2.style.left,imgSmall2.style.top]=[-x+"px",-y+"px"] 
                    //类似于大图一样,移动时他也一定是相反运动
                }
                divSmall.onmouseout=()=>{
                    startMove(glass,{"opacity":0},()=>{
                        glass.style.display = "none";
                    });    
                    startMove(divBig,{"opacity":0},()=>{
                        divBig.style.display ="none";
                    });//先让运动执行完,然后在执行display
                    
                }
                divSmall.onmouseover=()=>{
                    startMove(glass,{"opacity":100});
                    glass.style.display = "block";
                    startMove(divBig,{"opacity":100});
                    divBig.style.display ="block";
                }
                var n=div2.scrollLeft;
                var timer ;
                div1.onmouseover =()=>{
                 timer = setInterval(()=>{
                    n++;
                    div2.scrollLeft=n++;
                    if(n>=280){
                        clearInterval(timer);
                    }
                    },10);    
                }
                div1.onmouseout =()=>{
                    clearInterval(timer);
                }
                    div3.onmouseover =()=>{
                 timer = setInterval(()=>{
                    n--;
                    div2.scrollLeft=n--;
                    if(n<=0){
                        clearInterval(timer);
                    }
                    },10);    
                }
                    div3.onmouseout=()=>{
                        clearInterval(timer);
                    }
                ul1.onclick =(e)=>{
                    var e = e.target;
                    if(e.nodeName=="IMG"){
                    imgSmall2.src=imgSmall.src=imgBig.src=e.src ;
                    }
                    
                }
            </script>
        </body>
    </html>
    /*
     * elem: 操作哪一个元素
     * json:表示多个属性
             * attr: 操作的那个元素的css中的什么属性
             * value: 操作的那个元素的css中的那个属性的目标值
     * cb:回调函数,前一个运动执行后,这一段代码才被执行 
     */
    var startMove = (elem, json, cb)=>{
        // 每当执行运动函数的时候,都先把上一次的运动结束掉
        clearInterval(elem.timer);
        // 开启定时器,让elem的attr属性,不断的变化
        elem.timer = setInterval( ()=>{
            // 循环,把json中的每一个属性,都做处理(让json中的每一个属性,都运动起来)
            var flag = true;        //是不是所有的属性,都运动到了目标值
            for( var attr in json ){
                // attr属性的目标值
                var value = json[attr];                    
                // 求当前属性值
                var v = getComputedStyle(elem)[attr];
                if( attr=="opacity" ){
                    v = Math.round(v*100);
                }else{
                    v = parseInt(v);
                }
                //console.log(v);
                // 求目标值与当前值的间距
                var dist = value-v;
                // 求步长值(注意:缓冲运动中,步长值是逐渐减小的)
                var step = dist/6;
                //console.log(step);
                // 如果属性逐渐变大的运动,那么step最后几次的值类似 0.1,我们希望把0.1变为1
                // 如果属性逐渐变小的运动,那么step最后几次的值类似 -0.1,我们希望把-0.1变为-1
                if( step>0 ){    
                    step = Math.ceil(step);
                }else{
                    step = Math.floor(step);
                }
                // 更新属性值
                //console.log(v, step);
                if( attr=="opacity" ){
                    elem.style[attr] = (v+step)/100;
                }else{
                    elem.style[attr] = (v+step)+'px';
                }
                // 如果到达目标值,运动停止
                //if( v==value ){
                //    clearInterval(elem.timer);
                //}
                if( v!=value ){// 只要有1个属性,没有到达目标值,就让flag等于false
                    flag = false;    
                }
            }    
            // 判断是否所有的属性,都已经到达了目标值
            if( flag ){
                clearInterval(elem.timer);
                if( cb ){    // 如果设置了回调函数,则执行它
                    cb();
                }
            }
        }, 30 );
    }
  • 相关阅读:
    js实现输入银行卡号隔四位添加一个空格
    写出优雅的代码
    FOJ Problem 1016 无归之室
    FOJ Problem 1015 土地划分
    大数相加减
    NYOJ 42 一笔画
    NYOJ36 水池数目
    NYOJ 32 组合数
    贪吃蛇StringBuilder 和 定时器
    星 辰 · 第 三 条 约 定
  • 原文地址:https://www.cnblogs.com/l8l8/p/8869337.html
Copyright © 2020-2023  润新知