为Bootstrap Modal添加拖拽


声明:本文转载自https://my.oschina.net/u/1760791/blog/1602473,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

        网上有许多给Bootstrap Modal添加拖拽实现,但是许多代码看起来都比较复杂感觉封装性可能也不太好,有的甚至使用了jquery ui的拖拽功能,这些都不是我想要的,其实我在给Bootstrap Modal添加拖拽功能的事情已经是2017年春节的时候了,弹指一挥间一年就过去了。2017年春节的时候,由于之前项目有同事使用layer来做前端,但是对于我这种略懂js前端的后端开发来说,让我引入layer和layui的一整套东西是艰难的,曾经大致的浏览过layui的一些组件,发现组件功能不是很完备,可以预见的是稍微复杂点的项目后期就会带来很多坑。因此当时就使用了bootstrap去作为前端的css框架,也大量使用modal这样的组件来做弹出窗口。

步骤(基于3.3.4或更高的3.x版本):

1.打开bootstrap.js源代码找到modal组件代码块,在Modal.DEFAULTS代码块下加入拖拽代码实现。

Modal.DEFAULTS = { 	backdrop: true, 	keyboard: true, 	show: true } //新加入的拖拽 Modal.prototype.draggable = function () { 	var $ele = this.$element; 	var mouseOffset; 	var $modalDialog = $ele.find(".modal-dialog"); 	var dialogOffset;  	$ele.find(".modal-header").on('mousedown', function (event) { 		$(this).addClass({cursor: 'move'}); 		$('body').addClass('select'); 		dialogOffset = $modalDialog.offset(); 		mouseOffset = { 			top: event.pageY - dialogOffset.top, 			left: event.pageX - dialogOffset.left 		}; 		$('body').on("mousemove", function (event) { 			var left = event.pageX - mouseOffset.left; 			var top = event.pageY - mouseOffset.top; 			if (left < 10) { 				left = 0; 			} else if (left > $(window).width() - $modalDialog.width()) { 				left = $(window).width() - $modalDialog.width(); 			} 			if (top < 10) { 				top = 0; 			} else if (top > $(window).height() - $modalDialog.height()) { 				top = $(window).height() - $modalDialog.height(); 			} 			$modalDialog.offset({ 				top: top, 				left: left 			}); 		}); 	});  	$(document).on("mouseup mouseleave", function () { 		$('body').off("mousemove"); 	}); }

2. 在modal的show方法中添加调用draggable方法

Modal.prototype.show = function (_relatedTarget) {         var that = this         var e = $.Event('show.bs.modal', {relatedTarget: _relatedTarget})          this.$element.trigger(e)          if (this.isShown || e.isDefaultPrevented()) return          this.isShown = true          //调用draggable()增加拖拽         this.draggable()         this.checkScrollbar()         this.setScrollbar()         this.$body.addClass('modal-open')          this.escape()         this.resize()         //......省略 }

完成上面的操作后直接引入刚刚修改的源码js在页面就已经能够很好的支持拖拽了,而且整个拖拽是在可视窗口访问内,不会超出边界。

注意事项:完成上面的源码修改后最好将bootstrap的源码压缩打包,不熟悉自动构建的可以放到开放的网站压缩,熟悉自动化构建的最好使用gulp、webpack这样的前端自动化工具来打包压缩源代码减少网页加载过程中占用带宽。当然也建议将文件命名为bootstrap-draggable.min.js类似的名称,方便一目了然的猜到这文件与原始文件有何不同。除此之外你也可以直接下载bootstrap3.x版本的源代码,然后修改里面的modal.js,然后使用它自身grunt构建来重新打包。

问题引深:bootstrap 4.0+的版本源码和3.x的版本相比modal组件的修改并不很大,同样可以采取上面的方式。包括让modal居中也可修改源代码来完成。

版权申明:以上代码不做任何限制,但是转载本博客内容请注明原地址

 

 

本文发表于2018年01月05日 08:32
(c)注:本文转载自https://my.oschina.net/u/1760791/blog/1602473,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1555 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1