详解为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实现的购物车效果可以运用在好多地方
May 09 Javascript
我的Node.js学习之路(四)--单元测试
Jul 06 Javascript
简单实现jQuery级联菜单
Jan 09 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
Jan 16 Javascript
vue实现图书管理demo详解
Oct 17 Javascript
JS计算距当前时间的时间差实例
Dec 29 Javascript
微信小程序scroll-x失效的完美解决方法
Jul 18 Javascript
vue实现的组件兄弟间通信功能示例
Dec 04 Javascript
微信小程序canvas绘制圆角base64图片的实现
Aug 18 Javascript
js实现批量删除功能
Aug 27 Javascript
从源码角度来回答keep-alive组件的缓存原理
Jan 18 Javascript
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
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安全配置
2006/12/06 PHP
解析php函数method_exists()与is_callable()的区别
2013/06/21 PHP
php加密解密实用类分享
2014/01/07 PHP
php读取目录所有文件信息dir示例
2014/03/18 PHP
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
ES6下React组件的写法示例代码
2017/05/04 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
简单的Python2.7编程初学经验总结
2015/04/01 Python
解读Python中degrees()方法的使用
2015/05/18 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
Python元字符的用法实例解析
2018/01/17 Python
python实现微信自动回复功能
2018/04/11 Python
Python爬虫信息输入及页面的切换方法
2018/05/11 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
python获取Pandas列名的几种方法
2019/08/07 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
python实现串口通信的示例代码
2020/02/10 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
学生党支部先进事迹
2014/02/04 职场文书
女娲补天教学反思
2014/02/05 职场文书
施工材料员岗位职责
2014/02/12 职场文书
暑假打工感想
2015/08/07 职场文书
MySQL多表查询机制
2022/03/17 MySQL
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server