前面有一章节介绍了使用html+css实现小兔鲜儿网页案例,但是这是一个纯静态网页。最近因为又补充学习了一下前端基础知识WebAPI篇,看到了老师实现的放大镜效果和固定侧边栏效果,因此,突发奇想,直接在小兔鲜儿案例上实现了上述两种功能。

  首先,先看下商品详情页面的放大镜效果是什么样子的。由于手上没有太多图片,所以两侧图片只是设置了不同尺寸来展现放大镜效果。图像放大镜的原理是鼠标经过左侧小图片盒子,出现黄色遮盖,然后右侧大图片展示。鼠标移出左侧区域,两个显示出来的区域被隐藏。黄色遮盖会随着鼠标的移动而移动,并且大图片也跟随移动。

图一、商品放大镜效果

  前面的使用html+css初步完成小兔鲜儿案例中中给出了静态页面的代码,这里在此基础上写了个简单的商品详情页展示放大镜效果。首先看下新增放大镜效果后项目结构是什么样子的。上面标注颜色的地方为新增详情页放大镜效果的代码。其中animate.js为侧边栏效果代码,下一个博客将进行介绍。

 

 

 

首先在index.html的商品列表展示模块的一个吸尘器图片a标签处添加了跳转页面到详情页功能,代码如下所示:

<a href="./details.html">
     <img src="./uploads/new_goods_1.jpg" alt="">
     <h3>无线吸尘器</h3>
     <p><span>¥</span> 899</p>
</a>

商品详情页detail.html如下所示

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7     <title>商品放大镜效果</title>
  8     <script src="./js/detail.js"></script>
  9     <style>
 10         * {
 11             margin: 0;
 12             padding: 0;
 13         }
 14         body {
 15             background-color: #fff;
 16             font: 12px/1.5 'Microsoft YaHei', 'Heiti SC', tahoma, arial, 'Hiragino Sans GB', \\5B8B\4F53, sans-serif;
 17             color: #666
 18         }
 19         /*清除浮动*/
 20         .clearfix:after {
 21             visibility: hidden;
 22             clear: both;
 23             display: block;
 24             content: ".";
 25             height: 0
 26         }
 27         .clearfix {
 28             *zoom: 1
 29         }
 30         .mmm {
 31             width: 1200px;
 32             margin: 0 auto;
 33         }
 34         .detail-container {
 35             margin-top: 20px;
 36             margin-left: 20px;
 37         }
 38         .preview_wrap {
 39             width: 400px;
 40             height: 590px;
 41         }
 42         .fl {
 43             float: left;
 44         }
 45         .preview_img {
 46             position: relative;
 47             height: 398px;
 48             border: 1px solid #ccc;
 49         }
 50         img {
 51             display: block;
 52             width: 50%;
 53             border: 0;
 55             margin: 100px auto;
 56         }
 57         .mask {
 58             display: none;
 59             position: absolute;
 60             top: 0;
 61             left: 0;
 62             width: 260px;
 63             height: 260px;
 64             background-color: #efde4f;
 65             opacity: 0.5;
 66             cursor: move;
 67         }
 68         .big {
 70             position: absolute;
 71             left: 410px;
 72             top: 0;
 73             width: 500px;
 74             height: 500px;
 76             z-index: 999;
 77             border: 1px solid #ccc;
 78             overflow: hidden;
 79         }
 80         .big img {
 81             position: absolute;
 82             top: 0;
 83             left: 0;
 84             width: 90%;
 85             margin: 10px;
 86         }
 87         .itemInfo_wrap {
 88             width: 518px;
 89         }
 90         .fr {
 91             float: right;
 92         }
 93     </style>
 94 </head>
 95 <body>
 96     <div class="detail-container mmm">
 97         <!-- 展示列表 -->
 98         <span>商品详情 ></span> 吸尘器
 99         <div class="product_intro clearfix">
100             <!-- 预览区域 -->
101             <div class="preview_wrap fl">
102                 <div class="preview_img">
103                     <img src="./uploads/new_goods_1.jpg" alt="">
104                     <!-- 遮盖层 -->
105                     <div class="mask"></div>
106                     <div class="big">
107                         <img src="./uploads/new_goods_1.jpg" alt="" class="bigImg">
108                     </div>
109                 </div>
110             </div>
111             <!-- 产品详情区域 -->
112             <div class="itemInfo_wrap fr">
113                 哈哈哈哈或或或或,这边没有详情
114             </div>
115         </div>
116     </div>
117 </body>
118 </html>

下面是detail.js代码

window.addEventListener('load', function() {
    var preview_img = document.querySelector('.preview_img');
    var mask = document.querySelector('.mask');
    var big = document.querySelector('.big');
    // 1、当鼠标经过preview_img就显示mask遮挡层和big大盒子
    preview_img.addEventListener('mouseover', function() {
        mask.style.display = 'block';
        big.style.display = 'block';
    })
    // 2、当鼠标离开preview_img就隐藏mask遮挡层和big大盒子
    preview_img.addEventListener('mouseout', function() {
        mask.style.display = 'none';
        big.style.display = 'none';
    });

    preview_img.addEventListener('mousemove', function(e) {
        // 1、先计算鼠标在盒子内的坐标
        var x = e.pageX - this.offsetLeft;   // 鼠标据页面的距离 - 盒子左侧的距离(需要看有没有定位) = 鼠标在盒子内的距离
        var y = e.pageY - this.offsetTop;
        // console.log(this.offsetLeft);
        // 2、减去盒子高度的一半,就是mask的left和top了
        // 3、mask移动的距离赋值--鼠标在遮盖层中心位置
        var maskX = x - mask.offsetWidth / 2;
        var maskY = y - mask.offsetHeight / 2;
        // 遮挡层最大移动距离 (因为盒子和遮挡层都是正方形,所以宽高最大距离相同)-- 就是鼠标移动区域盒子(preview_img的宽高)-遮盖层的宽高
        var maskMax = this.offsetHeight - mask.offsetHeight;
        //4、如果x坐标小于0 ,就让他停在0的位置
        if (maskX < 0) {
            maskX = 0;
        } else if (maskX >= maskMax) {  // mask盒子 left最大距离左侧的距离是盒子的宽度-mask的宽度
            maskX = maskMax;
        } 
        if (maskY < 0) {
            maskY = 0;
        } else if (maskY >= maskMax) {  // mask盒子 left最大距离左侧的距离是盒子的宽度-mask的宽度
            maskY = maskMax
        } 
        mask.style.left = maskX + 'px';   // 将mask中间点位于鼠标位置,则mask的left和top - mask的宽高
        mask.style.top = maskY + 'px';
        // 放大镜的大图片移动距离 = (遮挡层移动距离(maskX和maskY) * 放大镜大图片最大移动距离)/ 遮挡层最大移动距离(就是移动后,遮挡层不能超过盒子的范围,遮挡层left/top的距离)
        var bigImg = document.querySelector('.bigImg');
        // 放大镜大图片最大移动距离
        var bigMax = bigImg.offsetWidth - big.offsetWidth; 
        // 放大镜的大图片移动距离
        var bigX = maskX * bigMax / maskMax;
        var bigY = maskY * bigMax / maskMax;
        bigImg.style.left = bigX + 'px';
        bigImg.style.top = bigY + 'px';

    });

})

这里记录一个小知识点,加深下自己的记忆力

  1、mouseover 经过自身盒子和子盒子都会触发鼠标事件
  2、mouseenter只会经过自身盒子触发,和mouseleave搭配

  3、window.addEvevtListener(‘load’, function(){}),是在页面文档完全加载完毕后执行里面的函数。

好了,到这里商品详情页放大镜效果就实现了。

 

原文地址:http://www.cnblogs.com/gjw0818/p/16928306.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性