【问题标题】:css position fixed menu with 100% height and offset具有 100% 高度和偏移的 CSS 位置固定菜单
【发布时间】:2016-01-28 20:41:55
【问题描述】:

我想在网站左侧创建一个菜单。主要思想是 youtube 是如何制作的:
您在顶部有一个栏(固定),并且始终为 40 像素高度和 100% 宽度。
在左边你有菜单。您可以使用顶部栏中的按钮打开和关闭它。如果菜单已打开,则菜单固定在左侧,内部有自己的滚动条。菜单是 100% 高度 40 像素(从顶部栏撤出)。
菜单关闭时,内容的宽度为 100%,菜单打开时,内容的宽度为 100%。
窗口滚动条只滚动内容。菜单和顶栏是固定的。

这是一个小例子:http://output.jsbin.com/gehatitaxe
在小提琴中也一样:

<!-- http://jsfiddle.net/zyam1m79/ -->  

但现在我有一个问题,100% 的菜单无法从顶部栏撤回 40px。所以内部滚动条可以稍微滚动出窗口(到底部)。在菜单文本的末尾有一个“x”,当您全部滚动到菜单底部时无法阅读它。

我该如何解决这个问题?如何将固定元素高度设置为 100%,并且它不采用窗口高度,而是采用更高级别的 en 元素的高度?

问候并感谢您的帮助,
克里斯托弗

【问题讨论】:

  • @Gacci jsbin 对我来说是一样的,但我还加了一个小提琴。
  • @tnschmidt 我已经找到了这个答案,但那里的菜单是从顶部 = 0 100% 高度到底部。在我的示例中,顶栏从 left=0 100% 宽度到右侧,因此菜单必须从顶栏撤回 40ph 高度。

标签: html css fixed


【解决方案1】:

您可以使用 CSS calc 属性计算 100% 高度减去顶栏。示例:

.main_left {
   height: calc(100% - 40px);
   /* ... */
}

我注意到您在顶部和底部都有填充,因此上面的 40px 也需要包含它,因此 calc(100% - 120px);。要么这样,要么添加box-sizing: border-box;,这样填充就不会增加容器的高度。

【讨论】:

    【解决方案2】:

    当使用position: fixed 时,尽量避免使用 100% 的宽度/高度。相反,使用left: 0; right: 0 100% 宽度和top: 0; bottom: 0 100% 高度。请看下面的例子:

        .table { display: table; } /* table */
        .table > * { display: table-row; } /* tr */
        .table > * > * { display: table-cell; } /* td */
    
    /* main container */
    .main{
        position: relative;
        min-width: 1024px;
    }
    
    /* top */
    .main_head{
        width: 100%;
        height: 40px;
        position: fixed;
        left: 0;
        right: 0;
        top: 0;
        transform: translateZ(0px);
        z-index: 1999999999;
    }
    .main_head > div > div{ /* all + search */
        border: 1px solid #000;
    }
    .main_head > div > div:first-child{ /* menu */
        border: 1px solid #000;
    }
    .main_head > div > div:first-child > i{
        font-size: 40px;
    }
    .main_head > div > div:last-child{ /* User information */
        width: 400px;
    }
    
    /* Container menu + content */
    .main_left_content{
        
    }
    
    /* left: menu */
    .main_left{
        width: 200px;
        left: 0;
        top: 0;
        bottom: 0;
        padding-top: 40px;
        padding-bottom: 40px;
        border: 1px solid #000;
        position: fixed;
    }
    .main_left > div{
        position: absolute;
        background-color: red;
        top: 40px;
        bottom: 0;
        left: 0;
        right: 0;
        overflow-y: scroll;
    }
    
    /* right: content */
    .main_content{
        border: 1px solid #000;
        vertical-align: top;
    }
    <div class="main">
                            <div class="main_head table">
                                <div>
                                    <div>
                                        <i class="fa fa-bars fa-lg"></i>
                                    </div>
                                    <div>Suche</div>
                                    <div>User Information</div>
                                </div>
                            </div>
                            <div class="main_left_content table">
                                <div>
                                    <div class="main_left">
                                        <div>
                                        <div>
                                            Menü<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />x
                                        </div>
                                        </div>
                                    </div>
                                    <div class="main_content">
                                        Content<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />x
                                    </div>
                                </div>
                            </div>
                        </div>

    【讨论】:

    • 感谢您的快速回复。但恐怕问题并没有解决:当你在菜单中一直向下滚动时,你看不到最后的“x”。所以你可以滚动更多,然后你应该能够。 (顶部栏的 40px 必须从菜单高度中撤出)
    • 我可以在我的浏览器 (Chrome) 上看到“x”。滚动条 is 被覆盖了,所以让我看看是否可以进行一些更改,所以它不是。
    • 我已经编辑了 CSS,使其不再涵盖任何内容。你有很多多余的 CSS 没有做任何事情(因为它覆盖了以前的规则)。尝试删除任何在其他地方被覆盖的 CSS(您可以通过猜测和检查删除来做到这一点)。
    • 非常感谢您的帮助,不要给自己压力。 @Quantastical 的解决方案效果很好:)(顺便说一句:我使用的是 Waterfox 38 和 Chrome)
    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多