详解为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 相关文章推荐
强制设为首页代码
Jun 19 Javascript
jquery交替变换颜色的三种方法 实例代码
Nov 19 Javascript
JS中类或对象的定义说明
Mar 10 Javascript
通过示例彻底搞懂js闭包
Aug 10 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
Oct 11 Javascript
vue.js响应式原理解析与实现
Jun 22 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
Nov 05 Javascript
vue2 中二级路由高亮问题及配置方法
Jun 10 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
Jun 25 Javascript
详解ES6 Promise的生命周期和创建
Aug 18 Javascript
vue+element tabs选项卡分页效果
Jun 29 Javascript
JavaScript arguments.callee作用及替换方案详解
Sep 02 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 中文处理函数集合
2008/08/27 PHP
PHP中strtotime函数使用方法分享
2012/01/10 PHP
php获取域名的google收录示例
2014/03/24 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
PHP动态规划解决0-1背包问题实例分析
2015/03/23 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
javascript 函数速查表
2010/02/07 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
JS实现多选框的操作
2020/06/24 Javascript
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
Python反射的用法实例分析
2018/02/11 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
2019/09/20 Python
python图形开发GUI库wxpython使用方法详解
2020/02/14 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
html5中JavaScript removeChild 删除所有节点
2014/05/16 HTML / CSS
企业办公室岗位职责
2014/03/12 职场文书
廉洁教育学习材料
2014/05/19 职场文书
合同范本之电脑出租
2019/08/13 职场文书
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis