HTML5+CSS3+JavaScript 实现淘宝放大镜

HTML5+CSS3+JavaScript 实现淘宝放大镜

1.在一个里面写的,好复制。。。。。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>淘宝放大镜</title>
    <style>
        *{
     
     /*建议每次写css,最开始就把内边距 外边距消掉*/
            margin: 0;
            padding: 0;
        }
        .par{
     
     /*设置盒子per的样式*/
            position: relative;/*相对定位 设置图层的时候记得要把父容器设置为相对定位*/
            width: 323px;
            height: 506px;
            /*border: 1px solid silver;*/
            margin-left: 205px;
        }
        #bgceng{
     
     /*放大镜大图显示位置*/
            width: 323px;
            height: 430px;
            border: 1px solid red;
            position: absolute;/*图层要设置绝对定位*/
            z-index: 3;/*第三层*/
            display: none;/*页面加载不显示*/
            left: 325px;
            background-size: 750px 1000px;/*背景大小*/
        }
        .middle_img{
     
     
            position: relative;/*中图盒子设置相对定位 因为他上边有图层*/
            width: 323px;
            height: 430px;
            border: 1px solid silver;/*下边线*/
        }
        .middle_img>img {
     
     
            width: 100%;
            height: 100%;
        }
        #ceng{
     
     /*放大镜*/
            border: 1px solid red;
            position: absolute;/*图层绝对定位*/
            z-index: 2;/*第二层*/
            display: none;/*页面加载不显示*/
            background: cornflowerblue;
        }
        .small_img{
     
     
            width: 323px;
            height: 76px;
            text-align: center;/*水平居中*/
            line-height: 76px;/*给父容器加行高*/
          }
        .small_img>div{
     
     
            display: inline-block;/*保持块元素特性,但改为行内元素显示*/
            width: 57px;
            height: 60px;
            border: 1px solid white;
            vertical-align: middle;/*加完行高垂直居中*/
        }
        /*.small_img>div>img{
            width: 100%;
            height: 100%;
        }*//*填充样式,我加完不好看就不加了*/
    </style>
</head>
<body>
<!--设置中图小图显示的大盒子-->
<div class="par">
    <!--大图图层  设置默认加载图片不平铺   js可以改变行内样式 所以js要用的尽量放在行内-->
    <div id="bgceng" style="background: url('image/bg1.jpg') no-repeat"></div>
    <!--中图盒子   设置默认加载图片-->
    <div class="middle_img">
        <!--中图图层   js可以改变行内样式 所以js要用的尽量放在行内-->
        <div id="ceng" style="width: 139px; height: 185px;"></div>
        <img src="image/middle1.jpg" alt="" id="middle"/>
    </div>
    <!--小图盒子-->
    <div class="small_img">
        <!--               自定义属性 js调用改变中图和大图图片-->
        <div class="small" data_middle="image/middle1.jpg" data_bg="image/bg1.jpg"><img src="image/small1.jpg"/></div>
        <div class="small" data_middle="image/middle2.jpg" data_bg="image/bg2.jpg"><img src="image/small2.jpg"/></div>
        <div class="small" data_middle="image/middle3.jpg" data_bg="image/bg3.jpg"><img src="image/small3.jpg"/></div>
        <div class="small" data_middle="image/middle4.jpg" data_bg="image/bg4.jpg"><img src="image/small4.jpg"/></div>
        <div class="small" data_middle="image/middle5.jpg" data_bg="image/bg5.jpg"><img src="image/small5.jpg"/></div>
    </div>
</div>
</body>
<script>/*尽量用到的变量提前声明*/
    /*获取小图  因为用的是同一个类选择器 所以默认是同一个集合 通过下标取元素*/
    var smallist=document.getElementsByClassName("small");
    /*设置默认小图的边框颜色*/
    smallist[0].style.borderColor="red";//js直接操作css行内样式
    //记录初始化小图的颜色框
    var beforcolor=null;
    beforcolor=smallist[0];//存到beforcolor中

    /*获取中图盒子位置*/
    var middlepar=document.getElementsByClassName("middle_img")[0];
    /*获取默认的中图*/
    var middle=document.getElementById("middle");

    var bg=document.getElementById("bgceng")
    var ceng=document.getElementById("ceng");
    var big=document.getElementsByClassName("par")[0];
    var bgceng=document.getElementById("bgceng")

    //循环遍历 获得小图
    for(var i=0; i<smallist.length;i++){
     
     
        //给遍历出的小图添加鼠标进入事件
        smallist[i].onmouseenter=function (){
     
     
            //让之前的图边框变回白色
            beforcolor.style.borderColor="white";
            //现在的图边框变为红色
            this.style.borderColor="red";
            //变完就把它替换上一个存到beforcolor中
            beforcolor=this;

            //中图要随着鼠标进入小图的不同而变化
            var middleinfo=this.getAttribute("data_middle");//获取中图自定义属性
            //中图的src位置发生变化
            middle.src=middleinfo;

            //大图也要随着鼠标进入小图的不同而变化
            var bginfo=this.getAttribute("data_bg");//获取自定义属性
            //因为bg是大图图层位置,所以要调用背景图片
            bg.style.backgroundImage="url('"+bginfo+"')";

        }
    }
    //给中图位置设置鼠标进入事件
    middlepar.onmouseenter=function (){
     
     
        //鼠标进入两个图层显示
        ceng.style.display="block";
        bgceng.style.display="block";
    }
    //给中图位置设置鼠标离开事件
    middlepar.onmouseleave=function (){
     
     
        //鼠标离开两个图层隐藏
        ceng.style.display="none";
        bgceng.style.display="none";
    }
    //添加鼠标移动事件 获取鼠标坐标 图层要跟着鼠标移动
    middlepar.onmousemove=function (e){
     
     
        //获取鼠标坐标
        var pagex=e.clientX||e.pageX;
        var pagey=e.clientY||e.pageY;
        //获取当前对象的左边偏移量和上边偏移量
        var left=big.offsetLeft;
        var top=big.offsetTop;
        //要鼠标在图层中间带着图层移动
        pagex=pagex-left-parseInt(ceng.style.width)/2;
        pagey=pagey-top-parseInt(ceng.style.height)/2;
        //卡边 根据图层左上角的坐标卡
        pagex=pagex<=0?0:pagex>=323-parseInt(ceng.style.width)?323-parseInt(ceng.style.width):pagex;
        pagey=pagey<=0?0:pagey>=430-parseInt(ceng.style.height)?430-parseInt(ceng.style.height):pagey;
        //把获得到的鼠标坐标给图层中心点
        ceng.style.left=pagex+"px";
        ceng.style.top=pagey+"px";

        //显示大图
        bgceng.style.backgroundPosition=(-pagex*2.32)+"px "+(-pagey*2.32)+"px";
    }

</script>
</html>

2.拆一下 html里外链路径要写对(不用我说了吧)

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>淘宝放大镜</title>
    <link rel="stylesheet" href="css/demo.css">

</head>
<body>
<!--设置中图小图显示的大盒子-->
<div class="par">
    <!--大图图层  设置默认加载图片不平铺   js可以改变行内样式 所以js要用的尽量放在行内-->
    <div id="bgceng" style="background: url('image/bg1.jpg') no-repeat"></div>
    <!--中图盒子   设置默认加载图片-->
    <div class="middle_img">
        <!--中图图层   js可以改变行内样式 所以js要用的尽量放在行内-->
        <div id="ceng" style="width: 139px; height: 185px;"></div>
        <img src="image/middle1.jpg" alt="" id="middle"/>
    </div>
    <!--小图盒子-->
    <div class="small_img">
        <!--               自定义属性 js调用改变中图和大图图片-->
        <div class="small" data_middle="image/middle1.jpg" data_bg="image/bg1.jpg"><img src="image/small1.jpg"/></div>
        <div class="small" data_middle="image/middle2.jpg" data_bg="image/bg2.jpg"><img src="image/small2.jpg"/></div>
        <div class="small" data_middle="image/middle3.jpg" data_bg="image/bg3.jpg"><img src="image/small3.jpg"/></div>
        <div class="small" data_middle="image/middle4.jpg" data_bg="image/bg4.jpg"><img src="image/small4.jpg"/></div>
        <div class="small" data_middle="image/middle5.jpg" data_bg="image/bg5.jpg"><img src="image/small5.jpg"/></div>
    </div>
</div>
<!--外链的script 尽量写在最后面 因为存在浏览器加载问题-->
<script src="jsp/demo.js"></script>
</body>
</html>

css 样式

*{
    
    /*建议每次写css,最开始就把内边距 外边距消掉*/
    margin: 0;
    padding: 0;
}
.par{
    
    /*设置盒子per的样式*/
    position: relative;/*相对定位 设置图层的时候记得要把父容器设置为相对定位*/
    width: 323px;
    height: 506px;
    /*border: 1px solid silver;*/
    margin-left: 205px;
}
#bgceng{
    
    /*放大镜大图显示位置*/
    width: 323px;
    height: 430px;
    border: 1px solid red;
    position: absolute;/*图层要设置绝对定位*/
    z-index: 3;/*第三层*/
    display: none;/*页面加载不显示*/
    left: 325px;
    background-size: 750px 1000px;/*背景大小*/
}
.middle_img{
    
    
    position: relative;/*中图盒子设置相对定位 因为他上边有图层*/
    width: 323px;
    height: 430px;
    border: 1px solid silver;/*下边线*/
}
.middle_img>img {
    
    
    width: 100%;
    height: 100%;
}
#ceng{
    
    /*放大镜*/
    border: 1px solid red;
    position: absolute;/*图层绝对定位*/
    z-index: 2;/*第二层*/
    display: none;/*页面加载不显示*/
    background: cornflowerblue;
}
.small_img{
    
    
    width: 323px;
    height: 76px;
    text-align: center;/*水平居中*/
    line-height: 76px;/*给父容器加行高*/
}
.small_img>div{
    
    
    display: inline-block;/*保持块元素特性,但改为行内元素显示*/
    width: 57px;
    height: 60px;
    border: 1px solid white;
    vertical-align: middle;/*加完行高垂直居中*/
}
/*.small_img>div>img{
    width: 100%;
    height: 100%;
}*//*填充样式,我加完不好看就不加了*/

js文件

/*尽量用到的变量提前声明*/
    /*获取小图  因为用的是同一个类选择器 所以默认是同一个集合 通过下标取元素*/
    var smallist=document.getElementsByClassName("small");
    /*设置默认小图的边框颜色*/
    smallist[0].style.borderColor="red";//js直接操作css行内样式
    //记录初始化小图的颜色框
    var beforcolor=null;
    beforcolor=smallist[0];//存到beforcolor中

    /*获取中图盒子位置*/
    var middlepar=document.getElementsByClassName("middle_img")[0];
    /*获取默认的中图*/
    var middle=document.getElementById("middle");

    var bg=document.getElementById("bgceng")
    var ceng=document.getElementById("ceng");
    var big=document.getElementsByClassName("par")[0];
    var bgceng=document.getElementById("bgceng")

    //循环遍历 获得小图
    for(var i=0; i<smallist.length;i++){
    
    
    //给遍历出的小图添加鼠标进入事件
    smallist[i].onmouseenter=function (){
    
    
    //让之前的图边框变回白色
    beforcolor.style.borderColor="white";
    //现在的图边框变为红色
    this.style.borderColor="red";
    //变完就把它替换上一个存到beforcolor中
    beforcolor=this;

    //中图要随着鼠标进入小图的不同而变化
    var middleinfo=this.getAttribute("data_middle");//获取中图自定义属性
            //中图的src位置发生变化
            middle.src=middleinfo;

            //大图也要随着鼠标进入小图的不同而变化
            var bginfo=this.getAttribute("data_bg");//获取自定义属性
            //因为bg是大图图层位置,所以要调用背景图片
            bg.style.backgroundImage="url('"+bginfo+"')";

    }
    }
    //给中图位置设置鼠标进入事件
    middlepar.onmouseenter=function (){
    
    
    //鼠标进入两个图层显示
    ceng.style.display="block";
    bgceng.style.display="block";
    }
    //给中图位置设置鼠标离开事件
    middlepar.onmouseleave=function (){
    
    
    //鼠标离开两个图层隐藏
    ceng.style.display="none";
    bgceng.style.display="none";
    }
    //添加鼠标移动事件 获取鼠标坐标 图层要跟着鼠标移动
    middlepar.onmousemove=function (e){
    
    
    //获取鼠标坐标
    var pagex=e.clientX||e.pageX;
    var pagey=e.clientY||e.pageY;
    //获取当前对象的左边偏移量和上边偏移量
    var left=big.offsetLeft;
    var top=big.offsetTop;
    //要鼠标在图层中间带着图层移动
    pagex=pagex-left-parseInt(ceng.style.width)/2;
    pagey=pagey-top-parseInt(ceng.style.height)/2;
    //卡边 根据图层左上角的坐标卡
    pagex=pagex<=0?0:pagex>=323-parseInt(ceng.style.width)?323-parseInt(ceng.style.width):pagex;
    pagey=pagey<=0?0:pagey>=430-parseInt(ceng.style.height)?430-parseInt(ceng.style.height):pagey;
    //把获得到的鼠标坐标给图层中心点
    ceng.style.left=pagex+"px";
    ceng.style.top=pagey+"px";

    //显示大图
    bgceng.style.backgroundPosition=(-pagex*2.32)+"px "+(-pagey*2.32)+"px";
    }



xinyue Day5

猜你喜欢

转载自blog.csdn.net/qq_47735503/article/details/110881853
今日推荐