Search and Top Navigation
#10569 closed bug (duplicate)
Opened August 28, 2014 01:19AM UTC
Closed August 28, 2014 02:53AM UTC
Incorrect z-index position of Datepicker in some cases
| Reported by: | yauheni | Owned by: | |
|---|---|---|---|
| Priority: | minor | Milestone: | none |
| Component: | ui.datepicker | Version: | 1.11.1 |
| Keywords: | Cc: | ||
| Blocked by: | Blocking: |
Description
Hello.
This bug is related to modal windows, when I use Bootstrap Modal v2.2.5 library https://github.com/jschr/bootstrap-modal.
Bootstrap Modal v2.2.5 extends Twitter Bootstrap's (http://getbootstrap.com) native modals (http://getbootstrap.com/javascript/#modals) to provide additional functionality.
I've got this bug on:
OS: Windows Vista Home Basic 32 bit, browser - Opera Next version 23.0.1522.75
OS: Windows 7 Enterprise 64 bit, browser - Mozilla Firefox version 31.0
I assign Datepicker widget for simple input in modal window and when I try to show Datepicker, it displays behind modal window:
[[Image(http://www.fotohost.by/pic_b/14/08/28/f75203b5e545ebaa9f734de071854299.jpg)]]
Source code of this example (or see on jsFiddle http://jsfiddle.net/bazk8mns/):
<!doctype html>
<html>
<head>
<title>Bootstrap-modal by jschr</title>
<!-- Bootstrap core CSS -->
<link href="http://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Bootstrap-modal plugin -->
<link href="http://jschr.github.io/bootstrap-modal/css/bootstrap-modal-bs3patch.css" rel="stylesheet">
<link href="http://jschr.github.io/bootstrap-modal/css/bootstrap-modal.css" rel="stylesheet">
<!-- jQuery UI -->
<link rel="stylesheet" href="http://code.jquery.com/ui/1.11.1/themes/smoothness/jquery-ui.css">
</head>
<body>
<button class="demo btn btn-primary btn-lg" data-toggle="modal" href="#responsive">View Demo</button>
<!-- Modal Definition -->
<div id="responsive" class="modal fade" tabindex="-1" data-width="760" style="display: none;">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title">Responsive</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-6">
<h4>Some Input</h4>
<p><input class="form-control" type="text" id="datepicker"/></p>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" data-dismiss="modal" class="btn btn-default">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://getbootstrap.com/dist/js/bootstrap.min.js"></script>
<!-- Bootstrap-modal plugin -->
<script src="http://jschr.github.io/bootstrap-modal/js/bootstrap-modalmanager.js"></script>
<script src="http://jschr.github.io/bootstrap-modal/js/bootstrap-modal.js"></script>
<!-- jQuery UI -->
<script src="http://code.jquery.com/ui/1.11.1/jquery-ui.js"></script>
<script>
$(function() {
$( "#datepicker" ).datepicker();
});
</script>
</body>
</html>
At that moment HTML-code looks like this (pay attention to style="z-index" rules):
<div id="ui-datepicker-div" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all" style="position: fixed; top: 0px; left: 277px; z-index: 1051; display: block;"> ... Datepicker's HTML-code </div> <div class="modal-scrollable" style="z-index: 1060;"> <div id="responsive" class="modal fade in" tabindex="-1" data-width="760" style="display: block; width: 760px; margin-left: -379px; margin-top: -117px;" aria-hidden="false"> ... modal's HTML-code </div> </div> <div class="modal-backdrop fade in" style="z-index: 1050;"> </div>
CSS class ".modal" has rule:
.modal {
...
z-index: 1050;
...
}
This means modal window has z-index equals 1050, but modal's parent DIV has z-index equals 1060!
The cause of the incorrect z-index of Datepicker is lazy algorithm in function datepicker_getZindex( elem ):
function datepicker_getZindex( elem ) {
var position, value;
while ( elem.length && elem[ 0 ] !== document ) {
// Ignore z-index if position is set to a value where z-index is ignored by the browser
// This makes behavior of this function consistent across browsers
// WebKit always returns auto if the element is positioned
position = elem.css( "position" );
if ( position === "absolute" || position === "relative" || position === "fixed" ) {
// IE returns 0 when zIndex is not specified
// other browsers return a string
// we ignore the case of nested elements with an explicit value of 0
// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
value = parseInt( elem.css( "zIndex" ), 10 );
if ( !isNaN( value ) && value !== 0 ) {
return value;
}
}
elem = elem.parent();
}
return 0;
}
I improved this function, and now it implements greedy algorithm (and Datepicker widget always have top position):
function datepicker_getZindex( elem ) {
var position, value, zIndexMax = 0;
while ( elem.length && elem[ 0 ] !== document ) {
// Ignore z-index if position is set to a value where z-index is ignored by the browser
// This makes behavior of this function consistent across browsers
// WebKit always returns auto if the element is positioned
position = elem.css( "position" );
if ( position === "absolute" || position === "relative" || position === "fixed" ) {
// IE returns 0 when zIndex is not specified
// other browsers return a string
// we ignore the case of nested elements with an explicit value of 0
// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
value = parseInt( elem.css( "zIndex" ), 10 );
if ( !isNaN( value ) && value !== 0 && value > zIndexMax) {
zIndexMax = value;
}
}
elem = elem.parent();
}
return zIndexMax;
}
P.S. Sorry, my English is bad :)
Attachments (0)
Change History (1)
Changed August 28, 2014 02:53AM UTC by comment:1
| _comment0: | Duplicate of #9013.[[BR]]Datepicker is the in the process of being rewritten and the new version will follow our standard logic for [http://api.jqueryui.com/theming/stacking-elements/ stacking elements]. This change is covered by #9013. You'll be able to make this work via the `appendTo` option at that time. → 1409226014401435 |
|---|---|
| resolution: | → duplicate |
| status: | new → closed |
Duplicate of #9013.Datepicker is in the process of being rewritten and the new version will follow our standard logic for stacking elements. This change is covered by #9013. You'll be able to make this work via the
appendTooption at that time.