javascript - 拖动并锁定父级内部

标签 javascript jquery

在线样本http://jsfiddle.net/dhCLd/

简单的拖动放大,

(function($) {
    $.fn.drag = function(opt) {

        opt = $.extend({
            handle: "",
            cursor:"move"}, opt);

        if(opt.handle === "") {
            var $el = this;
        } else {
            var $el = this.find(opt.handle);
        }

        return $el.css('cursor', opt.cursor).on("mousedown", function(e) {
            if(opt.handle === "") {
                var $drag = $(this).addClass('draggable');
            } else {
                var $drag = $(this).addClass('active-handle').parent().addClass('draggable');
            }
            var z_idx = $drag.css('z-index'),
                native_width = 0,
                native_height = 0;


            $drag.css('z-index', 1000).parents('.magnify').on("mousemove", function(e) {

                if(!native_width && !native_height){
                    var image_object = new Image();
                    image_object.src = $(".small").attr("src");
                    native_width = image_object.width;
                    native_height = image_object.height;
                }else{
                    var magnify_offset = $drag.parents('.magnify').offset();
                    var mx = e.pageX - magnify_offset.left;
                    var my = e.pageY - magnify_offset.top;
                    var rx = Math.round(mx/$(".small").width()*native_width - $drag.width()/2)*-1;
                    var ry = Math.round(my/$(".small").height()*native_height - $drag.height()/2)*-1;
                    var px = mx - $(".large").width()/2;
                    var py = my - $(".large").height()/2;
                    var bgp = rx + "px " + ry + "px";  



                  $('.draggable').css({left:px, top:py, backgroundPosition: bgp}).on("mouseup", function() {
                      $(this).removeClass('draggable').css('z-index', z_idx);
                  });
                }
            });
            e.preventDefault();
        }).on("mouseup", function() {
            if(opt.handle === "") {
                $(this).removeClass('draggable');
            } else {
                $(this).removeClass('active-handle').parent().removeClass('draggable');
            }
        });
    }
})(jQuery);

如何使“放大”停止在 .small` 图像周围的边缘,如果在图像之外则不可拖动。如果有人可以帮忙吗?

最佳答案

您可以限制 mx 的值(在 [0,magnify's width] 范围内)和 my (在 [0, 放大高度]):

var magnify = $drag.closest('.magnify');
var magnify_offset = magnify.offset();
var mx = Math.min(Math.max(e.pageX - magnify_offset.left,0),magnify.width());
var my = Math.min(Math.max(e.pageY - magnify_offset.top,0), magnify.height());

Updated demo .

关于javascript - 拖动并锁定父级内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24602098/

相关文章:

javascript - 使用文件上传最大大小事件的代码到简单代码

javascript - 检测传递的参数是否为数组? Javascript

javascript - javascript中for循环中的匿名回调函数

javascript - 从所有匹配的表单元素中删除一个类..最干净的方法?

javascript - (中间值).setTween 不是函数

jquery - 为什么我的 jQuery checkbox.change 事件仅在 IE 中的 leftfocus 上触发,但在 FF 中却在 onclick 上触发?

javascript - 按位不在 ruby 中

javascript - 远程 JavaScript Web 应用程序的 headless 测试

jquery - 检查对Ajax请求的权限

javascript - 在 ajax 请求中填充数据字符串