详解为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 设置某DIV区域内的checkbox复选框
Nov 30 Javascript
自己写的Javascript计算时间差函数
Oct 28 Javascript
浅谈js的setInterval事件
Dec 05 Javascript
轻量级javascript 框架Backbone使用指南
Jul 24 Javascript
JavaScript常用本地对象小结
Mar 28 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
Feb 04 Javascript
Vuex提升学习篇
Jan 11 Javascript
ES6之模版字符串的具体使用
May 17 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
Apr 17 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 Javascript
JavaScript实现网页计算器功能
Oct 29 Javascript
Nuxt的动态路由和参数校验操作
Nov 09 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
获取远程文件大小的php函数
2010/01/11 PHP
php实现无限级分类实现代码(递归方法)
2011/01/01 PHP
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
2011/11/25 PHP
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP常见数组函数用法小结
2016/03/21 PHP
功能强大的php分页函数
2016/07/20 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
2010/05/24 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
小米5s微信跳一跳小程序python源码
2018/01/08 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
详解python metaclass(元类)
2020/08/13 Python
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
庆七一活动方案
2014/01/25 职场文书
产品质量承诺书范文
2014/03/27 职场文书
小学生操行评语大全
2014/04/22 职场文书
李开复演讲稿
2014/05/24 职场文书