当前位置: 首页 > news >正文

jq实现拖拽功能-解决滚动条引起的偏差

最近在做拖拽功能的时候,在网上找了一些示例代码,示例代码都是大同小异,我发现代码并不完整,仅仅实现了拖拽功能,并未考虑到页面有滚动条时候的拖拽,还未考虑到拖出边界后可能会出现的bug。下面来做个简单分析和解决思路:

不完整示例

$('div').mousedown(function(e) {
    var positionDiv = $(this).offset();
    var distenceX = e.pageX - positionDiv.left;
    var distenceY = e.pageY - positionDiv.top;
    $(document).mousemove(function(e) {
        var x = e.pageX - distenceX;
        var y = e.pageY - distenceY;
        if (x < 0) {
            x = 0;
        } else if (x > $(document).width() - $('div').outerWidth(true)) {
            x = $(document).width() - $('div').outerWidth(true);
        }
        if (y < 0) {
            y = 0;
        } else if (y > $(document).height() - $('div').outerHeight(true)) {
            y = $(document).height() - $('div').outerHeight(true);
        }
        $('div').css({
            'left': x + 'px',
            'top': y + 'px'
        });
    });
    $(document).mouseup(function() {
        $(document).off('mousemove');
    });
});

问题一:

如果使用上面的代码,页面高度够高或者够宽出现滚动条,拖拽的div和鼠标的位置就会有偏差。如果横向出现滚动条且滚动一定距离,那么鼠标就会在拖块的左边;如果是竖向出现滚动条且滚动一定距离,那么鼠标就会在拖块的上边。

解决方案就是在原有的基础之上减去滚动条滚动的距离:

var x = e.pageX - distenceX - $(window).scrollLeft();
var y = e.pageY - distenceY - $(window).scrollTop();

问题二:

在有滚动条的情况下,竖向往下拖拽,横向向右拖拽,拖拽的滑块就会消失,原因是$(document)获取的是页面的高度或宽度

解决方案就是$(document).width()$(document).height()改成$(window).width()$(window).height()

问题三:

在某些浏览器可能在鼠标拖出上下边界的时候$(document).off('mousemove')未生效,这个问题可能比较老版本的浏览器会出现。代码中加上return false就对了。

$(document).on('mousemove', function(e) {
	// ...			
	return false;
});

完整示例

这样更改,无论是有滚动条的页面还是无滚动条页面,都可以兼容。

var $el = $('#drag');
$el.on('mousedown', function(e) {
	var positionDiv = $(this).offset();
	var distenceX = e.pageX - positionDiv.left;
	var distenceY = e.pageY - positionDiv.top;
	var scrollLeft = $(window).scrollLeft();
	var scrollTop = $(window).scrollTop();
	$(document).on('mousemove', function(e) {
		var x = e.pageX - distenceX - scrollLeft;
		var y = e.pageY - distenceY - scrollTop;
		if (x < 0) {
			x = 0;
		} else if (x > $(window).width() - $el.outerWidth(true)) {
			x = $(window).width() - $el.outerWidth(true);
		}
		if (y < 0) {
			y = 0;
		} else if (y > $(window).height() - $el.outerHeight(true)) {
			y = $(window).height() - $el.outerHeight(true);
		}
		$el.css({
			'left': x + 'px',
			'top': y + 'px',
			'right': 'auto',
			'bottom': 'auto'
		});
		return false;
	});
	$(document).mouseup(function(e) {
		$(document).off('mousemove');
	})
});

----- 看完啦别忘记点赞哟,您的肯定就是对我最大的支持 END -----


关注我,不迷路

如果任何疑问的可以在评论区留言,还可以加QQ群交流:568984539,加群备注‘地区-名字-技术类型’。

更多前端等相关知识可关注我个人博客:https://blog.csdn.net/qq_42961150?spm=1011.2124.3001.5343

相关文章:

  • JavaScript类型识别
  • 前端页面跳转的6大类方法及其使用场景特性分析
  • [saiku] olap数据源管理
  • uniapp开发:瀑布流 灵活配置 简单易用 兼容vue2vue3小程序、H5、app等多端
  • Chrome浏览器使用Overrides调试线上代码的技巧
  • js查找json数据中的最大值和最小值方法集结
  • CSS3 Border-color
  • uniapp+unicloud开发微信小程序流程
  • 微信小程序解决saveImageToPhotosAlbum:fail invalid file type
  • Cacti 不出图像的解决办法(完整版)
  • 我的CSDN博客、UNI技术成长之路
  • websoket封装版 参数配置化 开箱即用
  • h5页面js监听页面失去焦点、获取焦点
  • uniapp之vuex在vue2和vue3两种模式下前端工程化动态导入文件
  • css实现三角形的最简单方式原理剖析
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • DOM的那些事
  • eclipse(luna)创建web工程
  • github从入门到放弃(1)
  • gulp 教程
  • idea + plantuml 画流程图
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JWT究竟是什么呢?
  • Node 版本管理
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 无服务器化是企业 IT 架构的未来吗?
  • 学习Vue.js的五个小例子
  • Hibernate主键生成策略及选择
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​批处理文件中的errorlevel用法
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #Java第九次作业--输入输出流和文件操作
  • #每日一题合集#牛客JZ23-JZ33
  • (1)常见O(n^2)排序算法解析
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (MATLAB)第五章-矩阵运算
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)Sublime Text3配置Lua运行环境
  • **PHP分步表单提交思路(分页表单提交)
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .“空心村”成因分析及解决对策122344
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(一):@echo off
  • .NET Core引入性能分析引导优化
  • .Net IE10 _doPostBack 未定义
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • ::