2015-10-01 18 views
1

我有一个多列布局的问题。我将菜单设计为一组div元素,我想将它们对齐到1-4列(取决于屏幕高度和菜单项计数)。它不能被硬编码。为什么css3多列布局的float会导致元素的宽度在所有浏览器中等于一列的宽度?

这里是我的HTML(jsfiddle link):

<nav id="sideMenu" class="side-nav"> 
    <article class="side-nav-content"> 
     <div class="content-box-nav-wrapper"> 
      <div class="content-box"> 
       <div class="box-header pre-box-header"></div> 
       <div class="box-header"> 
        <p>Option1</p> 
       </div> 
       <div class="box-header post-box-header"></div> 
       <div class="box-content"> 
        <a>Link1</a> 
        <a>Link2</a> 
       </div> 
      </div> 
     </div> 
     <div class="content-box-nav-wrapper"> 
      <div class="content-box"> 
       <div class="box-header pre-box-header"></div> 
       <div class="box-header"> 
        <p>Option1</p> 
       </div> 
       <div class="box-header post-box-header"></div> 
       <div class="box-content"> 
        <a>Link1</a> 
        <a>Link2</a> 
       </div> 
      </div> 
     </div> 
     <div class="content-box-nav-wrapper"> 
      <div class="content-box"> 
       <div class="box-header pre-box-header"></div> 
       <div class="box-header"> 
        <p>Option1</p> 
       </div> 
       <div class="box-header post-box-header"></div> 
       <div class="box-content"> 
        <a>Link1</a> 
        <a>Link2</a> 
       </div> 
      </div> 
     </div> 
     <div class="content-box-nav-wrapper"> 
      <div class="content-box"> 
       <div class="box-header pre-box-header"></div> 
       <div class="box-header"> 
        <p>Option1</p> 
       </div> 
       <div class="box-header post-box-header"></div> 
       <div class="box-content"> 
        <a>Link1</a> 
        <a>Link2</a> 
       </div> 
      </div> 
     </div> 
     <div class="content-box-nav-wrapper"> 
      <div class="content-box"> 
       <div class="box-header pre-box-header"></div> 
       <div class="box-header"> 
        <p>Option1</p> 
       </div> 
       <div class="box-header post-box-header"></div> 
       <div class="box-content"> 
        <a>Link1</a> 
        <a>Link2</a> 
       </div> 
      </div> 
     </div> 
    </article> 
</nav> 
<div class="content"> 
    <p class="wrong">This should be on the right side of mneu.</p> 
</div>  

和我的CSS是这样的:

p, a { 
    color: black; 
} 

#sideMenu { 
    float: left; /*This float seems to mess up column layout's width*/ 
} 

article.side-nav-content { 
    -webkit-column-width: 255px; 
    -moz-column-width: 255px; 
    column-width: 255px; 
    -webkit-column-gap: 28px; 
    -moz-column-gap: 28px; 
    column-gap: 28px; 
    -moz-column-fill: auto; 
    height: 200px; 
} 

.side-nav .content-box { 
    border: 1px solid #000; 
    -webkit-border-radius: 2px; 
    -moz-border-radius: 2px; 
    border-radius: 2px; 
    margin: 0px 0px 23px 0px; 
    color: #fff; 
    background: rgba(0, 0, 0, 0.1); 
    width: 255px; 
    -webkit-column-break-inside: avoid; 
    page-break-inside: avoid; 
    column-break-inside: avoid; 
    break-inside: avoid; 
} 

.content { 
    width: 100vw; 
    height: 100vh; 
    float: left; 
} 

.wrong { 
    color: red; 
    font-size: 20px; 
} 

body { 
    width: 200vw; 
    overflow-x:hidden; 
} 

如果你在浏览器中检查#sideMenu你会看到,尽管事实上,它是可见为3列,应该有它们的宽度,它只有第一列宽度。

我该如何解决这个问题? (红色文本应该是旁边的最后一个方框右侧)

image with issue

删除浮动是不是一个很好的解决方案,因为我需要这个旁边的页面内容。

我需要菜单div浮动以及页面内容,因为我想我的菜单来回滑动用户的点击。我想修改用户操作的菜单宽度,从0%到100%,但这是不可能的,因为内容会干扰菜单。我已经用最新版本的Chrome和Firefox进行了测试。

+0

如何设置“明确:既”在你的CSS样式表 – ahPo

+0

的“内容”的元素规则不幸的是这并没有解决问题,@ user2340218。 – Keammoort

+0

然后尝试为“#sideMenu”元素添加“display:inline-block”和“width:nn%”规则,同时保持其“float:left”规则 – ahPo

回答

0

我有同样的问题,唯一的办法就是用javascript。 (因为根据列div中的内容量和窗口大小,列宽将是动态的)。

所以#sideMenu必须有“位置:相对;”然后在JavaScript中,您将style.left设置为至少可以通过document.getElementById('columnContainer')。clientWidth获得的列容器的宽度。

如果需要,我可以在这里提供一个jsfiddle或更多的代码。至少,你将不得不调用javascript函数来调用body load和widow size的变化。

好运

+0

如果你可以请提供一个jsfiddle和/或粘贴一些代码在这里。我试图自己做到这一点,但我发现列间距显示不正确(更多的是28像素)。 – Keammoort

+0

试图让我的想法与你的小提琴一起工作 - 我认为你应该考虑使用CSS flex for your case - 它真的好多了。在我的情况,恕我直言,我认为使用CSS列的唯一理由是用普通文本来获得新闻纸栏的效果。但在你的情况下,CSS弹性盒应该更容易解决你的问题。如果您想为您展示一些示例代码,请告诉我。 – user889329

相关问题