【问题标题】:Why does css3 multi-column layout's float causes element's width to be equal to one column's width in all browsers?为什么css3多列布局的浮动导致元素的宽度在所有浏览器中都等于一列的宽度?
【发布时间】:2017-08-28 02:47:33
【问题描述】:

我遇到了多列布局的问题。我将菜单设计为一组 div 元素,我想将它们对齐为 1-4 列(取决于屏幕高度和菜单项数)。它不能被硬编码。

这是我的 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 列并且应该具有它们的宽度,但它只有第一列宽度。

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

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

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

【问题讨论】:

  • 如何为 CSS 样式表中的“.content”元素设置“clear: both”规则
  • 不幸的是,这并没有解决问题,@user2340218。
  • 然后尝试为“#sideMenu”元素添加“display:inline-block”和“width:nn%”规则,同时保持其“float:left”规则
  • 也没有帮助。我想我会使用 transform: translateX(-100%);用于显示/隐藏菜单,但是当我有问题提到的问题时,这将不起作用.. 还有更多想法吗?也许列布局应该以这种方式表现并且它是用某种标准编写的?我只是不明白为什么要提供仅设置列宽(不指定列数)的选项,但以元素具有错误宽度的方式实现浏览器...

标签: html css css-multicolumn-layout


【解决方案1】:

我遇到了同样的问题,我想出的唯一方法是使用 javascript。 (因为列宽将根据列 div 中的内容量和窗口大小而动态变化)。

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

如果您需要,我可以在此处提供 jsfiddle 或更多代码。

至少,您必须调用 javascript 函数 onbody load 和任何时候寡妇大小发生变化。

祝你好运

【讨论】:

  • 如果可以,请在此处提供 jsfiddle 和/或粘贴一些代码。我尝试自己执行此操作,但我发现列间距未正确显示(超过 28 像素)。
  • 在尝试让我的想法与你的小提琴一起工作之后 - 我认为你应该考虑为你的用例使用 css flex - 它真的好多了。就我而言,恕我直言,我认为使用 css 列的唯一原因是使用常规文本来获得报纸列的效果。但是在您的情况下,css flex box 应该更容易解决您的问题。如果您想为您展示一些示例代码,请告诉我。
猜你喜欢
  • 2021-09-26
  • 1970-01-01
  • 2013-10-16
  • 2022-11-16
  • 2012-04-07
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2014-03-27
相关资源
最近更新 更多