CSS - 让水平列表中的每个项目具有相同份额的可用填充

发布于 2024-10-08 17:22:31 字数 749 浏览 5 评论 0原文

考虑一个简单的 CSS 布局,其中包含包装器 div 定义了大约 900 像素的固定宽度,因此其中的所有内容都会扩展到 100% 宽度。

在这里,我有一个导航 div,包含 1 个 UL 和 6 个列表项,左浮动,因此它们水平显示在一行中。

每个列表项应该可变地增长以准确地适应其文本内容,但每个项目之间的间距应该共享,以便整个菜单适合 100% 的空间,例如:

------------------------------------------------------
-N-        -N-          -N-               -N-      -N-
- -        - -          - -               - -      - -
- -ITEM1111- -ITEM222222- -ITEM33333333333- -ITEM44- -   
- -        - -          - -               - -      - -
------------------------------------------------------
<-------------------- 100% -------------------------->   

我希望这是说明性的! 'N' 是恒定的,但会相应地增长以适应 100% 宽度(即为了可访问性 - 有人增加了字体大小)。

很高兴接受替代建议,尽管我的目标不是 javascript 或图像,只是 css 纯度。

Consider a simple CSS layout, where containing wrapper div defines a fixed width of 900 or so pixels, everything inside it therefore expands to 100% width.

In here, I have a navigation div, containing 1 UL and 6 list items, left-floated so they appear in a line horizontally.

Each list item should growing variably to fit its text contents exactly, but the spacing between each item should be shared so that the whole menu fits into the 100% space, such as:

------------------------------------------------------
-N-        -N-          -N-               -N-      -N-
- -        - -          - -               - -      - -
- -ITEM1111- -ITEM222222- -ITEM33333333333- -ITEM44- -   
- -        - -          - -               - -      - -
------------------------------------------------------
<-------------------- 100% -------------------------->   

I hope that is illustrative! 'N' is constant but grows to fit the 100% width accordingly (i.e. for accessibility - someone increases the font size).

Happy to take alternative suggestions although I'm aiming for no javascript or images, just css purity.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

蹲墙角沉默 2024-10-15 17:22:31

这是我基于 CSS3 灵活框布局的简单解决方案:

样式

ul {
    padding: 0;
    width: 100%;
}

ul li {
    list-style: none;
    text-align: center;
    border: 1px solid Gray;
}

.flexmenu {
    display: -webkit-box;
    display: -moz-box;
    display: box;
}

.flexmenu li {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;

    -webkit-flex-basis: auto;
    -moz-flex-basis: auto;
    flex-basis: auto;
}

HTML

<div style="width:900px">
    <ul class="flexmenu">
        <li>short</li>
        <li>looooooooooooooooooooooooooooooong</li>
        <li>short</li>
        <li>short</li>
    </ul>
</div>

结果

在此处输入图像描述

Here is my simple solution for this based on CSS3 Flexible Box Layout:

Styles

ul {
    padding: 0;
    width: 100%;
}

ul li {
    list-style: none;
    text-align: center;
    border: 1px solid Gray;
}

.flexmenu {
    display: -webkit-box;
    display: -moz-box;
    display: box;
}

.flexmenu li {
    -webkit-box-flex: 1;
    -moz-box-flex: 1;
    box-flex: 1;

    -webkit-flex-basis: auto;
    -moz-flex-basis: auto;
    flex-basis: auto;
}

HTML

<div style="width:900px">
    <ul class="flexmenu">
        <li>short</li>
        <li>looooooooooooooooooooooooooooooong</li>
        <li>short</li>
        <li>short</li>
    </ul>
</div>

Result

enter image description here

一场春暖 2024-10-15 17:22:31

如果 IE6/IE7 兼容性对您来说并不重要,那么使用 display 这个布局就很简单: table

http://jsfiddle.net/5SFG5 /

If IE6/IE7 compatibility is not critical to you, this layout is trivial using display: table

http://jsfiddle.net/5SFG5/

一个人的夜不怕黑 2024-10-15 17:22:31

问题是,当元素浮动时,其宽度会减小到内容的实际宽度。不过,你可以使用 Javascript 来玩弄这个(我知道你要求一个无 js 版本,但我想不出其他选择)。在 jQuery 中这应该相当简单。鉴于这种结构:

<ul id="nav">
  <li>ITEM1</li>
  <li>ITEM2</li>
  <li>ITEM3</li>
</ul>

你可以做这样的事情:

var width = 0, maxwidth = 900;
$('#nav li').each(function(){
  width += $(this).width();
});
var count = 2 * $('#nav').size();
var margin = (maxwidth - width) / count;
$('#nav li').css({
  marginLeft: margin + 'px',
  marginRight: margin + 'px'
});

抱歉,代码很乱,我有点着急:D。不管怎样,你所做的基本上是:检查 li 元素占用的总宽度,检查未占用的宽度并用 li 边距填充它。

Problem is that when an element is floated, its width is reduced to the actual width of the content. You can toy with this using Javascript though (I know you requested a no-js version, but I can't think of another option). In jQuery it should be fairly easy. Given this structure:

<ul id="nav">
  <li>ITEM1</li>
  <li>ITEM2</li>
  <li>ITEM3</li>
</ul>

you could do something like this:

var width = 0, maxwidth = 900;
$('#nav li').each(function(){
  width += $(this).width();
});
var count = 2 * $('#nav').size();
var margin = (maxwidth - width) / count;
$('#nav li').css({
  marginLeft: margin + 'px',
  marginRight: margin + 'px'
});

Sorry for the messy code, I'm in a bit of a hurry :D. Anyways, what you do is, basically: check the total width occupied by the li elements, check how much is unoccupied and fill it with li margins.

泅渡 2024-10-15 17:22:31

我不确定 N 如何既可以是常量宽度又可以是可变宽度。

这是一个开始..

CSS

#nav { width: 100%; display: inline; }
#nav ul li {
                display: block;
                float: left;
                margin: 2%;
                width: 10%;
            }

 #nav ul li a {margin: 0 auto; display: block;}

html

<div id="nav">
        <ul>
            <li><a href="#">Item 1</a></li>
            <li><a href="#">Item 1</a></li>
            <li><a href="#">Item 1</a></li>
            <li><a href="#">Item 1</a></li>
            <li><a href="#">Item 1</a></li>
            <li><a href="#">Item 1</a></li>
         </ul>
</nav>

I'm not sure how N can be both a constant and a variable width.

Here's a start..

CSS

#nav { width: 100%; display: inline; }
#nav ul li {
                display: block;
                float: left;
                margin: 2%;
                width: 10%;
            }

 #nav ul li a {margin: 0 auto; display: block;}

html

<div id="nav">
        <ul>
            <li><a href="#">Item 1</a></li>
            <li><a href="#">Item 1</a></li>
            <li><a href="#">Item 1</a></li>
            <li><a href="#">Item 1</a></li>
            <li><a href="#">Item 1</a></li>
            <li><a href="#">Item 1</a></li>
         </ul>
</nav>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文