aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfat <[email protected]>2014-03-16 18:38:47 -0700
committerfat <[email protected]>2014-03-16 18:38:47 -0700
commit615dcb5ca068b1290cfd74d0f3b30272328f60fa (patch)
treec4bbfb72dea42ee9931aa5fa45f53cff6ff5157f
parentbdb70fa471965728609d86c001384791fa44398b (diff)
downloadbootstrap-615dcb5ca068b1290cfd74d0f3b30272328f60fa.tar.xz
bootstrap-615dcb5ca068b1290cfd74d0f3b30272328f60fa.zip
fixes #9855
-rw-r--r--js/modal.js35
-rw-r--r--less/modals.less9
2 files changed, 38 insertions, 6 deletions
diff --git a/js/modal.js b/js/modal.js
index f6dc477b1..454d7d57a 100644
--- a/js/modal.js
+++ b/js/modal.js
@@ -15,6 +15,7 @@
var Modal = function (element, options) {
this.options = options
+ this.$body = $(document.body)
this.$element = $(element)
this.$backdrop =
this.isShown = null
@@ -48,6 +49,9 @@
this.isShown = true
+ this.$body.addClass('modal-open')
+
+ this.setScrollbar()
this.escape()
this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
@@ -56,7 +60,7 @@
var transition = $.support.transition && that.$element.hasClass('fade')
if (!that.$element.parent().length) {
- that.$element.appendTo(document.body) // don't move modals dom position
+ that.$element.appendTo(that.$body) // don't move modals dom position
}
that.$element
@@ -96,6 +100,9 @@
this.isShown = false
+ this.$body.removeClass('modal-open')
+
+ this.resetScrollbar()
this.escape()
$(document).off('focusin.bs.modal')
@@ -153,7 +160,7 @@
var doAnimate = $.support.transition && animate
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
- .appendTo(document.body)
+ .appendTo(this.$body)
this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
if (e.target !== e.currentTarget) return
@@ -188,6 +195,26 @@
}
}
+ Modal.prototype.setScrollbar = function () {
+ if (document.body.clientHeight <= window.innerHeight) return
+ var scrollbarWidth = this.measureScrollbar()
+ var bodyPad = parseInt(this.$body.css('padding-right') || 0)
+ if (scrollbarWidth) this.$body.css('padding-right', bodyPad + scrollbarWidth)
+ }
+
+ Modal.prototype.resetScrollbar = function () {
+ this.$body.css('padding-right', '')
+ }
+
+ Modal.prototype.measureScrollbar = function () { // thx walsh
+ var scrollDiv = document.createElement('div')
+ scrollDiv.className = 'modal-scrollbar-measure'
+ this.$body.append(scrollDiv)
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+ this.$body[0].removeChild(scrollDiv)
+ return scrollbarWidth
+ }
+
// MODAL PLUGIN DEFINITION
// =======================
@@ -236,8 +263,4 @@
})
})
- $(document)
- .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
- .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
-
}(jQuery);
diff --git a/less/modals.less b/less/modals.less
index 8438a1616..093d05131 100644
--- a/less/modals.less
+++ b/less/modals.less
@@ -118,6 +118,15 @@
}
}
+// Measure scrollbar width for padding body during modal show/hide
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+
// Scale up the modal
@media (min-width: @screen-sm-min) {
// Automatically set modal's width for larger viewports