详解为Bootstrap Modal添加拖拽的方法


Posted in Javascript onJanuary 05, 2018

网上有许多给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居中也可修改源代码来完成。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
通用javascript脚本函数库 方便开发
Oct 13 Javascript
firefox插件Firebug的使用教程
Jan 02 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
May 12 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
Sep 01 Javascript
js鼠标滑过图片震动特效的方法
Feb 17 Javascript
JS动态改变表格边框宽度的方法
Mar 31 Javascript
基于vue.js快速搭建图书管理平台
Oct 29 Javascript
快速搭建React的环境步骤详解
Nov 06 Javascript
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 jQuery
Vuex中的State使用介绍
Jan 19 Javascript
selenium+java中用js来完成日期的修改
Oct 31 Javascript
javascript异常处理实现原理详解
Feb 17 Javascript
JS交互点击WKWebView中的图片实现预览效果
Jan 05 #Javascript
Vue组件的使用教程详解
Jan 05 #Javascript
基于three.js编写的一个项目类示例代码
Jan 05 #Javascript
js中this对象用法分析
Jan 05 #Javascript
Node中使用ES6语法的基础教程
Jan 05 #Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
Jan 05 #Javascript
vue脚手架中配置Sass的方法
Jan 04 #Javascript
You might like
PHP读取MySQL数据代码
2008/06/05 PHP
js下函数般调用正则的方法附代码
2008/06/22 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
php文件上传简单实现方法
2015/01/24 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
基于hover的用法实例(推荐)
2017/07/04 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
重命名批处理python脚本
2013/04/05 Python
Python兔子毒药问题实例分析
2015/03/05 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
如何基于python操作json文件获取内容
2019/12/24 Python
Python timeit模块的使用实践
2020/01/13 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
Ajxa常见问题都有哪些
2014/03/26 面试题
新护士岗前培训制度
2014/02/02 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
保险公司年会主持词
2014/03/22 职场文书
思想政治表现评语
2015/01/04 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle