javascript - 仍然可以在 Firefox 中使用 offcanvas 菜单水平滚动

标签 javascript jquery css html

我正在为小于 640 像素的分辨率创建一个带有“非 Canvas ”菜单的响应式网站。我通过将两个类之一应用到外部容器 div 来使菜单可访问,这两个类都带有 css 动画,这些动画使用 translateX 向左或向右滑动所有内容。这在 Chrome 和 Safari 中完美运行(尚未测试 IE),但 Firefox 添加了一个水平滚动条,使我能够从菜单滚动到应该推送的内容,但是 10%,超出屏幕正确的。 将 overflow-x: hidden 或只是 overflow: hidden 应用于父 div 似乎是合乎逻辑的解决方案,但这会使我的 Canvas 外菜单不可见。有人知道解决办法吗?

Here is a Fiddle那有我的大部分代码。为了让它在 jsFiddle 上工作,我不得不稍微调整一下,所以第一次点击粉红色框是错误的,但之后它就可以工作了。然而,在 Fiddle 中,这个问题出现在每个浏览器上,甚至是 Chrome 和 Safari。这不会发生在 jsFiddle 之外。

对于那些想要检查所有代码的人。如下所示:

HTML 和 JQUERY

<!DOCTYPE html>
<html>
    <head>
        <title>Off canvas menu</title>
        <link rel="stylesheet" href="offcanvas.css" />
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width">
    </head>
    <body class="loading">
        <div class="wrapper">
            <div class="inner-wrapper">

                <header>
                    <div class="topheader">
                        <div class="menu-icon"></div><!-- /.menu-icon -->
                    </div><!-- /.topheader -->

                    <nav>Link</nav>

                    <div class="search"></div><!-- /.search -->
                </header>

                <div class="content" role="main">
                    <div class="banner"></div><!-- /.banner -->

                    <div class="left"></div><!-- /.left -->

                    <div class="center"></div><!-- /.center -->

                    <div class="right"></div><!-- /.right -->
                </div><!-- /.content -->

            </div><!-- /.inner-wrapper -->
        </div><!-- /.wrapper -->
    </body>
    <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
    <script>
        $('.menu-icon').click(function() {
            if($('body').hasClass('loading')) {
                $('body').removeClass('loading');
                $('body').addClass('slideOpen');
            } else if($('body').hasClass('slideClosed')) {
                $('body').removeClass('slideClosed');
                $('body').addClass('slideOpen');
            } else {
                $('body').removeClass('slideOpen');
                $('body').addClass('slideClosed');
            }
        });
    </script>
</html>

CSS

* {
    border-box: box-sizing;
}
html, body {
    margin: 0;
    /*overflow-x: hidden;*/
    padding: 0;
}
.inner-wrapper {
    /*overflow-x: hidden;*/
    position: relative;
}
header {
    width: 100%;
}
.topheader {
    background: #fff;
    height: 30px;
    width: 100%;
}
header .menu-icon {
    background: #e41e7b;
    display: none;
    height: 30px;
    width: 30px;
}
nav {
    background: #404040;
    height: 65px;
    width: 100%;
}
.search {
    background: #dbdbdb;
    height: 45px;
    width: 100%;
}
.content {
    background: silver;
    height: 1500px;
    position: relative;
    width: 100%;
}
.banner {
    background: url('http://placekitten.com/1000/300');
    background-size: cover;
    background-position: center;
    height: 300px;
    left: 20%;
    position: absolute;
    width: 60%;
}
.left {
    background: burlywood;
    height: 1500px;
    left: 0px;
    position: absolute;
    width: 20%;
}
.right {
    background: chocolate;
    height: 1500px;
    left: 80%;
    position: absolute;
    width: 20%;
}
.center {
    background: antiquewhite;
    height: 1200px;
    left: 20%;
    position: absolute;
    top: 300px;
    width: 60%;
}
@media only screen and (max-width: 1300px) {
    .banner {
        width: 80%;
    }
    .right {
        height: 1200px;
        top: 300px;
    }
}
@media only screen and (max-width: 1100px) {
    .banner {
        left: 0;
        width: 100%;
    }
    .left {
        height: 1200px;
        top: 300px;
    }
}
@media only screen and (max-width: 1024px) {
    .left {
        width: 30%;
    }
    .center {
        left: 30%;
        width: 70%;
    }
    .right {
        height: 500px;
        left: 0;
        top: 1500px;
        width: 100%;
    }
}
@media only screen and (max-width: 640px) {
    header .menu-icon {
        display: block;
    }
    nav {
        height: 1500px;
        left: -90%;
        position: absolute;
        top: 0;
        width: 90%;
        z-index: 999;
    }
    .left {
        display: none;
    }
    .center {
        left: 0;
        width: 100%;
    }
}
@keyframes slideOpen {
    from { transform: translateX(0); }
    to { transform: translateX(90%); }
}
@-webkit-keyframes slideOpen {
    from { -webkit-transform: translateX(0); }
    to { -webkit-transform: translateX(90%); }
}
@keyframes slideClosed {
    from { transform: translateX(90%); }
    to { tranform: translateX(0); }
}
@-webkit-keyframes slideClosed {
    from { -webkit-transform: translateX(90%); }
    to { -webkit-tranform: translateX(0); }
}
.slideOpen {
    animation: slideOpen .3s ease;
    animation-fill-mode: forwards;
    -webkit-animation: slideOpen .3s ease;
    -webkit-animation-fill-mode: forwards;
}
.slideClosed {
    animation: slideClosed .3s ease;
    animation-fill-mode: forwards;
    -webkit-animation: slideClosed .3s ease;
    -webkit-animation-fill-mode: forwards;
}

最佳答案

尝试滑动包装而不是主体:http://jsfiddle.net/3Yjaz/1/

if($('.wrapper').hasClass('slideClosed')) {
  $('.wrapper').removeClass('slideClosed');
  $('.wrapper').addClass('slideOpen');
} else {
  $('.wrapper').removeClass('slideOpen');
  $('.wrapper').addClass('slideClosed');
}

CSS:

   html, body {
        margin: 0;
        overflow-x: hidden;
        padding: 0;
    }

关于javascript - 仍然可以在 Firefox 中使用 offcanvas 菜单水平滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20659793/

相关文章:

php - javascript点击时隐藏div

javascript - 无法显示棋盘,但使用 chessboard.js 时 ID 相同

Jquery JSON 不显示数据

jquery - 将 html5 Canvas 包裹在 <body> 中

html - 在 HTML 和 CSS 中使用图像作为分隔符

javascript - 使用来自 Threejs 的 Canvas 定位 div

javascript - SVG 更改大小但不会在滚动过渡时设置动画

javascript - Ant design - 有没有办法获得我实际使用的样式?

javascript - 如何让 .on ("change") 与 gldatepicker 一起使用?

javascript - 单击展开一个div并缩小另一个div并在再次单击后恢复正常