详解为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 相关文章推荐
var与Javascript变量隐式声明
Sep 17 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
Dec 07 Javascript
JS给Textarea文本框添加行号的方法
Aug 20 Javascript
jquery图片滚动放大代码分享(1)
Aug 25 Javascript
JavaScript实现汉字转换为拼音的库文件示例
Dec 22 Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 Javascript
微信小程序canvas写字板效果及实例
Jun 15 Javascript
vue2.x+webpack快速搭建前端项目框架详解
Nov 30 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
Apr 12 jQuery
Vue中如何实现proxy代理
Apr 20 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
Apr 10 Javascript
解决antd Form 表单校验方法无响应的问题
Oct 27 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
discuz安全提问算法
2007/06/06 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
Bootstrap响应式侧边栏改进版
2016/09/17 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
vue后台管理之动态加载路由的方法
2018/08/13 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
vue使用nprogress加载路由进度条的方法
2020/06/04 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python访问类中docstring注释的实现方法
2015/05/04 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
python kafka 多线程消费者&amp;手动提交实例
2019/12/21 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
普天C++笔试题
2016/03/20 面试题
接受捐赠答谢词
2014/01/27 职场文书
李开复演讲稿
2014/05/24 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
教育见习报告范文
2014/11/03 职场文书
2014年中班下学期工作总结
2014/12/11 职场文书
公司车队管理制度
2015/08/04 职场文书
MySQL 开窗函数
2022/02/15 MySQL
基于Python实现股票收益率分析
2022/04/02 Python
Python绘制散乱的点构成的图的方法
2022/04/21 Python
Python Flask实现进度条
2022/05/11 Python