Je travaille sur un site utilisant Bootstrap 3.1.0.
Vous remarquerez que lorsque la fenêtre modale s'ouvre, la barre de défilement du navigateur disparaît pour une fraction de seconde, puis revient. Il fait la même chose quand vous le fermez.
Comment puis-je faire en sorte qu'il s'ouvre et se ferme sans aucune interaction de la barre de défilement du navigateur. J'ai vu des articles sur la pile où des gens rencontraient des problèmes, mais je ne trouve pas de réponse spécifique à mon problème. Par conséquent, si quelqu'un d'autre a fait cette demande et que quelqu'un le sait et veut me lier à cela, j'apprécierais il. J'ai cherché pendant environ 2 heures avant de poster.
c'est ce que j'ai trouvé dans github quand je cherche à propos de ce problème et pour moi cela fonctionne très bien
js:
$(document).ready(function () {
$('.modal').on('show.bs.modal', function () {
if ($(document).height() > $(window).height()) {
// no-scroll
$('body').addClass("modal-open-noscroll");
}
else {
$('body').removeClass("modal-open-noscroll");
}
});
$('.modal').on('hide.bs.modal', function () {
$('body').removeClass("modal-open-noscroll");
});
})
css utilisez ce css si vous avez nav-fixed-top et navbar-fixed-bottom :
body.modal-open-noscroll
{
margin-right: 0!important;
overflow: hidden;
}
.modal-open-noscroll .navbar-fixed-top, .modal-open .navbar-fixed-bottom
{
margin-right: 0!important;
}
ou utilisez ce css si vous avez navbar-default
body.modal-open-noscroll
{
margin-right: 0!important;
overflow: hidden;
}
.modal-open-noscroll .navbar-default, .modal-open .navbar-default
{
margin-right: 0!important;
}
.modal {
overflow-y: auto;
}
.modal-open {
overflow: auto;
}
Va s'en débarrasser. Cela a été ajouté pour que les modaux fonctionnent de manière plus réactive, afin que vous puissiez faire défiler l'écran et voir un modal si l'écran était trop court. Cela empêche également le défilement de l’arrière-plan tant qu’un modal est actif. Si vous n'avez pas besoin de cette fonctionnalité, vous pouvez utiliser le css que j'ai posté.
Quelques informations supplémentaires: Ils définissent .modal-open sur le corps, ce qui empêche tout défilement sur le corps et masque la barre de défilement du corps. Ensuite, lorsque le modal arrive, l’arrière-plan sombre qui occupe l’ensemble de l’écran et overflow-y: scroll oblige la barre de défilement à revenir. fond sombre et voir le reste.
La résolution du problème du décalage gauche est facile à faire en utilisant CSS seul.
.modal-open[style] {
padding-right: 0px !important;
}
Vous écrasez simplement un style en ligne qui existe dans le code. J'utilise le mien dans une construction WordPress et le style en ligne était appliqué au corps. Ressemblait à ceci:
<body class="home blog logged-in modal-open" style="padding-right: 15px;">
J'espère que cela aide quelqu'un!
.modal {
overflow-y: auto;
}
.modal-open {
overflow: auto;
}
.modal-open[style] {
padding-right: 0px !important;
}
Merci à ben et cjd.
Le code ci-dessus semble fonctionner pour moi.
Il s'agit d'un problème signalé lié à l'initialisation: https://github.com/twbs/bootstrap/issues/9855
Et ceci est ma solution rapide temporaire et fonctionne également à l'aide de la barre de navigation supérieure fixe, uniquement à l'aide de javascript. Chargez ce script avec votre page.
$(document.body)
.on('show.bs.modal', function () {
if (this.clientHeight <= window.innerHeight) {
return;
}
// Get scrollbar width
var scrollbarWidth = getScrollBarWidth()
if (scrollbarWidth) {
$(document.body).css('padding-right', scrollbarWidth);
$('.navbar-fixed-top').css('padding-right', scrollbarWidth);
}
})
.on('hidden.bs.modal', function () {
$(document.body).css('padding-right', 0);
$('.navbar-fixed-top').css('padding-right', 0);
});
function getScrollBarWidth () {
var inner = document.createElement('p');
inner.style.width = "100%";
inner.style.height = "200px";
var outer = document.createElement('div');
outer.style.position = "absolute";
outer.style.top = "0px";
outer.style.left = "0px";
outer.style.visibility = "hidden";
outer.style.width = "200px";
outer.style.height = "150px";
outer.style.overflow = "hidden";
outer.appendChild (inner);
document.body.appendChild (outer);
var w1 = inner.offsetWidth;
outer.style.overflow = 'scroll';
var w2 = inner.offsetWidth;
if (w1 == w2) w2 = outer.clientWidth;
document.body.removeChild (outer);
return (w1 - w2);
};
Voici l'exemple de travail: http://jsbin.com/oHiPIJi/64
Si vous avez corrigé la barre de navigation et que vous ne voulez pas faire défiler le corps lorsque modal est ouvert, utilisez ce style
.modal-open {
overflow: visible;
}
.modal-open, .modal-open .navbar-fixed-top, .modal-open .navbar-fixed-bottom {
padding-right:0px!important;
}
Aucun des éléments de cette page ne fonctionnait pour moi dans les versions 3.3.4 et 3.3.5 Ajouter ce CSS a résolu le problème pour moi.
body {
padding-right:0px !important;
margin-right:0px !important;
}
$('body').on('show.bs.modal', function () {
if ($("body").innerHeight() > $(window).height()) {
$("body").css("margin-right", "17px");
}
});
$('body').on('hidden.bs.modal', function (e) {
$("body").css("margin-right", "0px");
});
Ce petit correctif simule la barre de défilement lorsque le modal est affiché, ajoutant une marge droite au corps.
Cette solution fonctionne pour moi !!!!
.modal {
overflow-y: auto;
}
.modal-open {
overflow: auto;
}
.modal-open[style] {
padding-right: 0px !important;
}
pour résoudre le problème provoquant le décalage de la page vers la droite
html, body{
padding: 0 !important;
}
html, body{
padding-right: 0px !important;
position: relative!important;
}
essayez ce code vraiment ça marche
Dans mon cas, la balise body spécifie déjà overflow:hidden
.
Lorsque la boîte de dialogue modale s'ouvre, elle ajoute également padding-right:17px;
au corps.
Mon code ici
.modal-open {
overflow: hidden!important;
padding-right:0!important
}
Lorsque le modal d'amorçage s'ouvre, la classe .modal-open est définie sur balise body. Dans ce dépassement de balise: masqué est défini. nous devons changer cela. Ajoutez le code ci-dessous dans votre CSS.
<style>
body.modal-open {
overflow: visible !important;
}
</style>
Référence: - Comment réparer Bootstrap modal background en haut de page
Depuis Bootstrap 3.3.2, le comportement semble être que les barres de défilement sont supprimées lorsque la boîte de dialogue est affichée et Bootstrap ajoute une marge de remplissage droite à l'élément body pour compenser l'espace précédemment occupé par la barre de défilement. Malheureusement, cela n’empêche pas le décalage d’écran, du moins dans les versions modernes de Chrome, IE, Firefox ou Safari. Aucune des corrections apportées ici ne résout complètement ce problème, mais la combinaison des réponses de ben.kaminski et d'une partie de la réponse de cjd82187 ne résout le problème qu'avec CSS:
/* removes inline padding added by Boostrap that makes the screen shift left */
.modal-open[style] {
padding-right: 0px !important;
}
/* keeps Bootstrap from removing the scrollbar if it's there */
.modal-open {
overflow: auto;
}
Comme mentionné par ben.kaminski, le code a été ajouté à Twitter Bootstrap afin que vous puissiez faire défiler l'écran pour afficher le modal s'il se situe au-delà du bas de l'écran. Pour conserver cette fonctionnalité, vous pouvez encapsuler la solution CSS dans une requête multimédia afin qu'elle ne s'applique qu'aux grandes fenêtres, à peu près comme ceci:
@media (min-width: 992px) {
.modal-open[style] {
padding-right: 0px !important;
}
.modal-open {
overflow: auto;
}
}
Implémenté cette solution simple
.modal-open {
padding-right: 0 !important;
}
html {
overflow-y: scroll !important;
}
Aucun de ce qui précède a travaillé et d'autres heures de recherche. Mais le code suivant fonctionnait parfaitement avec juste un peu de CSS. Ce qui précède n’enlèverait pas le rembourrage de style en ligne: 17px; avec JS ou jquery, je pouvais ajouter 0 padding, mais n’avait aucun effet.
.modal-open {
padding-right: 0px !important;
overflow-y: scroll;
width: 100%;
display: block;
}
.modal {
position: fixed;
top: 0;
left: 0;
z-index: 1050;
display: none;
width: 100%;
height: 100%;
outline: 0;
padding-right: 0 !important;
}
Ma solution Jquery:
var nb = $('nav.navbar-fixed-top');
$('.modal')
.on('show.bs.modal', function () {
nb.width(nb.width());
})
.on('hidden.bs.modal', function () {
nb.width(nb.width('auto'));
});
La meilleure solution pour moi était d'utiliser ces paramètres. Cela fonctionne pour le web et le mobile
.modal-open {
overflow: hidden;
position: absolute;
width: 100%;
height: 100%;
}
si quelqu'un utilise react-bootstrap
, la solution est un peu plus complexe, car react-bootstrap
applique des styles inline à l'élément body
pour manipuler les styles overflow
et padding
. Cela signifie que vous devez remplacer ces styles en ligne par !important
body.modal-open {
// enable below if you want to additionally allow scrolling with the modal displayed
// overflow: auto !important;
// prevent the additional padding from being applied
padding: 0 !important;
}
NOTE: si vous n'activez pas le défilement (en rendant la barre de défilement visible) en supprimant la mise en commentaire du style overflow
, le contenu de votre page apparaît alors décalé de la largeur de la visible qui est).
Pour Bootstrap version 3.2.0, ces lignes de remplissage de fichier css corrigent l'erreur:
.modal-open .navbar-fixed-top,
.modal-open .navbar-fixed-bottom {
padding-right: 17px;
}
Solution trouvée ici
Ma page avait besoin d'une version modifiée du code d'Agni Pradharma pour l'empêcher de changer lorsque le modal était affiché. J'ai un en-tête de navigation fixe et des pages avec défilement, d'autres sans. Démo ici: http://jsbin.com/gekenakoki/1/
J'ai utilisé les deux css:
.modal {
overflow-y: auto;
}
.modal-open {
overflow: auto;
}
et le script:
$(document.body)
.on('show.bs.modal', function () {
if (this.clientHeight <= window.innerHeight) {
return;
}
// Get scrollbar width
var scrollbarWidth = getScrollBarWidth();
if (scrollbarWidth) {
$(document.body).css('padding-left', scrollbarWidth);
}
})
.on('hidden.bs.modal', function () {
$(document.body).css('padding-left', 0);
});
function getScrollBarWidth () {
var inner = document.createElement('p');
inner.style.width = "100%";
inner.style.height = "200px";
var outer = document.createElement('div');
outer.style.position = "absolute";
outer.style.top = "0px";
outer.style.left = "0px";
outer.style.visibility = "hidden";
outer.style.width = "200px";
outer.style.height = "150px";
outer.style.overflow = "hidden";
outer.appendChild (inner);
document.body.appendChild (outer);
var w1 = inner.offsetWidth;
outer.style.overflow = 'scroll';
var w2 = inner.offsetWidth;
if (w1 == w2) w2 = outer.clientWidth;
document.body.removeChild (outer);
return (w1 - w2);
};