CSS动态水平导航菜单填充特定宽度(表格行为)

发布于 2024-10-19 02:23:35 字数 761 浏览 1 评论 0原文

我需要创建一个水平导航菜单,其中的项目数量不断变化(这很重要 - 我无法将宽度硬编码到 CSS 中,并且我不想用 JS 计算它们),这些菜单填充到一定的宽度,假设800px。

对于表格, 在此处输入图像描述

<table width="800" cellspacing="0" cellpadding="0">
  <tr>
    <td>One</td>
    <td>Two</td>
    <td>Three</td>
    <td>Four</td>
    <td>Five Seven</td>
  </tr>
</table>

<style>
table td {
      padding: 5px 0;
      margin: 0;
      background: #fdd;
      border: 1px solid #f00;
      text-align: center;
    }
</style>

请注意,较长的项目会占用更多空间,我可以将项目添加到 HTML 中而不需要更改任何内容在 CSS 中,菜单项会缩小以容纳其他项目 - 整个菜单永远不会短于或长于 800px。

由于菜单在语义上不是表格的正确使用,因此可以使用列表和纯 CSS 来完成此操作吗?

I need to create a horizontal navigation menu with a changing number of items (this is important - I can't hard-code widths into the CSS and I don't want to calculate them with JS) that fill up to a certain width, let's say 800px.

With tables, enter image description here

<table width="800" cellspacing="0" cellpadding="0">
  <tr>
    <td>One</td>
    <td>Two</td>
    <td>Three</td>
    <td>Four</td>
    <td>Five Seven</td>
  </tr>
</table>

<style>
table td {
      padding: 5px 0;
      margin: 0;
      background: #fdd;
      border: 1px solid #f00;
      text-align: center;
    }
</style>

Note that longer items take up more space and I can add items into the HTML without changing anything in CSS and the menu items shrink to accommodate additional items - the whole menu never being shorter or longer than 800px.

As a menu isn't a semantically correct use of a table, can this be done with say a list and pure CSS?

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

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

发布评论

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

评论(4

握住你手 2024-10-26 02:23:35

支持表格显示的浏览器 CSS 规则中,是的:

<style>
  nav {display:table; width:800px; background:yellow}
  ul {display:table-row; }
  li {display:table-cell; border:1px solid red}
</style>

<nav>
 <ul>
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
  <li>Four</li>
  <li>Five Seven</li>
 </ul>
</nav>

基本上,您必须建立一个令牌表。实际操作:http://jsbin.com/urisa4

否则:不,如果您不能妥协您的要求,则不这样做。

In browsers that support the table display CSS rules, yes:

<style>
  nav {display:table; width:800px; background:yellow}
  ul {display:table-row; }
  li {display:table-cell; border:1px solid red}
</style>

<nav>
 <ul>
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
  <li>Four</li>
  <li>Five Seven</li>
 </ul>
</nav>

Basically, you'd have to build a token table. In action: http://jsbin.com/urisa4

Otherwise: no, not if you can't compromise your requirements.

终陌 2024-10-26 02:23:35

你可以这样做:

<style type="text/css">
#container { width: 800px ; border: 1px dashed #333; }
#container div { width: inherit; display: table-cell; background: #ccc}
</style>

<div id="container">
    <div>Something</div>
    <div>Something</div>
    <div>Something</div>
</div>  

这样它就可以填满你想要的东西,但可以增长到很多项目。

希望这有帮助。

You could do something like this:

<style type="text/css">
#container { width: 800px ; border: 1px dashed #333; }
#container div { width: inherit; display: table-cell; background: #ccc}
</style>

<div id="container">
    <div>Something</div>
    <div>Something</div>
    <div>Something</div>
</div>  

That way it fills up what you want, but can grow to a lot of items.

Hope this helps.

愿与i 2024-10-26 02:23:35

使用 CSS 实现此目的的唯一方法是对 li 元素的 width 进行硬编码(假设您使用以下结构):

  <ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
    <li>Four</li>
    <li>Five Seven</li>
  </ul>

ul {
    width: 80%; /* or whatever */
}

ul li {
    width: 16%;
    padding: 1%;
}

JS Fiddle 演示

这可能会留下“未使用”的 10%(用于margin 或额外的padding)。

在未来的某个时刻,css 计算可能能够更流畅地执行此操作。

The only way to do this with CSS is to hard-code the width of the li elements (assuming you'd be using the following structure):

  <ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
    <li>Four</li>
    <li>Five Seven</li>
  </ul>

ul {
    width: 80%; /* or whatever */
}

ul li {
    width: 16%;
    padding: 1%;
}

JS Fiddle demo.

This leaves, potentially, an 'unused' 10% (to be used for margin or additional padding).

At some point in the future css calculations might be able to perform this more fluidly.

嗫嚅 2024-10-26 02:23:35

这可行,但我不认为你想要这样的想法:)

<div class="master">
    <ul>
        <li>test1</li>
        <li>test2</li>
        <li>aölsdkfaösdlfk</li>
        <li>yeah baby</li>
        <li>hi</li>
    </ul>
</div>

.master {
   width:800px;
   background-color:black;
   height:100px;
   color:white;
    display:table;
}
table {
 width:100%;   
}

ul {
 display:table-row;  
 width:100%; 
}
li {
 display:table-cell;  
 width:auto; 
 margin:1px;
 border:1px solid white;
 background-color:red;
 text-align:center;
    vertical-align:middle;
}

http://jsfiddle.net/UnNyS/< /a>

This works, but i don´t think you want some think like this :)

<div class="master">
    <ul>
        <li>test1</li>
        <li>test2</li>
        <li>aölsdkfaösdlfk</li>
        <li>yeah baby</li>
        <li>hi</li>
    </ul>
</div>

.master {
   width:800px;
   background-color:black;
   height:100px;
   color:white;
    display:table;
}
table {
 width:100%;   
}

ul {
 display:table-row;  
 width:100%; 
}
li {
 display:table-cell;  
 width:auto; 
 margin:1px;
 border:1px solid white;
 background-color:red;
 text-align:center;
    vertical-align:middle;
}

http://jsfiddle.net/UnNyS/

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