`
flex_莫冲
  • 浏览: 1095604 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用BOOTSTRAP创建没有遮罩的可移动dialog

阅读更多
bootstrap是个很流行的前端工具。我想做个没有遮罩的dialog,并且可拖动。如果通过jquery ui也可以生成,但是由于我同时也适用了jqueryeasyui。导致.dialog方法会优先使用easyui的实现,而easyui的dialog无疑是非常丑陋的,实在不能忍。正好,bootstrap也有dialog的功能,并且不需要通过js调用。当然,最关键是,调用的方法名是.modal 而不是.dialog()

而bootstrap的modal默认是带遮罩不可移动的,那么,怎么来自定义实现我需要的功能呢?

先上button和dialog的html
button html,点击button会打开dialog
<!--tool bar-->
			<div class="widget-body" id="toolbarWrapper">
				<div class="well well-sm well-light">
					<button class="btn btn-primary btn-lg no-modal" data-toggle="modal" data-target="#searchDialog">
						SEARCH
					</button>
				</div>
			</div>


dialog html。默认是不打开的
<div class="modal modeless" id="searchDialog" style="display:none;" role="dialog" data-backdrop="false">
		<div class="modal-content">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
					×
				</button>
				<h4 class="modal-title">尋找與取代</h4>
			</div>
			<div class="modal-body">
				<p>
					One fine body…
				</p>
			</div>
			<div class="modal-footer">
				<button type="button" class="btn btn-default" data-dismiss="modal">
					Close
				</button>
				<button type="button" class="btn btn-primary">
					Save changes
				</button>
			</div>
		</div>
	</div>


在class="modal"的div中加上data-backdrop="false"就不会有遮罩了。

使dialog可拖动header来移动:
var searchDialog = $("#searchDialog")
searchDialog.draggable({
	      handle: ".modal-header"
	});


 
基本完成了想要的功能了。但是还有个问题,当显示dialog时,如果原先的页面是有滚动条的,出现dialog后,滚动条不见了。而且不能向下滚动了。这是因为boostrap在body上加上了.modal-open 样式导致的。
overflow: hidden; 


只要将这个样式去掉就可以了

$(document).on('shown.bs.modal', function (event) {
		if ($('.modal:visible').length) {
	    	$('body').removeClass('modal-open');
	    	$('body').css({"padding-right":"0"}); // boostrap会加上这个。为了避免移位,去掉它
		}
	});
	


接下来,我们要实现,当滚动条滚动时,dialog能一直浮动在当前页面的某个位置。
为了生成缓冲效果,页面需要加上jquery.easing.1.3.js 这个特效库

var $float_speed = 1500, //milliseconds
		$float_easing = "easeOutQuint",
		$menu_fade_speed = 500, // milliseconds
		$closed_menu_opacity = 0.75,
		searchDialog = $("#searchDialog"),
		menuPosition = searchDialog.position().top;
	

$(window).scroll(function () { 
		floatDialog();
	});
	
	function floatDialog(){
		var scrollAmount = $(document).scrollTop();
		var newPosition = menuPosition + scrollAmount;
		if($(window).height() < searchDialog.height()){
			searchDialog.css("top", menuPosition);
		} else {
			searchDialog.stop().animate({top: newPosition}, $float_speed, $float_easing);
		}
	}


现在,已经实现了我们想要的所有功能了,但是还有个小问题,当关闭dialog后,页面的滚动条会滚动到最上面。导致这个问题的代码是
$(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
    var $this   = $(this)
    var href    = $this.attr('href')
    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())

    if ($this.is('a')) e.preventDefault()

    $target.one('show.bs.modal', function (showEvent) {
      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
      $target.one('hidden.bs.modal', function () { //$target 是dialog,#searchDialog
      	console.log($this); // 这个是打开dialog的按纽元素
        $this.is(':visible') && $this.trigger('focus')
      })
    })
    Plugin.call($target, option, this)
  })


由于关闭后执行了$this.trigger('focus'),因此焦点会回到打开dialog的按纽,而这个按纽刚好在页面顶部,因此滚动条回到了页面顶部。

https://github.com/paypal/bootstrap-accessibility-plugin#modal-dialog

见modal 第二点

当绑定了button才会触发下面的focus!
if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown

因此,我们只要将button html的data-target="#searchDialog" 删除掉,然后用js 打开modal就可以实现不focus button的功能了


// 删除了data-target="#searchDialog"
<div class="widget-body" id="toolbarWrapper">
				<div class="well well-sm well-light">
					<button class="btn btn-primary btn-lg no-modal" data-toggle="modal" >
						SEARCH
					</button>
				</div>
			</div>


用JS打开dialog。
$('#searchBtn').on('click', function () {
	  searchDialog.modal('toggle'); 
	})



GOOD,完美解决了。

bootstrap 参考文档:
http://getbootstrap.com/javascript/

附件解压后放在bootstrap-3.3.7\docs\examples 目录下可执行
分享到:
评论

相关推荐

    基于Bootstrap V3的Modal 进行 Dialog 二次封装 原创文章

    Bootstrap V3中的Modal组件是一个非常实用的特性,它允许开发者在网页上创建模态对话框,无需离开当前页面即可展示信息、获取用户输入或者执行其他交互操作。在本篇文章中,作者进行了对Modal的二次封装,创建了一个...

    Bootstrap Modal遮罩弹出层(完整版)

    - 模态窗口(`.rs-dialog`):同样使用`position: fixed`使其固定在屏幕上,通过`z-index`使其位于遮罩层之上,使用`-webkit-overflow-scrolling: touch`来支持触摸设备的滚动。 - 当模态窗口打开时,通过CSS3的`...

    封装的dialog插件 基于bootstrap模态对话框的简单扩展

    【封装的dialog插件 基于bootstrap模态对话框的简单扩展】 Bootstrap模态对话框(Modal)是一种常见的UI组件,用于展示弹出式的窗口,通常用于提示、确认、输入等场景。在原生Bootstrap中,每个模态对话框需要在...

    JQUERY 遮罩层

    除了手动创建遮罩层和弹出框,还有许多现成的 jQuery 插件可供使用,如 jQuery UI、Bootstrap Modal 或者 SweetAlert2。这些插件提供了丰富的自定义选项,如动画效果、关闭按钮、回调函数等。例如,使用 Bootstrap ...

    bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法

    Bootstrap是一款广泛使用的前端框架,它提供了许多方便的组件,其中包括日期选择器(DatePicker)。在实际应用中,开发者可能遇到一个常见的问题,那就是日期选择器(DatePicker)被弹出框(Dialog)遮挡,导致用户...

    Bootstrap Modal遮罩弹出层代码分享

    在Bootstrap框架中,Modal组件包括一个模态对话框(modal dialog)和一个半透明的背景遮罩(modal backdrop)。这个遮罩用于将用户注意力集中在模态内容上,防止与背景页面的其他元素互动。 在提供的代码中,我们...

    在手机上改进Bootstrap全屏模式的简单方法

    Bootstrap是一款广泛使用的前端框架,它提供了丰富的组件和样式,帮助开发者快速构建响应式、移动优先的网站。在手机等小屏幕设备上,Bootstrap的全屏模式对于某些应用场景尤其有用,如全屏模态框(modal)能提供更...

    bootstrap model.js 单模态框的css,js

    Bootstrap本身是一个流行的前端开发框架,它提供了一系列预先设计的CSS、JS组件,帮助开发者快速构建响应式和移动设备优先的网页。Model.js则是对Bootstrap原生模态功能的扩展,提供了更丰富的定制选项和交互特性。 ...

    Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法

    在使用Bootstrap框架构建网页时,有时会遇到一个常见的问题,那就是Bootstrap弹出框(modal)中的输入框(input)无法获得焦点。这个问题通常发生在尝试在已存在的modal之上再弹出一个新的modal层时,由于Bootstrap...

    基于bootstrap风格的弹框插件

    总结而言,这个基于Bootstrap风格的弹框插件提供了一种简洁而灵活的方式,用于在网页中创建与Bootstrap风格一致的提示和确认对话框。通过自定义参数和回调函数,开发者能够轻松适应各种应用场景,同时,其设计也为...

    解决Vue开发中对话框被遮罩层挡住的问题

    在Vue的开发中,一旦我们用到对话框,经常出现的问题是对话框被遮罩层挡住,无论是Element-UI dialog还是bootstrap的Modal,如下图所示: 造成这个问题的原因是对话框组件的父元素的position有fixed或者relative...

    在iframe中使bootstrap的模态框在父页面弹出问题

    Bootstrap是当前Web开发中最流行的前端框架之一,提供了许多实用的UI组件,包括模态框,但是当我们在使用iframe时,bootstrap的模态框就会出现问题,即模态框弹出的位置是以子页面为标准居中的,并且遮罩层也只有子...

    基于jQuery弹出层插件实现的多种不同展开方式的遮罩效果.zip

    常见的插件如jQuery UI的Dialog,Bootstrap的Modal,以及专门的弹出层插件如Layer、Modalbox等。这些插件通常包括以下关键组件: 1. **弹出层容器**:这是弹出内容显示的地方,可以通过CSS调整其样式、位置和大小。...

    jquery login modal dialog

    标题 "jquery login modal dialog" 指的是使用 jQuery 实现的一种登录模态对话框功能。在 Web 开发中,模态对话框常用于提供一种不中断用户主界面体验的交互方式,例如显示登录表单。jQuery 是一个广泛使用的 ...

    jQuery实现四种常见简洁遮罩弹出层代码特效.zip

    5. **插件使用**:jQuery有众多预封装的插件如jQuery UI、Bootstrap等,它们提供了弹出层组件,可以快速实现功能丰富的弹出层,包括拖放、自适应布局等高级特性。例如,jQuery UI的Dialog组件提供了易于配置的选项,...

    Ajax Model Dialog

    // 假设使用Bootstrap的modal插件 }, error: function() { alert("数据加载失败!"); } }); }); // 关闭对话框 $("#dialogClose").click(function() { $("#dialogModal").modal("hide"); }); ``` 在这个...

    Bootstrap模态对话框用法简单示例

    总的来说,Bootstrap模态对话框是一种强大且易于使用的组件,它简化了网页中弹出窗口的实现,使得开发者能够更专注于内容和功能的设计,而无需过多关注底层的实现细节。通过理解其基本结构和属性,开发者可以快速地...

Global site tag (gtag.js) - Google Analytics