• 技术文章 >web前端 >js教程

    JavaScript 放大镜 移动镜片效果代码_javascript技巧

    2016-05-16 18:06:57原创1038
    放大镜并不是一个难以实现的效果, 只是因为牵涉到一些精确的数值计算, 显得比较繁琐. 在未来的一段日子, 我会不定期地写关于 JavaScript 放大镜系列的文章, 每次讲一个点, 由点及面, 最后完成整个效果.
    本次我们先了解如何在缩略图上移动镜片. (这是 DEMO)

    缩略图和镜片组成的 DOM 结构如下.
    复制代码 代码如下:

    我在缩略图容器中放置图片和镜片节点, 以缩略图容器作为相对位置参考, 在触发 mousemove 事件时修改镜片的位置. 换个说法, 我们要解决的问题是, 算出镜片左上角的在缩略图容器中的位置. 计算镜片位移的 JavaScript 代码如下.
    复制代码 代码如下:

    /**
    * 获取镜片在放大目标元素上的位置
    * @param ev 触发的事件
    * @param thumb 缩略图对象
    * @param glass 镜片对象
    * @return x:镜片在放大目标元素上的横向位置, y:镜片在放大目标元素上的纵向位置
    */
    function getGlassOffset(ev, thumb, glass) {
    var offset = {
    left:0,
    top:0
    };

    // 偏移量
    var thumbOffset = getCumulativeOffset(thumb);
    // 鼠标在页面上的位置
    var mousePoint = getMousePoint(ev);
    // 镜片实际尺寸
    var glassSize = getSize(glass);
    // 简缩图实际尺寸
    var thumbSize = getSize(thumb);

    // 光标横向位置
    var cursorX = mousePoint.x - thumbOffset.left;
    // 镜片横向偏移量
    offset.left = cursorX - glassSize.width / 2;
    if(offset.left < 0) {
    offset.left = 0;
    } else if(offset.left > thumbSize.width - glassSize.width) {
    offset.left = thumbSize.width - glassSize.width;
    }

    // 光标纵向位置
    var cursorY = mousePoint.y - thumbOffset.top;
    // 镜片纵向偏移量
    offset.top = cursorY - glassSize.height / 2;
    if(offset.top < 0) {
    offset.top = 0;
    } else if(offset.top > thumbSize.height - glassSize.height) {
    offset.top = thumbSize.height - glassSize.height;
    }

    return offset;
    }

    镜片左上角在缩略图容器中的位置 = 鼠标位置 - 缩略图左上角位置 - 镜片尺寸的一半
    当镜片在容器外, 将镜片靠边. 全部代码请窥视 DEMO. (知道我为何上一篇写通过 JS 获取鼠标位置了吧?)

    留个课后思考题, 当镜片带边框时, 如何保证边框不影响镜片移动时的精确度?
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:放大镜 移动镜片
    上一篇:基于JQuery的动态删除Table表格的行和列的代码_jquery 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 浅析Angular中的Change Detection机制• 浅析Angular变更检测中的订阅异步事件• 一文聊聊node中的path模块• 一文带你深入了解Node中的Buffer类• 实战学习:聊聊Node.js怎么操作数据库
    1/1

    PHP中文网