2020-03-01

电商网站常用功能---放大镜

是电商网站预览商品时常使用的模块
涉及功能:图片预览、图片切换、盒子定位
图片素材后附

放大预览

代码示例

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{
                margin: 0px;
                padding: 0px;
                list-style: none;
            }
            #s_box{
                width:380px ;
                height: 380px;
            }
            #mask{
                display: block;
                width: 200px;
                height: 200px;
                background: rgba(250,250,0,0.4);
                position: absolute;
                top: 0px;
                left: 0px;
                display: none;
                /*鼠标移动到上边出现十字指针*/
                cursor: move;
            }
            #b_box{
                width: 450px;
                height: 550px;
                border: solid 1px black;
                overflow: hidden;
                position: absolute;
                left: 380px;
                top: 0px;
            }
            #b_box img{
                position: relative;
            }
            #ul{
                height: 60px;
                width: 380px;
                clear: both;
            }
            #ul li{
                float: left;
                margin-right: 20px;
            }
            #ul li:hover{
                border: solid 3px red;
                border-radius: 3px;
            }
            
        </style>
    </head>
    <!--页面布局      子绝父相-->
    <body>
        <div id="box">
            <div id="s_box">
                <img src="img/1.png"/>
                <span id="mask">
                </span>
            </div>
            <div id="b_box">
                <img src="img/01.png"/>
            </div>
            <div id="ul">
                <ul>
                    <li><img src="img/1.jpg"/></li>
                    <li><img src="img/2.jpg"/></li>
                    <li><img src="img/3.jpg"/></li>
                    <li><img src="img/4.jpg"/></li>
                    <li><img src="img/5.jpg"/></li>
                </ul>
            </div>
        </div>
    </body>
    <script type="text/javascript">
        window.onload = function(){
            //获取到想对应的元素对象
            var box = document.getElementById("box")
            var s_box = document.getElementById("s_box");
            var b_box = document.getElementById("b_box");
            var mask = document.getElementById("mask");
            var b_img = b_box.getElementsByTagName("img")[0];
            var ul = box.getElementsByTagName("ul")[0];
            var imgs = ul.getElementsByTagName("img")
            //给每一个li里面的图片添加事件,改变盒子的图片
            for (var i = 0; i < imgs.length; i++) {
                //闭包
                (function(i){
                    imgs[i].onmouseover = function(){
                        //改变盒子图片的路径
                        s_box.getElementsByTagName("img")[0].src = "img/"+ (i+1)+".png";
                        b_img.src = "img/0"+ (i+1)+".png";
                    }
                })(i);
            }
            //当鼠标移入s_box盒子时,mask显示出来,并根据鼠标移动
            s_box.onmouseover = function(ev){
                mask.style.display = "block";
                moveMask(ev);
                mask.onmousemove = function(ev){
                    moveMask(ev);   
                }
            }
            //鼠标移出s_box时,把mask隐藏起来
            s_box.onmouseout = function(ev){
                mask.style.display = "none";        
            }
            
            //具体的mask移动策略
            function moveMask(ev){
                //大盒子的宽高与小盒子的比值
                 var numX = b_box.offsetWidth/s_box.offsetWidth
                 var numY = b_box.offsetHeight/s_box.offsetHeight;
                if(ev.pageX > s_box.offsetLeft + s_box.offsetWidth - mask.offsetWidth/2){
                    //右边界条件
                    mask.style.left = s_box.offsetWidth - mask.offsetWidth + "px"
                }else if(ev.pageX < s_box.offsetLeft+mask.offsetWidth/2){
                    //左边界条件
                    mask.style.left = 0 + "px";
                }else{
                    //中间区域的移动策略
                    mask.style.left = ev.pageX - s_box.offsetLeft - mask.offsetWidth/2 + "px";
                    b_img.style.left = -(ev.pageX - s_box.offsetLeft - mask.offsetWidth/2)*numX  + "px";
                }
                
                if(ev.pageY > s_box.offsetTop + s_box.offsetHeight-mask.offsetHeight/2){
                    //下边界条件
                    mask.style.top = s_box.offsetHeight - mask.offsetHeight + "px";
                }else if(ev.pageY < s_box.offsetTop + mask.offsetHeight/2){
                    //上边界条件
                    mask.style.top = 0 + "px";
                }else{
                    //中间区域移动策略
                    mask.style.top = ev.pageY - s_box.offsetTop - mask.offsetHeight/2 + "px";   
                    b_img.style.top = -(ev.pageY - s_box.offsetTop - mask.offsetHeight/2)*numY + "px";
                }
        }
        }
    </script>
</html>

图片素材

  1. li里面的图片


    1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
  1. s_box里面的图片


    1.png
2.png
3.png
4.png
5.png
  1. b_box里面的图片


    01.png
02.png
03.png
04.png
05.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【大匠無門 王懿】除了宅 继续靠边站 除了宅 继续靠边站 (论道家养生功法之-站桩) 疫情依然严峻,拐点还不明朗...
    大匠无门阅读 3,405评论 0 0
  • 问题描述: 最近全国各地老师都在进行网络授课,我也准备迎接这一热潮,集中解决一些实际问题,一大早有老师在交流群里面...
    兵哥_8e95阅读 5,612评论 2 2
  • 今日目标 1.能够说出什么是路由2.能够说出前端路由的实现原理3.能够使用Vue-Router实现前端路由4.能够...
    __method__阅读 1,339评论 0 0
  • 首发地址:http://rsytes.coding-pages.com/ flahspad与ediary同为一作者...
    Mr_s_Qin阅读 8,585评论 1 3
  • 和狗狗相处,几天下来,虽也添了些乐趣。但真得很累,完全打破了我一贯的生活作息规律。 晨跑,要早起一小时,按着三傻遛...
    mzy知行阅读 3,616评论 0 11