详解为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 08 Javascript
jquery鼠标滑过提示title具体实现代码
Aug 06 Javascript
jQuery简单实现验证邮箱格式
Jul 15 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
Apr 29 Javascript
基于JavaScript实现本地图片预览
Feb 08 Javascript
Angular2实现自定义双向绑定属性
Mar 22 Javascript
浅谈vue中.vue文件解析流程
Apr 24 Javascript
JavaScript 2018 中即将迎来的新功能
Sep 21 Javascript
javascript实现文本框标签验证的实例代码
Oct 14 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
Dec 06 Javascript
小程序两种滚动公告栏的实现方法
Sep 17 Javascript
Vue+Openlayers自定义轨迹动画
Sep 24 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和Java的des加密解密代码分享
2014/06/26 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
juqery 学习之四 筛选查找
2010/11/30 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
jQuery Plupload上传插件的使用
2017/04/19 jQuery
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
Numpy之文件存取的示例代码
2018/08/03 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
大学班级干部的自我评价分享
2014/02/10 职场文书
学雷锋演讲稿
2014/03/04 职场文书
家长对老师的评语
2014/04/18 职场文书
设计顾问服务计划书
2014/05/04 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
大学推普周活动总结
2015/05/07 职场文书
普通员工辞职信范文
2015/05/12 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS