网上有许多给Bootstrap Modal添加拖拽实现,可是许多代码看起来都比较复杂感受封装性可能也不太好,有的甚至使用了jquery ui的拖拽功能,这些都不是我想要的,其实我在给Bootstrap Modal添加拖拽功能的事情已是2017年春节的时候了,弹指一挥间一年就过去了。2017年春节的时候,因为以前项目有同事使用layer来作前端,可是对于我这种略懂js前端的后端开发来讲,让我引入layer和layui的一整套东西是艰难的,曾经大体的浏览过layui的一些组件,发现组件功能不是很完备,能够预见的是稍微复杂点的项目后期就会带来不少坑。所以当时就使用了bootstrap去做为前端的css框架,也大量使用modal这样的组件来作弹出窗口。javascript
1.打开bootstrap.js源代码找到modal组件代码块,在Modal.DEFAULTS代码块下加入拖拽代码实现。css
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在页面就已经可以很好的支持拖拽了,并且整个拖拽是在可视窗口范围内,不会超出边界。java
注意事项:完成上面的源码修改后最好将bootstrap的源码压缩打包,不熟悉自动构建的能够放到开放的网站压缩,熟悉自动化构建的最好使用gulp、webpack这样的前端自动化工具来打包压缩源代码减小网页加载过程当中占用带宽。固然也建议将文件命名为bootstrap-draggable.min.js相似的名称,方便一目了然的猜到这文件与原始文件有何不一样。除此以外你也能够直接下载bootstrap3.x版本的源代码,而后修改里面的modal.js,而后使用它自身grunt构建来从新打包。jquery
问题引深:bootstrap 4.0+的版本源码和3.x的版本相比modal组件的修改并不很大,一样能够采起上面的方式。包括让modal居中也可修改源代码来完成。webpack
版权申明:以上代码不作任何限制,可是转载本博客内容请注明原地址web