Общая концепция для достижения этой цели довольно проста:
- Измените JavaScript, чтобы добавить класс в
body
, когда навигация открыта (я назвал его nav-open
.) - Измените CSS так, чтобы элемент "overlay" (у вас уже был его элемент) отображался, когда тело имеет класс
nav-open
- Настройте CSS элемента overlay, чтобы он правильно отображался(по какой-то причине на нем было
opacity: 0
, что означало там , но не было видимым ).
Вот соответствующий CSS:
#sidenav-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
width: 100vw;
height: 100vh;
// removed opacity: 0;
background-color: rgba(0, 0, 0, 0.5);
z-index: 997;
// set display to none by default
display: none;
}
// when the body has the class nav-open, display the overlay
.nav-open #sidenav-overlay {
display: block;
}
Вот соответствующие изменения в вашем javascript:
// no-conflict-safe document ready function
jQuery(function($) {
$('#show-hide-menu').click(function() {
if ($('#slide-out').hasClass('visible')) {
// $('#slide-out').removeClass('visible');
$('#slide-out').toggleClass('close');
} else {
$('#slide-out').addClass('visible');
}
// check if the nav is "open"
var open = !$('#slide-out').hasClass('close');
// for simplicity, always first remove the nav-open from the body
$('body').removeClass('nav-open');
// if the nav is open, add the 'nav-open' class to the body
if (open) {
$('body').addClass('nav-open');
}
});
// modify to use "on", is best-practice
// $(document).click(function(e) {
$(document).on('click', function(e) {
var sidebar = $(".sidenav, #show-hide-menu");
if (!sidebar.is(e.target) && sidebar.has(e.target).length === 0) {
$('#slide-out').toggleClass('close');
// be sure the nav-open class is removed when the sidebar is dismissed
$('body').removeClass('nav-open');
}
});
});
Вот ссылка на вашу скрипку, модифицированная этими изменениями, чтобы делать то, что вы хотите: http://jsfiddle.net/cale_b/hThGb/8849/