【发布时间】:2017-01-30 04:20:41
【问题描述】:
我正在创建一个大型动态导航菜单,我希望它看起来像这样:
[----------- 100% PAGE WIDTH -----------]
| GROUP A | GROUP C | GROUP F | GROUP G |
| item | item | item | item |
| item | | item | item |
| | GROUP D | item | item |
| GROUP B | item | item | |
| item | | | |
| item | GROUP E | | |
| | item | | |
|---------------------------------------|
| |
| |
[------------- END OF PAGE -------------]
* {
padding: 0;
margin: 0;
}
body {
background: #ccc;
font-family: helvetica, arial;
color: #444;
}
ul {
list-style: none;
}
.mega-menu {
display: flex;
flex-direction: column;
flex-wrap: wrap;
padding: 15px;
height: 50vh;
background: #fff;
}
.mega-menu > li {
display: flex;
flex-direction: column;
font-size: .7rem;
padding-bottom: 15px;
}
.title {
font-size: .7rem;
font-weight: bold;
line-height: 1;
padding-bottom: 5px
}
<ul class="mega-menu">
<li>
<a class="title">News</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Shows</a>
<ul>
<li>HBO</li>
<li>CBS</li>
<li>NBC</li>
<li>CNN</li>
</ul>
</li>
<li>
<a class="title">Topics</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Shows</a>
<ul>
<li>CBS</li>
<li>NBC</li>
</ul>
</li>
<li>
<a class="title">Networks</a>
<ul>
<li>HBO</li>
<li>CBS</li>
<li>NBC</li>
<li>CNN</li>
</ul>
</li>
<li>
<a class="title">Groups</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Sections</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Pilots</a>
<ul>
<li>HBO</li>
<li>CBS</li>
<li>NBC</li>
</ul>
</li>
<li>
<a class="title">Locations</a>
<ul>
<li>Denver</li>
<li>Baltimore</li>
<li>LA</li>
<li>New York</li>
<li>San Francisco</li>
<li>New Orleans</li>
<li>Jacksonville</li>
<li>Calvery</li>
<li>August</li>
</ul>
</li>
<li>
<a class="title">Cities</a>
<ul>
<li>Denver</li>
<li>Baltimore</li>
<li>LA</li>
<li>New York</li>
<li>San Francisco</li>
<li>New Orleans</li>
<li>Jacksonville</li>
<li>Calvery</li>
<li>August</li>
</ul>
</li>
<li>
<a class="title">News</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Shows</a>
<ul>
<li>HBO</li>
<li>CBS</li>
<li>NBC</li>
<li>CNN</li>
</ul>
</li>
<li>
<a class="title">Topics</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Shows</a>
<ul>
<li>CBS</li>
<li>NBC</li>
</ul>
</li>
<li>
<a class="title">Networks</a>
<ul>
<li>HBO</li>
<li>CBS</li>
<li>NBC</li>
<li>CNN</li>
</ul>
</li>
<li>
<a class="title">Groups</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Sections</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Pilots</a>
<ul>
<li>HBO</li>
<li>CBS</li>
<li>NBC</li>
</ul>
</li>
<li>
<a class="title">Locations</a>
<ul>
<li>Denver</li>
<li>Baltimore</li>
<li>LA</li>
<li>New York</li>
<li>San Francisco</li>
<li>New Orleans</li>
<li>Jacksonville</li>
<li>Calvery</li>
<li>August</li>
</ul>
</li>
<li>
<a class="title">Cities</a>
<ul>
<li>Denver</li>
<li>Baltimore</li>
<li>LA</li>
<li>New York</li>
<li>San Francisco</li>
<li>New Orleans</li>
<li>Jacksonville</li>
<li>Calvery</li>
<li>August</li>
</ul>
</li>
<li>
<a class="title">News</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Shows</a>
<ul>
<li>HBO</li>
<li>CBS</li>
<li>NBC</li>
<li>CNN</li>
</ul>
</li>
<li>
<a class="title">Topics</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Shows</a>
<ul>
<li>CBS</li>
<li>NBC</li>
</ul>
</li>
<li>
<a class="title">Networks</a>
<ul>
<li>HBO</li>
<li>CBS</li>
<li>NBC</li>
<li>CNN</li>
</ul>
</li>
<li>
<a class="title">Groups</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Sections</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Pilots</a>
<ul>
<li>HBO</li>
<li>CBS</li>
<li>NBC</li>
</ul>
</li>
<li>
<a class="title">Locations</a>
<ul>
<li>Denver</li>
<li>Baltimore</li>
<li>LA</li>
<li>New York</li>
<li>San Francisco</li>
<li>New Orleans</li>
<li>Jacksonville</li>
<li>Calvery</li>
<li>August</li>
</ul>
</li>
<li>
<a class="title">Cities</a>
<ul>
<li>Denver</li>
<li>Baltimore</li>
<li>LA</li>
<li>New York</li>
<li>San Francisco</li>
<li>New Orleans</li>
<li>Jacksonville</li>
<li>Calvery</li>
<li>August</li>
</ul>
</li>
<li>
<a class="title">News</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Shows</a>
<ul>
<li>HBO</li>
<li>CBS</li>
<li>NBC</li>
<li>CNN</li>
</ul>
</li>
<li>
<a class="title">Topics</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
<li>
<a class="title">Shows</a>
<ul>
<li>CBS</li>
<li>NBC</li>
</ul>
</li>
<li>
<a class="title">Networks</a>
<ul>
<li>HBO</li>
<li>CBS</li>
<li>NBC</li>
<li>CNN</li>
</ul>
</li>
<li>
<a class="title">Groups</a>
<ul>
<li>Top Stories</li>
<li>Trending Stories</li>
<li>Sports</li>
<li>U.S.</li>
<li>Global</li>
</ul>
</li>
</ul>
要求
-
如果页面宽度增加,我希望有 更多 列,如果缩小,我希望有 less 列。
李> 如果我要添加两倍的项目,我希望列的高度变高,以便为其他项目留出空间。
每组之间的填充/空白应相同。
理想情况下我不会使用 JavaScript(但如果那是唯一的方法)。
问题
当我缩小屏幕高度/宽度时,内容会从菜单的右侧溢出。
想法
我已经搜索了一种 CSS 解决方案,但找不到一个不会在不均匀组之间添加间距的解决方案。 (例如Uneven whitespace)
我能想到的就是使用 JavaScript 动态设置 flexbox 父级的高度(增加高度直到最后一个项目组 (TITLE F) 完全显示并且不会溢出屏幕。
【问题讨论】:
-
您是否尝试过媒体查询来更改布局?
-
由于内容量是动态的并且可以改变菜单所需的高度,我认为媒体查询没有帮助。
-
我需要继续思考这个问题,但这是一个非常酷的问题。
-
Flex
column wrap在大多数浏览器中都有很多问题。它还没有真正准备好迎接黄金时段的 IMO。请参阅here、here、here 和 here。如果可以,请坚持使用row wrap:jsfiddle.net/wc8c4ccm/2(只是一个基本模板/不适合您的内容) -
我同意@Michael_B。您可以尝试 flex 或多列布局,但听起来两者都不能完全涵盖您的目标。
标签: javascript css flexbox