Я пытаюсь протолкнуть всю свою страницу прямо, когда нажимаю на свое гамбургер-меню, но когда я это делаю, мои изображения меняют размер вместе со всем, что установлено на margin: 0 auto;, в результате чего эти элементы уходят в середину представления. . Есть ли способ переместить все содержимое моей страницы вправо, чтобы оно не отображалось в представлении, а не изменяло размер? Хотелось бы держаться подальше от jQuery и просто сделать это с помощью Vanilla JS.
Мой CSS:
.sidenav {
height: 100%;
width: 0;
position: fixed;
z-index: 1;
top: 0;
left: 0;
background-color: #1c2234;
overflow-x: hidden;
transition: 0.5s;
padding-top: 60px;
}
.sidenav a {
padding: 8px 8px 8px 32px;
text-decoration: none;
font-size: 25px;
color: white;
display: block;
transition: 0.3s;
}
.sidenav a:hover {
color: #f5d0cd;
}
#main {
transition: margin-left .5s;
}
.hero-container {
height: 100vh;
padding-top: 0px;
}
.hero {
height: 100vh;
background-image: url("hero.jpg");
background-repeat: no-repeat;
background-size: 100%;
}
Мой HTML:
<body>
<!-- Sidenav -->
<div id = "mySidenav" class = "sidenav">
<a href = "javascript:void(0)" class = "closebtn" onclick = "closeNav()">×</a>
<a href = "#">Home</a>
<a href = "#">About</a>
<a href = "#">Visit</a>
<a href = "#">Catering</a>
<a href = "#">Wholesale</a>
<a href = "#">Shop</a>
</div>
<!-- Main separates main content from side nav -->
<div id = "main">
<!-- Header -->
<header>
<nav>
<div class = "row">
<ion-icon name = "menu" id = "hamburger" onclick = "openNav()"></ion-icon>
<%= link_to image_tag("blue_filled_mark1.png", :alt => "Valor Logo", :id => "main-logo"), root_path %>
</div>
</nav>
</header>
<section class = "hero-container">
<div class = "hero">
</div>
</section>
</div>
</body>
Мой Javascript:
function openNav() { // eslint-disable-line no-unused-vars
document.getElementById("mySidenav").style.width = "250px";
document.getElementById("main").style.marginLeft = "250px";
}
function closeNav() { // eslint-disable-line no-unused-vars
document.getElementById("mySidenav").style.width = "0";
document.getElementById("main").style.marginLeft= "0";
Заранее спасибо за помощь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте установить background-size: auto 100% на .hero:
function openNav() { // eslint-disable-line no-unused-vars
document.getElementById("mySidenav").style.width = "250px";
document.getElementById("main").style.marginLeft = "250px";
}
function closeNav() { // eslint-disable-line no-unused-vars
document.getElementById("mySidenav").style.width = "0";
document.getElementById("main").style.marginLeft = "0";
}.sidenav {
height: 100%;
width: 0;
position: fixed;
z-index: 1;
top: 0;
left: 0;
background-color: #1c2234;
overflow-x: hidden;
transition: 0.5s;
padding-top: 60px;
}
.sidenav a {
padding: 8px 8px 8px 32px;
text-decoration: none;
font-size: 25px;
color: white;
display: block;
transition: 0.3s;
}
.sidenav a:hover {
color: #f5d0cd;
}
#main {
transition: margin-left .5s;
}
.hero-container {
height: 100vh;
padding-top: 0px;
}
.hero {
height: 100vh;
background-image: url("https://cdn-image.departures.com/sites/default/files/styles/responsive_900x600/public/take-me-to-madison-avenue_2000x1333.jpg?itok=gN5iGEtX");
background-repeat: no-repeat;
background-size: auto 100%;
}<body>
<!-- Sidenav -->
<div id = "mySidenav" class = "sidenav">
<a href = "javascript:void(0)" class = "closebtn" onclick = "closeNav()">×</a>
<a href = "#">Home</a>
<a href = "#">About</a>
<a href = "#">Visit</a>
<a href = "#">Catering</a>
<a href = "#">Wholesale</a>
<a href = "#">Shop</a>
</div>
<!-- Main separates main content from side nav -->
<div id = "main">
<!-- Header -->
<header>
<nav>
<div class = "row">
<b name = "menu" id = "hamburger" onclick = "openNav()">menu</b>
</div>
</nav>
</header>
<section class = "hero-container">
<div class = "hero">
</div>
</section>
</div>
</body>Опция 1: Измените размер фона .hero на «100vw», а не на 100%.
.hero {
height: 100vh;
background-image: url("hero.jpg");
background-repeat: no-repeat;
background-size: 100vw;
}
Вариант 2: Установите ширину #main на '100vw'
#main {
transition: margin-left .5s;
width: 100vw
}
Добавление поля margin-left уменьшает ширину #main, потому что это не задано явно. Поскольку размер фона в процентах определяется относительно родительского контейнера, фоновое изображение сжимается, чтобы соответствовать новому размеру #main. Единица 'vw' по сути то же самое, за исключением того, что она относится к области просмотра и родительскому элементу. (См. Хорошее объяснение VW здесь). Установка фиксированного размера фона (вариант 1) заставляет ширину оставаться на уровне 100% от области просмотра, даже когда родительский элемент сжимается. Установка родительского элемента (#main) на фиксированный размер (вариант 2) также работает.
Надеюсь это поможет!
вот идея:
html:
<body>
<div class = "body-wrap">
<!-- Sidenav -->
<div id = "mySidenav" class = "sidenav">
<a href = "javascript:void(0)" class = "closebtn" onclick = "closeNav()">×</a>
<a href = "#">Home</a>
<a href = "#">About</a>
<a href = "#">Visit</a>
<a href = "#">Catering</a>
<a href = "#">Wholesale</a>
<a href = "#">Shop</a>
</div>
<!-- Main separates main content from side nav -->
<div id = "main">
<!-- Header -->
<header>
<nav>
<div class = "row">
<ion-icon name = "menu" id = "hamburger" onclick = "openNav()"></ion-icon>
<%= link_to image_tag("blue_filled_mark1.png", :alt => "Valor Logo", :id => "main-logo"), root_path %>
</div>
</nav>
</header>
<section class = "hero-container">
<div class = "hero">
</div>
</section>
</div>
</div>
</body>
css:
.sidenav{
width: 200px; /*or whatever width you want*/
left: -200px;
position: fixed;
}
.sidenav.open{
left: 0;
}
.body-wrap {
position: relative;
left: 0;
overflow: hidden;
}
.body-wrap.open {
left: 200px;
}
затем в событии клика просто включите и выключите свой открытый класс.
Когда вы увеличиваете левое поле вашего контейнера #main, вы фактически уменьшаете его доступную ширину для рендеринга его дочерних элементов. Вместо этого вы можете использовать position: relative; left: 250px, чтобы "сдвинуть" блок #main вправо, не изменяя его ширину:
function openNav() { // eslint-disable-line no-unused-vars
document.getElementById("mySidenav").style.width = "250px";
document.getElementById("main").style.left = "250px";
}
function closeNav() { // eslint-disable-line no-unused-vars
document.getElementById("mySidenav").style.width = "0";
document.getElementById("main").style.left = "0";
}.sidenav {
height: 100%;
width: 0;
position: fixed;
z-index: 1;
top: 0;
left: 0;
background-color: #1c2234;
overflow-x: hidden;
transition: 0.5s;
padding-top: 60px;
}
.sidenav a {
padding: 8px 8px 8px 32px;
text-decoration: none;
font-size: 25px;
color: white;
display: block;
transition: 0.3s;
}
.sidenav a:hover {
color: #f5d0cd;
}
#main {
transition: all .5s ease-out;
position: relative;
left: 0;
}
.hero-container {
height: 100vh;
padding-top: 0px;
}
.hero {
height: 100vh;
background-image: url("https://us.123rf.com/450wm/stockbroker/stockbroker1506/stockbroker150603180/42131668-family-buying-fresh-vegetables-at-farmers-market-stall.jpg?ver=6");
background-repeat: no-repeat;
background-size: 100%;
}
.row {
background: #222;
color: #FFF;
padding: 15px;
}
.row span {
cursor: pointer;
}
.row span:hover {
text-decoration: underline;
}<!-- Sidenav -->
<div id = "mySidenav" class = "sidenav">
<a href = "javascript:void(0)" class = "closebtn" onclick = "closeNav()">×</a>
<a href = "#">Home</a>
<a href = "#">About</a>
<a href = "#">Visit</a>
<a href = "#">Catering</a>
<a href = "#">Wholesale</a>
<a href = "#">Shop</a>
</div>
<!-- Main separates main content from side nav -->
<div id = "main">
<!-- Header -->
<header>
<nav>
<div class = "row">
<span name = "menu" id = "hamburger" onclick = "openNav()">Open Menu</span>
</div>
</nav>
</header>
<section class = "hero-container">
<div class = "hero">
</div>
</section>
</div>