JS4---javascript实现电商放大镜功能

电商放大镜

在这里插入图片描述

一.一些零碎知识点

1.style只可以获取行内样式,但可以修改
window.getComputedStyle可以获取在浏览器的所有样式,但不能修改
2.若运用的是子元素一定要加children[]
eg: middle.children[ 0 ].src middle下边的第一个子元素的src属性

二.html代码

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="js/js.js"></script>
    <style>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .big{
            margin: auto;
            width: 350px;
            height: 500px;
            position: relative;
        }
        .middle{
            width: 350px;
            height: 420px;
            border: solid 1px silver;
            position: relative;
        }
        .middle img{
            width: 100%;
            height:100%;
        }
        .small{
            width: 350px;
            height: 80px;
            font-size: 0;   /*块变行级块之间会有缝隙,用font-size:0;清除缝*/
            border-top: solid 1px silver;   /*线*/
            padding-top: 10px;
            position: relative;
        }
        .s-photo{
            display: inline-block;
            width: 60px;
            height: auto;
            margin-left: 5px;
            border: solid 3px transparent;
        }
        .s-chang{
            width:520px;
            /*margin-top: 11px;*/  /*给mar会往下移,给上边框一条线*/
            margin-left: 0;
            -webkit-transition:  margin-left .4s linear;
            -moz-transition: margin-left .4s linear ;
            -o-transition: margin-left .4s linear ;
            transition:  margin-left .4s linear;
        }
        .s-duan{
            width: 310px;
            height: 60px;
            overflow: hidden;
            margin: auto;
        }
      .small span{
            font-size: 15px;
            width: 20px;
            height: 78px;
            line-height: 78px;
            display: inline-block;
            position: absolute;
            text-align: center;
            background: silver;
            cursor: pointer;
        }
        .btn-left{
            top: 0;
            left: 0;
        }
        .btn-right{
            top: 0;
            right: 0;
        }


        另一种两个按钮的写法
/*        /!*两种写法  一种用span,一种用伪类选择器*!/
        .s-duan::before,.s-duan::after{
            height: 80px;
            width: 20px;
            font-size: 15px;
            position: absolute;
            text-align: center;
            line-height: 80px;
        }
        .s-duan::after{
            content: ">";
            top: 0;
            right: 0;
        }
        .s-duan::before{
            content: "<";
            top: 0;
            left: 0;
        }*/


        .mid-src{
            position: absolute;
            width: 150px;
            height: 200px;
            background: url("images/bg.png") ;
            -webkit-background-size: 5px 5px;
            background-size: 5px 5px;
            display: none;    
            cursor: move;          //让鼠标放上去变成移动态
        }
        .big-right{
            width: 350px;
            height: 520px;
            border: solid 1px silver;
            position: absolute;
            left: 349px;
            display: none;
            background: url("images/big1.jpg") no-repeat;
        }
    </style>
</head>
<body>
    <div class="big">
        <div class="big-right"></div>
        <div class="middle">
            <div class="mid-src"></div><!--层-->
            <img src="images/middle1.jpg" alt=""/>
        </div>
        <div class="small">
            <span class="btn-left"><</span>
            <div class="s-duan">
                <div class="s-chang">                    //不停的写div让图片隐藏
                    <div class="s-photo"><img src="images/small1.jpg" data-big="images/big1.jpg" data-src="images/middle1.jpg" alt=""/></div>
                    <div class="s-photo"><img src="images/small2.jpg" data-big="images/big2.jpg" data-src="images/middle2.jpg" alt=""/></div>
                    <div class="s-photo"><img src="images/small3.jpg" data-big="images/big3.jpg" data-src="images/middle3.jpg" alt=""/></div>
                    <div class="s-photo"><img src="images/small4.jpg" data-big="images/big4.jpg" data-src="images/middle4.jpg" alt=""/></div>
                    <div class="s-photo"><img src="images/small5.jpg" data-big="images/big5.jpg" data-src="images/middle5.jpg" alt="" /></div>
                    <div class="s-photo"><img src="images/small6.jpg" data-big="images/big6.jpg" data-src="images/middle6.jpg" alt=""/></div>
                    <div class="s-photo"><img src="images/small7.jpg" data-big="images/big7.jpg" data-src="images/middle7.jpg" alt=""/></div>
                    <div class="s-photo"><img src="images/small8.jpg" data-big="images/big8.jpg" data-src="images/middle8.jpg" alt=""/></div>
                </div>
            </div>
            <span class="btn-right">></span>
        </div>
    </div>
</body>
</html>
二.js代码
1.实现鼠标放到小图上,小图边框变为红色
借助temp变量,存储鼠标移动后的前一个框
 var temp;
 window.onload=function(){
 var sphoto =document.getElementsByClassName("s-photo");
 var middle =document.getElementsByClassName("middle")[0];
 temp=document.getElementsByClassName("s-photo")[0];
 temp.style.borderColor = "red";
 
 for(var i=0;i<sphoto.length;i++){
 sphoto[i].onmouseenter = function(){
 temp.style.borderColor="transparent";
 this.style.borderColor="red";
 temp=this;
 console.log(this.children[0].getAttribute("data-src"))
 middle.children[0].src = this.children[0].getAttribute("data-src");
 }
 }
 }

2.点击左右两个span,small中的图片移动
    btnleft.onclick=function(){
        schang.style.marginLeft="0";
    }
    btnright.onclick=function(){
        schang.style.marginLeft=-212+"px";
    }
3.让鼠标放在midsrc(阴影层)的中间
 x=x-big.offsetLeft-parseFloat(window.getComputedStyle(midsrc).width)/2;  /*style只可以获取行内样式  window.get可以获取在浏览器的所有样式,但不能修改*/
 y=y-big.offsetTop-parseFloat(window.getComputedStyle(midsrc).height)/2;   /*左偏移量相对于父元素的偏移量*/
4.将阴影层限制在middle框中
      var bigleft = (parseFloat(window.getComputedStyle(middle).width))-parseFloat(window.getComputedStyle(midsrc).width);
        var bigtop = (parseFloat(window.getComputedStyle(middle).height))-parseFloat(window.getComputedStyle(midsrc).height);
       /* console.log(bigleft);
        console.log(bigtop);*/

        if(x<=0 ){
            x=0;
        }
       else{  /*x>0*/
            if(x>=bigleft){
                x=bigleft;
            }
            else{}
        }
        if(y<0){
            y=0;
        }
        else{  /*y>0*/
           if(y>=bigtop){
               y=bigtop;
            }
            else{}
        }
        midsrc.style.left = x + "px";
        midsrc.style.top = y + "px"

5.将图片一一对应

 middle.children[1].src = this.children[0].getAttribute("data-src");    //middle下的img(第二个子元素)   div下的img
 bigright.style.backgroundImage="url(" + this.children[0].getAttribute("data-big") + ")";       //this指代当前所对应的sphoto

6.鼠标移动阴影层后大图也跟着移动

 bigright.style.backgroundPosition = (-x / 0.4375) + "px " + (-y / 0.525) + "px";

7.完整代码如下

var temp=null;
window.onload=function(){
    var sphoto =document.getElementsByClassName("s-photo");
    var middle =document.getElementsByClassName("middle")[0];
    var big = document.getElementsByClassName("big")[0];
    var btnleft =document.getElementsByClassName("btn-left")[0];
    var btnright =document.getElementsByClassName("btn-right")[0];
    var schang=document.getElementsByClassName("s-chang")[0];
    var midsrc=document.getElementsByClassName("mid-src")[0];
    var bigright=document.getElementsByClassName("big-right")[0];

    temp=document.getElementsByClassName("s-photo")[0];
    temp.style.borderColor="red";
    for(var i=0;i<sphoto.length;i++){
       sphoto[i].onmouseenter=function(){
           temp.style.borderColor="transparent";
           this.style.borderColor="red";
           temp=this;//将当前对象存在temp中,鼠标动下一个时,当前对象变为透明
           middle.children[1].src = this.children[0].getAttribute("data-src");//middle下的img(第二个子元素)   div下的img
           bigright.style.backgroundImage="url(" + this.children[0].getAttribute("data-big") + ")";//this指代当前所对应的sphoto
       }
    }
    //左右点击事件
    btnleft.onclick=function(){
        schang.style.marginLeft="0";
    }
    btnright.onclick=function(){
        schang.style.marginLeft=-212+"px";
    }
    //mid-src移动
    middle.onmouseenter=function(){
       midsrc.style.display="block";
        bigright.style.display="block";
    }
    middle.onmouseleave=function(){
       midsrc.style.display="none";
        bigright.style.display="none";
    }
    middle.onmousemove=function(e){
        var x= e.pageX || e.clientX;
        var y= e.pagesY || e.clientY;
        /*先让鼠标随着篮框移动*/
        x=x-big.offsetLeft-parseFloat(window.getComputedStyle(midsrc).width)/2;  /*style只可以获取行内样式  window.get可以获取在浏览器的所有样式,但不能修改*/
        y=y-big.offsetTop-parseFloat(window.getComputedStyle(midsrc).height)/2;   /*左偏移量相对于父元素的偏移量*/
       console.log(x);
        console.log(y);
        /* 限制x y;*/
        var bigleft = (parseFloat(window.getComputedStyle(middle).width))-parseFloat(window.getComputedStyle(midsrc).width);
        var bigtop = (parseFloat(window.getComputedStyle(middle).height))-parseFloat(window.getComputedStyle(midsrc).height);
       /* console.log(bigleft);
        console.log(bigtop);*/

        if(x<=0 ){
            x=0;
        }
       else{  /*x>0*/
            if(x>=bigleft){
                x=bigleft;
            }
            else{}
        }
        if(y<0){
            y=0;
        }
        else{  /*y>0*/
           if(y>=bigtop){
               y=bigtop;
            }
            else{}
        }
        midsrc.style.left = x + "px";
        midsrc.style.top = y + "px";  /*midsrc的位置就是鼠标位置计算出来,所以跟着鼠标移动*/

        bigright.style.backgroundPosition = (-x / 0.4375) + "px " + (-y / 0.525) + "px";
        //中图  350  420  大图  800  800   0.4375    0.525
          //  midsrc 150  200  303  大图与中图的比等于mid-scr与  的比

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值