详解为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 相关文章推荐
js常见表单应用技巧
Jan 09 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
Jul 17 Javascript
javascript的回调函数应用示例
Feb 20 Javascript
javascript实现图片自动和可控的轮播切换特效
Apr 13 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 Javascript
使用 stylelint检查CSS_StyleLint
Apr 28 Javascript
老生常谈JQuery data方法的使用
Sep 09 Javascript
JS中from 表单序列化提交的代码
Jan 20 Javascript
javascript基础知识之html5轮播图实例讲解(44)
Feb 17 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
Jul 18 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
Dec 13 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
Jan 08 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连接函数implode与分割explode的深入解析
2013/06/26 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
尝试在让script的type属性等于text/html
2013/01/15 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
Python中endswith()函数的基本使用
2015/04/07 Python
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
TF-IDF与余弦相似性的应用(二) 找出相似文章
2017/12/21 Python
Python使用re模块实现信息筛选的方法
2018/04/29 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
家庭财产分割协议书范本
2014/11/24 职场文书
事业单位个人总结
2015/02/12 职场文书
男方婚前保证书
2015/02/28 职场文书
2015年法制宣传月活动总结
2015/03/26 职场文书
python绘图subplots函数使用模板的示例代码
2021/04/30 Python
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang
青岛市的收音机研制与生产
2022/04/07 无线电
Win11 21h2可以升级22h2吗?看看你的电脑符不符合要求
2022/07/07 数码科技