2012-04-07 114 views

回答

31

使用display:grid

这使用可能会或可能不会在您选择的浏览器支持CSS的几个新功能。这些包括Grid Layout,CSS Variablesposition:sticky。 CSS变量可以用静态值解决,Grid/position:sticky可以使用@supports优雅地降级。

/* Remove unnecessary margins/padding */ 
 
html, body { margin: 0; padding: 0 } 
 

 
.wrapper { 
 
    display: grid; 
 
    /* Header and footer span the entire width, sidebars and content are fixed, with empty space on sides */ 
 
    grid-template-areas: 
 
    "header header header header header" 
 
    "empty_left sidebar_1 content sidebar_2 empty_right" 
 
    "footer footer footer footer footer"; 
 
    /* Only expand middle section vertically (content and sidebars) */ 
 
    grid-template-rows: 0fr 1fr 0fr; 
 
    /* 100% width, but static widths for content and sidebars */ 
 
    grid-template-columns: 1fr 100px 400px 100px 1fr; 
 
    /* Force grid to be at least the height of the screen */ 
 
    min-height: 100vh; 
 
} 
 
.header { 
 
    grid-area: header; 
 

 
    /* Stick header to top of grid */ 
 
    position: sticky; 
 
    top: 0; 
 
    /* Ensure header appears on top of content/sidebars */ 
 
    z-index: 1; 
 

 
    /* General appearance */ 
 
    background-color: #FCFF34; 
 
    text-align: center; 
 
    font-size: 1rem; 
 
    line-height: 1.5; 
 
    padding: 1rem; 
 
} 
 
/* Save header height to properly set `padding-top` and `margin-top` for sticky content */ 
 
:root { 
 
    --header-height: calc(1rem * 1.5 + 1rem * 2); 
 
} 
 

 
.sidebar-1 { 
 
    grid-area: sidebar_1; 
 
} 
 
.sidebar-2 { 
 
    grid-area: sidebar_2; 
 
} 
 
.sidebar-1, 
 
.sidebar-2 { 
 
    display: flex; 
 
    flex-direction: column; 
 
    position: sticky; 
 
    top: 0; 
 

 
    /* Styling to match reference */ 
 
    background-color: #BC514F; 
 
} 
 

 
.content { 
 
    grid-area: content; 
 

 
    /* General appearance */ 
 
    background-color: #99BB5E; 
 
} 
 
.footer { 
 
    grid-area: footer; 
 

 
    /* Stick footer to bottom of grid */ 
 
    position: sticky; 
 
    bottom: 0; 
 

 
    /* General appearance */ 
 
    background-color: #FCFF34; 
 
    text-align: center; 
 
    font-size: .8rem; 
 
    line-height: 1.5; 
 
    padding: .5rem; 
 
} 
 
/* Save footer height to properly set `bottom` and `min-height` for sticky content */ 
 
:root { 
 
    --footer-height: calc(.8rem * 1.5 + .5rem * 2); 
 
} 
 

 
.sticky-spacer { 
 
    flex-grow: 1; 
 
} 
 
.sticky-content { 
 
    position: sticky; 
 
    bottom: var(--footer-height); 
 
    min-height: calc(100vh - var(--footer-height)); 
 
    box-sizing: border-box; 
 

 
    --padding: 10px; 
 
    padding: 
 
    calc(var(--header-height) + var(--padding)) 
 
    var(--padding) 
 
    var(--padding); 
 
    margin-top: calc(0px - var(--header-height)); 
 
}
<div class="wrapper"> 
 
<div class="header">Header (Absolute)</div> 
 
<div class="sidebar-1"> 
 
    <div class="sticky-spacer"></div> 
 
    <div class="sticky-content">Sidebar 1 Absolute position, Fixed width</div> 
 
</div> 
 
<div class="content"> 
 
    <div class="sticky-spacer"></div> 
 
    <div class="sticky-content"> 
 
    Scrollable content<br><br> 
 
    line 1<br><br> 
 
    line 2<br><br> 
 
    line 3<br><br> 
 
    line 4<br><br> 
 
    line 5<br><br> 
 
    line 6<br><br> 
 
    line 7<br><br> 
 
    line 8<br><br> 
 
    line 9<br><br> 
 
    line 10<br><br> 
 
    line 11<br><br> 
 
    line 12<br><br> 
 
    line 13<br><br> 
 
    line 14<br><br> 
 
    line 15<br><br> 
 
    line 16<br><br> 
 
    line 17<br><br> 
 
    line 18<br><br> 
 
    line 19<br><br> 
 
    line 20 
 
    </div> 
 
</div> 
 
<div class="sidebar-2"> 
 
    <div class="sticky-spacer"></div> 
 
    <div class="sticky-content"> 
 
    Sidebar 2 Absolute position, Fixed width<br><br> 
 
    line 1<br><br> 
 
    line 2<br><br> 
 
    line 3<br><br> 
 
    line 4<br><br> 
 
    line 5<br><br> 
 
    line 6<br><br> 
 
    line 7<br><br> 
 
    line 8<br><br> 
 
    line 9<br><br> 
 
    line 10 
 
    </div> 
 
</div> 
 
<div class="footer">Footer (Absolute)</div> 
 
</div>

滚动条在主要内容容器

内容框(包括边栏)可以被设置为任何类型的宽度(百分比,像素等)的。只有可滚动的内容区域会滚动(侧边栏/页脚/标题只会溢出框)。我建议添加一些媒体查询以突破侧边栏,以便内容不会隐藏在较小的设备上,或者在内容框中设置min-height,在body上设置min-width

html, body { 
 
    height:100%; 
 
    margin:0; 
 
    padding:0; 
 
} 
 
header{ 
 
    width: 100%; 
 
    background: yellow; 
 
    position: fixed; 
 
    top: 0; 
 
    height: 60px !important; 
 
    opacity:.8; 
 
} 
 

 
.content { 
 
    position:relative; 
 
    height: 100%; 
 
    width:600px; /* Sizing - any length */ 
 
    padding:60px 0 30px 0; /* Header height and footer height */ 
 
    margin:0 auto 0 auto; /* Center content */ 
 
    -moz-box-sizing:border-box; 
 
    -webkit-box-sizing:border-box; 
 
    -o-box-sizing:border-box; 
 
    -ms-box-sizing:border-box; 
 
    box-sizing:border-box; 
 
} 
 

 
.sidebar1, .sidebar2 { 
 
    background: red; 
 
    top:60px; 
 
    bottom:30px; 
 
    width: 100px; 
 
    position:absolute; 
 
    -moz-box-sizing:border-box; 
 
    -webkit-box-sizing:border-box; 
 
    -o-box-sizing:border-box; 
 
    -ms-box-sizing:border-box; 
 
    box-sizing:border-box; 
 
} 
 

 
.sidebar1 { 
 
    left:0; 
 
} 
 

 
.sidebar2 { 
 
    right: 0; 
 
} 
 

 
#scrollable2 { 
 
    background:green; 
 
    height: 100%; 
 
    min-width: 300px; 
 
    margin-left: 100px; 
 
    margin-right: 100px; 
 
    overflow:auto; 
 
    -moz-box-sizing:border-box; 
 
    -webkit-box-sizing:border-box; 
 
    -o-box-sizing:border-box; 
 
    -ms-box-sizing:border-box; 
 
    box-sizing:border-box; 
 
} 
 

 
footer { 
 
    width: 100%; 
 
    background: yellow; 
 
    position: fixed; 
 
    bottom: 0; 
 
    height: 30px; 
 
}
<!-- Always on top: Position Fixed--> 
 
<header> 
 
    header 
 
</header> 
 
<!-- Fixed size after header--> 
 
<div class="content"> 
 
    <!-- Always on top. Fixed position, fixed width, relative to content width--> 
 
    <div class="sidebar1"> 
 
     sidebar-left 
 
    </div> 
 
    <!-- Scrollable div with main content --> 
 
    <div id="scrollable2"> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
    </div> 
 
    <!-- Always on top. Fixed position, fixed width, relative to content width --> 
 
    <div class="sidebar2"> 
 
     sidebar-right 
 
    </div> 
 
</div> 
 
<!-- Always at the end of the page --> 
 
<footer> 
 
    footer 
 
</footer>

使用浏览器的主要滚动条

在使用浏览器的主要滚动条是可能的,这也导致了侧边栏与页面滚动。

html, body { 
 
    height:100%; 
 
    margin:0; 
 
    padding:0; 
 
} 
 
header{ 
 
    width: 100%; 
 
    background: yellow; 
 
    position: fixed; 
 
    top: 0; 
 
    height: 60px !important; 
 
    z-index:100; 
 
} 
 

 
.content { 
 
    position:relative; 
 
    min-height: 100%; 
 
    width:600px; /* Sizing - any length */ 
 
    padding:60px 0 30px 0; /* Header height and footer height */ 
 
    margin:0 auto 0 auto; /* Center content */ 
 
} 
 

 
.sidebar1, .sidebar2 { 
 
    background: red; 
 
    height:100%; 
 
    width: 100px; 
 
    top:0; 
 
    padding-top:60px; 
 
    position:absolute; 
 
    -moz-box-sizing:border-box; 
 
    -webkit-box-sizing:border-box; 
 
    -o-box-sizing:border-box; 
 
    -ms-box-sizing:border-box; 
 
    box-sizing:border-box; 
 
} 
 

 
.sidebar1 { 
 
    
 
    left:0; 
 
    
 
} 
 

 
.sidebar2 { 
 
    right: 0; 
 
} 
 

 
#scrollable2 { 
 
    height:100%; 
 
    background:green; 
 
    min-width: 300px; 
 
    margin-left: 100px; 
 
    margin-right: 100px; 
 
    -moz-box-sizing:border-box; 
 
    -webkit-box-sizing:border-box; 
 
    -o-box-sizing:border-box; 
 
    -ms-box-sizing:border-box; 
 
    box-sizing:border-box; 
 
} 
 

 
footer { 
 
    width: 100%; 
 
    background: yellow; 
 
    position: fixed; 
 
    bottom: 0; 
 
    height: 30px; 
 
}
<!-- Always on top: Position Fixed--> 
 
<header> 
 
    header 
 
</header> 
 
<!-- Fixed size after header--> 
 
<div class="content"> 
 
    <!-- Always on top. Fixed position, fixed width, relative to content width--> 
 
    <div class="sidebar1"> 
 
     sidebar-left 
 
    </div> 
 
    <!-- Scrollable div with main content --> 
 
    <div id="scrollable2"> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
     content-main<br> 
 
    </div> 
 
    <!-- Always on top. Fixed position, fixed width, relative to content width --> 
 
    <div class="sidebar2"> 
 
     sidebar-right 
 
    </div> 
 
</div> 
 
<!-- Always at the end of the page --> 
 
<footer> 
 
    footer 
 
</footer>

+0

非常感谢。一个问题。是否有可能从div外滚动滚动div?我的意思是无论你在页面内滚动,我都希望它滚动滚动div。那可能吗? – glarkou 2012-04-07 18:06:24

+0

是和不是(好吧,不是我有的时间)。使用浏览器的主滚动条可以让侧边栏滚动。这可能对你很好,我不确定。我已将jsFiddle示例添加到我的答案中。 – 0b10011 2012-04-07 18:17:53

+0

再次感谢队友。 – glarkou 2012-04-07 18:29:04

1

编辑
1.增加position财产absolute您要修复的股利。
2.保持身体overflow财产auto

注意:将body的z-index设置为-1会使body的其余部分不可访问。
参考:http://limpid.nl/lab/css/fixed/

+0

感谢您发布您的答案!请注意,你应该在这里发布一个答案的有用点,在这个网站上,或者你的帖子风险被删除[参见常见问题解答,它提到的答案几乎不超过链接](http://stackoverflow.com/FAQ#删除)。如果您愿意,您可能仍然包含链接,但仅作为“参考”。答案应该独立,不需要链接。 – 2013-03-05 10:13:15

+0

谢谢,我今后会记住。 – Sorter 2013-03-05 10:24:32