位置:修复在 Chrome 和 IE 中关闭画布菜单时效果不佳的问题

Posted

技术标签:

【中文标题】位置:修复在 Chrome 和 IE 中关闭画布菜单时效果不佳的问题【英文标题】:position:fixed not playing nice with off canvas menu in Chrome and IE 【发布时间】:2015-06-20 01:58:55 【问题描述】:

目的

我正在使用 off canvas menu,使用 CSS 和 javascript。画布外菜单按预期工作。我想要一个位于屏幕左侧并在触发菜单时移动的侧边栏菜单。这个想法是有一个 100 像素宽的菜单触发器,高度为 100%,并且始终位于屏幕左侧。使用绝对位置我在所有浏览器上的高度都有问题,使用固定位置 Firefox 工作正常,但遇到下面提到的问题。

错误

Firefox 问题: 据我所知,没有。

Chrome 问题: 向下滚动几个像素后,侧边栏菜单触发器不会拉伸整个页面。

Internet Explorer:当触发侧边栏菜单时,侧边栏似乎完全消失了。

jsFiddle

因为我的代码在 html、CSS 和 JavaScript 上都很繁重,所以我包含了一个 jsFiddle。请注意,据我所知,该问题仅发生在 Chrome 和 Internet Explorer 上。您可以通过向下滚动页面然后单击左侧菜单按钮来复制问题。

截图

值得一提的 HTML 代码(Fiddle 中的完整代码)

<div id="sbContainer" class="sbContainer">
    <div class="sbPush">
        <header class="contain-to-grid sbMenu sbFX">
            <nav class="top-bar" data-topbar>
                <ul class="title-area show-for-small-only"><!--SITENAME--></ul>
                <section class="top-bar-section"><!--LINKS--></section>
            </nav>
        </header>
        <div class="sbContent-one">
            <div class="sbContent-two">
                <div class="sbMenuTrigger" data-effect="sbFX"><!--SIDEBAR TRIGGER--></div>
                <div class="sbMainContent" role="document"><!--PAGE CONTENT--></div>
            </div>
        </div>
    </div>
</div>

值得一提的 CSS 代码(Fiddle 中的完整代码)

html, body, .sbContainer, .sbPush, .sbContent-one 
    height:100%

.sbContent-one 
    overflow-x:hidden;
    background:#fff;
    position:relative

.sbContainer 
    position:relative;
    overflow:hidden

.sbPush 
    position:relative;
    left:0;
    z-index:99;
    height:100%;
    -webkit-transition:-webkit-transform .5s;
    transition:transform .5s

.sbPush::after 
    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 .1s 0.5s,height .1s .5s;
    transition:opacity 0.5s,width .1s 0.5s,height .1s .5s

.sbMenu-open .sbPush::after 
    width:100%;
    height:100%;
    opacity:1;
    -webkit-transition:opacity .5s;
    transition:opacity .5s

.sbMenu 
    position:absolute;
    top:0;
    left:0;
    z-index:100;
    visibility:hidden;
    width:244px;
    height:100%;
    background:#872734;
    -webkit-transition:all .5s;
    transition:all .5s

.sbMenu::after 
    position:absolute;
    top:0;
    right:0;
    width:100%;
    height:100%;
    background:rgba(0,0,0,0.2);
    content:'';
    opacity:1;
    -webkit-transition:opacity .5s;
    transition:opacity .5s

.sbMenu-open .sbMenu::after 
    width:0;
    height:0;
    opacity:0;
    -webkit-transition:opacity 0.5s,width .1s 0.5s,height .1s .5s;
    transition:opacity 0.5s,width .1s 0.5s,height .1s .5s

.sbFX.sbMenu-open .sbPush 
    -webkit-transform:translate3d(300px,0,0);
    transform:translate3d(244px,0,0)

.sbFX.sbMenu 
    -webkit-transform:translate3d(-100%,0,0);
    transform:translate3d(-100%,0,0)

.sbFX.sbMenu-open .sbFX.sbMenu 
    visibility:visible;
    -webkit-transition:-webkit-transform .5s;
    transition:transform .5s

.sbFX.sbMenu::after 
    display:none

.no-csstransforms3d .sbPush,.no-js .sbPush 
    padding-left:244px

.sbMenuTrigger 
    background-color:#b23445;
    cursor:pointer;
    height:100%;
    width:100px;
    position:fixed;
    left:0;
    top:0

.sbMainContent 
    margin-left:100px;
    width:calc(100% - 100px);
    top:0;
    padding-top:50px;
    position:absolute;
    height:100%

【问题讨论】:

截图和小提琴不匹配...不确定小提琴在演示什么 截图取自开发站点。如果您在 chrome 或 Internet Explorer 中加载小提琴,您可以复制屏幕截图中显示的相同问题.. chrome 对我来说很好,但我在 Linux 上,所以它可能会给出不同的结果 您是否向下滚动然后展开菜单? 【参考方案1】:

这是一个只需要很少更改的解决方法。

它在最新版本的 FF、Chrome 和 IE11/10 中始终如一地工作。

Updated Example

.sbContent-one 
  overflow: visible;       /* Or remove overflow-x: hidden */

.sbMainContent 
  overflow-x: hidden;

.sbMenuTrigger 
  position: static;        /* Or remove position: fixed */

在 Chrome 中解决问题的最简单方法是将 overflow.sbContent-one 移动到 .sbMainContent。这样做时,您实际上不能滚动过去 .sbMenuTrigger 元素(这解决了问题),因为 .sbMainContent 是同级元素。

目前在浏览器中有many inconsistencies 围绕fixed 元素如何positioned relative to elements 是transformed using translate3d。 IE 中的问题是由于fixed 元素相对于窗口定位,而没有考虑使用translate3d 转换的元素。要解决此问题,请完全避免固定定位,并通过删除 position: fixed(或使用默认的 position: static 覆盖它)将元素 .sbMenuTrigger 添加回正常流程。这样做时,侧边栏会按预期展开。

换句话说:

.sbContent-one 中删除overflow-x: hidden(或用overflow: visible 覆盖它)。 将overflow-x: hidden 添加到.sbMainContent。 从.sbMenuTrigger 中删除position: fixed(或用position: static 覆盖它)。

【讨论】:

感谢大家提供有效的解决方案。我已授予 Josh 奖励,因为我相信该解决方案符合我的要求,同时解释了它不起作用的原因。其他人加1!谢谢! @bybe 谢谢。我刚刚开始了另一项赏金,将奖励给乔,因为他的解决方案也很有效。 嘿,我刚刚在 Safari 6 和 7 上对其进行了测试,似乎菜单正在从某个地方获取 margin:56px ... 使用 .sbContainer margin-left 56px 解决了菜单打开时的问题,但是当它关闭时打破它。哎呀!为什么浏览器不能相同:P【参考方案2】:

这是我对您的问题的解决方案。在 3 个市长浏览器上测试,运行良好!

see fiddle

看看我对以下课程的更改:

.sbContent-one中删除相对位置 将高度:100% 添加到 .sbContent-two(新规则) .sbMainContent 的主要变化 .sbMenuTrigger 的绝对位置

主要问题是:

    来自.sbContent-one.sbMainContent 的不必要的相对位置和绝对位置。 固定位置是相对于窗口的,因此当您翻译元素时,它的行为会因浏览器而异。

【讨论】:

不知道为什么有人不赞成这个.. 有一个赞成票 1+.. 它主要是有效的,尽管现在有一点警告你已经删除了 position: relative.. 如果你比较 your fullscreen example VS OP's fullscreen example,您将看到文本 “向下滚动并展开菜单以查看问题” 的定位现在已关闭。我很确定 OP 希望保持该相对定位。 @JoshCrozier 那是因为 JS fiddle 标头和 iframe。如果您设法打开一个干净的版本,您会发现它运行良好。我还建议清理一些我认为不必要的样式,这就是我包含更多更改的原因。【参考方案3】:

我设法让它在最后一个 chrome/IE11 上运行。

jsfiddle

我搬家了

        <div class="sbMenuTrigger" data-effect="sbFX">
            <div class="sbMenuIcon">
                <div class="sbMenuIconBackground"></div>
                <div class="sbMenuIconOverlay"></div>
            </div>
            <div class="sbMenuLogo">
                <div class="sbMenuLogoBackground"></div>
                <div class="sbMenuLogoOverlay"></div>
            </div>
        </div>

&lt;header&gt;标签的末尾,所以CSS变成了:

.sbMenuTrigger 
    background-color:#b23445;
    cursor:pointer;
    width:100px;
    position:absolute;
    right:-100px;
    top:0;
    bottom: 0;

位置固定+变换并非总是受到所有浏览器的欢迎。

【讨论】:

解决了这个问题,但不喜欢使用负边距或头寸的想法。另外不确定您做了什么,但菜单无法在您的 Fiddle 上关闭。 负边距不是问题,当所有东西都固定宽度时,无法关闭,可能是移动HTML的问题?

以上是关于位置:修复在 Chrome 和 IE 中关闭画布菜单时效果不佳的问题的主要内容,如果未能解决你的问题,请参考以下文章

由于 SSL 连接已经在喷雾中关闭错误,如何修复 Dropping Close

如何在 Google Chrome 中关闭 Preserve JavaScript console perseverance

如何在 WinForms 应用程序中关闭 IE WebBrowserControl 上的兼容性视图?

在 iOS 上的 Fine-uploader 中关闭相机

当我在谷歌设置android中关闭和打开位置时,FusedLocation 不起作用

如果从设置中关闭位置,则获取位置