停用画布菜单时停止身体滚动

时间:2020-08-24 14:52:44

标签: javascript html css

我正面临着滚动,下面将对此进行说明。我仍在移动网站上工作,尚未将其安装到桌面上。画布外菜单是this的修改版本,具有“显示”效果。

问题

在移动设备上滚动时,在第一次滑动动作后,网站“快照”(未应用CSS捕捉)

  • 从顶部滑动到底部时,它会捕捉到几乎底部。我必须刷两次。
  • 从底部向上滑动时,它会捕捉到徽标下方。我必须刷两次。
  • 这也将在“画布”菜单上发生,您可以看到我必须滑动两次才能到达底部。

我尝试过的事情

如果我取消了高度(请参见下面的代码),则捕捉问题将消失,因此向上/向下滑动一次将毫无问题。

html,
body,
.off-canvas,
.main-body,
.main-container {
    height: 100%;
}

但是,这现在增加了我的画布菜单问题。向下滚动菜单时,主体将随之滚动。有没有办法在香草JS中添加一些东西来阻止这种情况的发生?我尝试了一些工作溢出的方法,但是没有运气(可能实现有误)。

所需结果

  • 能够一动不动就滑动
  • “画布”菜单独立于主容器。因此,当用户在其上滚动时,它将一直延伸到菜单的内容,并且主容器将保持固定,因此在打开画布时它不会移动。
  • https://ASOS.com移动网站关闭菜单是最能描述上述内容的内容。当他们的菜单打开时,您无法在主体上滚动,并且菜单固定为它自己的高度,而不是主容器。

在CSS中,我记下了“堆栈溢出开始”和“堆栈溢出结束”可能出在哪里。 JS位于HTML的末尾。避免使用jquery(希望保留在普通JS上)。如果我还不熟悉JS,将不胜感激我可以实现/修改/删除的任何代码

谢谢!

HTML

<!DOCTYPE html>
<html lang="en" class="no-js">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Site</title>
        <link rel="stylesheet" type="text/css" href="css/custom.css" />
    </head>
    <body>
        <style>
            @font-face {
                font-family: 'Quicksand';
                font-style: normal;
                font-weight: 400;
                font-display: swap;
                src: local('Quicksand'),
                    url('../fonts/Quicksand-Regular.woff2') format('woff2');
            }
            @font-face {
                font-family: 'Quicksand';
                font-style: normal;
                font-weight: 600;
                font-display: swap;
                src: local('Quicksand-SemiBold'),
                    url('../fonts/Quicksand-SemiBold.woff2') format('woff2');
            }
            body {
                font-family: 'Quicksand', Fallback, sans-serif;
            }
        </style>
        
        <div id="off-canvas" class="off-canvas">    
            <nav class="oc-menu oc-effect">
                <h2>Sidebar</h2>
                <ul>
                    <li><a href="#">Item 1</a></li>
                    <li><a href="#">Item 2</a></li>
                    <li><a href="#">Item 3</a></li>
                    <li><a href="#">Item 4</a></li>
                    <li><a href="#">Item 5</a></li>
                    <li><a href="#">Item 6</a></li>
                    <li><a href="#">Item 7</a></li>
                    <li><a href="#">Item 8</a></li>
                    <li><a href="#">Item 9</a></li>
                    <li><a href="#">Item 10</a></li>
                    <li><a href="#">Item 11</a></li>
                    <li><a href="#">Item 12</a></li>
                    <li><a href="#">Item 13</a></li>
                </ul>
            </nav>

            <div class="main-body">
                <div class="main-container">
                    
                    <!-- NAVBAR -->
                    
                    <header>
                        <div class="navbar">
                            <div class="logo">
                                <h4>Site</h4>
                            </div>
                            <div class="header-icons">
                                <div class="basket">
                                    <img src="img/shopping-cart.svg" alt="shopping cart image" draggable="false" class="basket-img">
                                    <p class="basket-text">Basket</p>
                                </div>
                                <div class="hamburger">
                                    <img src="img/hamburger.svg" alt="hamburger menu" draggable="false" class="hamb" data-effect="oc-effect">
                                    <p class="hamburger-menu" data-effect="oc-effect">Menu</p>
                                </div>
                            </div>
                        </div>
                        
                        <!-- Search Form Top -->
                        
                        <div class="sft">
                            <form role="search" class="sft-form">
                                <span class="sft-search-svg">
                                    <svg width="13pt" height="13pt" version="1.1" viewBox="-1 0 136 136.22" xmlns="http://www.w3.org/2000/svg"><path d="m93.148 80.832c16.352-23.09 10.883-55.062-12.207-71.41s-55.062-10.883-71.41 12.211c-16.348 23.09-10.883 55.059 12.211 71.406 16.48 11.668 38.27 12.566 55.652 2.3008l37.77 37.543c4.0781 4.293 10.863 4.4648 15.156 0.38672 4.293-4.0742 4.4648-10.859 0.39063-15.152-0.12891-0.13672-0.25391-0.26172-0.39063-0.39063zm-41.84 3.5c-18.246 0.003907-33.039-14.777-33.051-33.023-0.003906-18.246 14.777-33.039 33.027-33.047 18.223-0.007813 33.008 14.75 33.043 32.973 0.03125 18.25-14.742 33.066-32.996 33.098h-0.023437z"/>
                                    </svg>
                                </span>
                                <input type="search" name="q" class="sft-input" placeholder="Search For..." aria-label="Search through site content" autocomplete="off">
                                <button class="sft-btn">Search</button>
                            </form>
                        </div>
                        <div class="sm">
                            <a href="#">Item 1</a>
                            <a href="#">Item 2</a>
                            <a href="#">Item 3</a>
                            <a href="#">Item 4</a>
                            <a href="#">Item 5</a>
                            <a href="#">Item 6</a>
                            <a href="#">Item 7</a>
                            <a href="#">Item 8</a>
                        </div>
                    </header>
                    
                    <main>
                    
                    </main>
                    
                    <!-- Footer -->
                
                    <footer>
                        
                        <div class="footer-logo_1">
                            <h1>Site</h1>
                        </div>
                        
                        <hr>
                        
                        <div class="footer-nav_2">
                            <div class="footer-nav-item">Item 1</div>
                            <div class="footer-nav-item">Item 2</div>
                            <div class="footer-nav-item">Item 3</div>
                            <div class="footer-nav-item">Item 4</div>
                            <div class="footer-nav-item">Item 5</div>
                            <div class="footer-nav-item">Item 6</div>
                            <div class="footer-nav-item">Item 7</div>
                            <div class="footer-nav-item">Item 8</div>
                        </div>
                        
                        <hr>
                        
                        <div class="footer-payment-icons">
                            <img src="img/Visa.svg" class="footer-payment-icons-img">
                            <img src="img/Mastercard.svg" class="footer-payment-icons-img">
                            <img src="img/Amex.svg" class="footer-payment-icons-img">
                            <img src="temp/PayPal.svg" class="footer-payment-icons-img">
                            <img src="img/ApplePay.svg" class="footer-payment-icons-img">
                            <img src="img/GPay.svg" class="footer-payment-icons-img">
                        </div>
                        
                        <hr>
                        
                        <div class="footer-copyright-privacy">
                            <p style="text-align: center"> Copyright &copy; 2020 - <span style="font-weight: 600;">Site</span></p>
                            <div class="privacy">
                                <p>Privacy Policy</p>
                                <p>Terms &amp; Conditions</p>
                                <p>Sitemap</p>
                            </div>
                        </div>
                    </footer>
                </div>
            </div>  
        </div>
        <script>
            var click = document.querySelectorAll('.hamb, .testing');
            var menu = document.querySelector('#off-canvas');
            var pusher = document.querySelector('.main-body');
            var effect;

            for (var i = 0; i < click.length; i++) {
              click[i].addEventListener('click', addClass)
            }

            pusher.addEventListener('click', closeMenu);

            function addClass(e) {
              effect = e.target.getAttribute('data-effect');
              menu.classList.toggle(effect);
              menu.classList.toggle('oc-menu-open');
              }

            function closeMenu(el) {
              if (el.target.classList.contains('main-body')) {
                menu.classList.toggle(effect);
                menu.classList.toggle('oc-menu-open');
              } 
            }
        </script>
    </body>

CSS

*,::after,::before{box-sizing:border-box},ol[class],ul[class]{padding:0}blockquote,body,dd,dl,figcaption,figure,h1,h2,h3,h4,li,ol[class],p,ul[class]{margin:0}body{min-height:100vh;scroll-behavior:smooth;text-rendering:optimizeSpeed;line-height:1.5;}ol[class],ul[class]{list-style:none}ol,ul{list-style:none;padding-left:0;}a:not([class]){text-decoration-skip-ink:auto}img{max-width:100%;display:block}article>*+*{margin-top:1em}button,input,select,textarea{font:inherit}@media (prefers-reduced-motion:reduce){*{animation-duration:0s!important;animation-iteration-count:1!important;transition-duration:0s!important;scroll-behavior:auto!important}}

textarea,
input.text,
input[type="text"],
input[type="button"],
input[type="submit"],
.input-checkbox {
    -webkit-appearance: none;
}

input, button {
    -webkit-appearance: none;
}

/** Stack Overflow Start **/

html,
body,
.off-canvas,
.main-body,
.main-container {
    height: 100%;
}

.main-body{
    overflow-y: scroll;
    background: #fbfbfb;
    position: relative;
    left: 0;
    z-index: 99;
    -webkit-transition: -webkit-transform 0.5s;
    transition: transform 0.5s;
}

.main-body::after {
    overflow: hidden;
    position: absolute;
    top: 0;
    right: 0;
    width: 0;
    height: 0;
    background: rgba(0,0,0,0.2);
    content: '';
    opacity: 0;
    -webkit-transition: opacity 0.5s, width 0.1s 0.5s, height 0.1s 0.5s;
    transition: opacity 0.5s, width 0.1s 0.5s, height 0.1s 0.5s;
}

.off-canvas {
    position: relative;
    overflow: hidden;
}

.oc-menu-open .main-body::after {
    width: 100%;
    height: 100%;
    opacity: 1;
    -webkit-transition: opacity 0.5s;
    transition: opacity 0.5s;
    overflow: hidden;
}

.oc-menu {
    overflow: scroll;
    position: absolute;
    top: 0;
    left: 0;
    z-index: 100;
    visibility: hidden;
    width: 80%;
    height: 100%;
    background: #663399;
    -webkit-transition: all 0.5s;
    transition: all 0.5s;
}

.oc-menu::after {
    position: absolute;
    top: 0;
    right: 0;
    width: 100%;
    height: 100%;
    background: rgba(0,0,0,0.2);
    content: '';
    opacity: 1;
    -webkit-transition: opacity 0.5s;
    transition: opacity 0.5s;
}

.oc-menu-open .oc-menu::after {
    width: 0;
    height: 0;
    opacity: 0;
    -webkit-transition: opacity 0.5s, width 0.1s 0.5s, height 0.1s 0.5s;
    transition: opacity 0.5s, width 0.1s 0.5s, height 0.1s 0.5s;
}

.oc-menu h2 {
    margin: 0;
    padding: 1em;
    text-shadow: 0 0 1px rgba(0,0,0,0.1);
    font-weight: 300;
    font-size: 2em;
}

.oc-menu ul li a {
    display: block;
    padding: 1em 1em 1em 1.2em;
    color: inherit;
    box-shadow: inset 0 -1px rgba(0,0,0,0.2);
    text-transform: uppercase;
    text-shadow: 0 0 1px rgba(255,255,255,0.1);
    letter-spacing: 1px;
    font-weight: 600;
    -webkit-transition: background 0.3s, box-shadow 0.3s;
    transition: background 0.3s, box-shadow 0.3s;
    text-decoration: none;
}

.oc-menu ul li:first-child a {
    box-shadow: inset 0 -1px rgba(0,0,0,0.2), inset 0 1px rgba(0,0,0,0.2);
}

.oc-effect.oc-menu-open .main-body {
    -webkit-transform: translate3d(80%, 0, 0);
    transform: translate3d(80%, 0, 0);
}

.oc-effect.oc-menu {
    z-index: 1;
}

.oc-effect.oc-menu-open .oc-effect.oc-menu{
    visibility: visible;
    -webkit-transition: -webkit-transform 0.5s;
    transition: transform 0.5s;
}

/** Stack Overflow End **/








/*****

Custom Code 

******/

body {
    color: #fff;
    background-color: #663399;
}


/** NavBar **/

header {
    background-color: #663399;
}

.navbar {
    color: #fff;
    padding: 15px 0px;
    display: grid;
    grid-template-columns: 60% 40%;
}

.logo {
    padding-left: 10px;
    display: grid;
    place-items: center start;
}

.header-icons {
    display: grid;
    grid-template-columns: 1fr 1fr;
}

.basket, .hamburger {
    display: grid;
    grid-auto-rows: 1fr;
    place-items: center center;
    grid-row-gap: px;
}

.basket-img, .hamb, .basket-text, .hamburger-menu {
    cursor: pointer;
}

.hamb {
    padding: 10px;
    margin: -10px;
    max-width: 65%;
    -webkit-filter: invert(100%); /* safari 6.0 - 9.0 */
    filter: invert(100%);
}

.basket-text, .hamburger-menu {
    font-size: 12px;
    font-weight: 600;
    padding: 0.2em;     
    margin: -0.2em; 
}

.sft-form {
    display: -webkit-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;   
    padding: 5px 10px 12.5px 10px;
}

.sft-search-svg, .sft-input, .sft-btn {
    height: 40px;
}

.sft-search-svg {
    display: grid;
    place-items: center center;
    -webkit-border-radius: 5px 0 0 5px;
    -moz-border-radius: 5px 0 0 5px;
    border-radius: 5px 0 0 5px;
    background-color: #e6e6e6;
    border-right: solid 1px #dddddd;
}

.sft-search-svg svg {
    margin: 0 8px;
    fill: #7D7D8C;
}

.sft-input {
    width: 100%;
    border: none;
    background-color: #e6e6e6;
    padding-left: 10px; 
    -webkit-appearance: none;
    border-radius: 0;
}

.sft-input:placeholder-shown {
    font-size: 14px;
}

.sft-input:focus {
    outline: none;
    box-shadow: 0 0 0 3px rgba(21, 156, 228, 0.4);
}

.sft-btn {
    background-color: #0BC133;
    color: inherit;
    font-weight: 600;
    border: none;
    border-radius: 0 5px 5px 0;
    -webkit-border-radius: 0 5px 5px 0;
    -moz-border-radius: 0 5px 5px 0;
    font-size: 12px;
    margin-left: 0;
}

.sft-suggestions {
    padding: 5px 7.5px;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-evenly;
    color: #7d7d8c;
    font-size: 12px;
}

.sft-sug-item:first-child {
  font-weight: bold;
}

/** Scroll Nav **/

.sm {
  background-color: #333;
  overflow: auto;
  white-space: nowrap;
}

.sm a {
    display: inline-block;
    color: white;
    font-weight: 600;
    text-align: center;
    padding: 14px;
    text-decoration: none;
}

.sm a:hover {
  background-color: #777;
}

/** Main Content **/

main {
    height: 100vh;
}


/** Footer **/

footer {
    display: grid;
    grid-row-gap: 20px;
    background-color: #663399;
    text-align: center;
    padding: 0 15px;
    grid-row-gap: 20px;

}

.footer-logo_1 {
    padding-top: 20px;
    display: grid;
}

.footer-logo_1 h1 {
    font-size: 1.4em;
    padding-bottom: 20px;
}

.footer-logo_1 p {
    font-size: 14px;
}

/** Footer Nav Links **/

.footer-nav_2 {
    padding: 0 5px;
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-row-gap: 20px;
    font-weight: 600;
}

.footer-nav-item {
    padding: 2px;
}

/** Footer Payment Icons **/

.footer-payment-icons {
    padding: 0 15px;
    display: grid;
    grid-template-columns: repeat(3, auto);
    place-items: center center;
}

.footer-payment-icons-img {
    max-width: 70%;
}

/** Footer Copyright **/

.footer-copyright-privacy {
    font-size: 14px;
    padding-bottom: 20px;
}

/** Footer Privacy **/

.privacy {
    font-size: 12px;
    display: grid;
    grid-template-columns: repeat(3, auto);
    grid-column-gap: 7.5px;
    color: #d3d3d3;
    justify-content: center;
}

/** Temporary **/

hr {
    height: 1px;
    width: 80%;
}

2 个答案:

答案 0 :(得分:0)

尝试一下。 https://codepen.io/KonradLinkowski/pen/zYqNXYx

JavaScript

function addClass(e) {
  effect = e.target.getAttribute('data-effect');
  menu.classList.toggle(effect);
  menu.classList.toggle('oc-menu-open');

  document.body.classList.toggle('menu-is-open')
}

function closeMenu(el) {
  if (el.target.classList.contains('main-body')) {
    menu.classList.toggle(effect);
    menu.classList.toggle('oc-menu-open');

    document.body.classList.toggle('menu-is-open')
  }
}

CSS

.main-body.menu-is-open {
  overflow: hidden;
}

答案 1 :(得分:-1)

   body {
      overflow: hidden;
   }

我希望这可行!