详解为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 相关文章推荐
jquery获取复选框被选中的值
Apr 10 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
Jun 07 Javascript
js动态生成form 并用ajax方式提交的实现方法
Sep 09 Javascript
vue绑定设置属性的多种方式(5)
Aug 16 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
Sep 25 Javascript
快速解决brew安装特定版本flow的问题
May 17 Javascript
vue form 表单提交后刷新页面的方法
Sep 04 Javascript
Vue通过ref父子组件拿值方法
Sep 12 Javascript
angular6开发steps步骤条组件
Jul 04 Javascript
vue实现路由不变的情况下,刷新页面操作示例
Feb 02 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
Jun 08 Javascript
JS forEach跳出循环2种实现方法
Jun 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
PHP4 与 MySQL 交互使用
2006/10/09 PHP
PHP 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
mayfish 数据入库验证代码
2010/04/30 PHP
php5.3 注意事项说明
2013/07/01 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
Python threading多线程编程实例
2014/09/18 Python
Python的subprocess模块总结
2014/11/07 Python
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
pandas中去除指定字符的实例
2018/05/18 Python
python中报错&quot;json.decoder.JSONDecodeError: Expecting value:&quot;的解决
2019/04/29 Python
django fernet fields字段加密实践详解
2019/08/12 Python
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
哈弗商学院毕业生求职信
2014/02/26 职场文书
会计学专业求职信
2014/07/17 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
导游词之山西-五老峰
2019/10/07 职场文书