无列表导航 – 使用 CSS 做更多事情,用更少的代码

Avatar of David Walsh
David Walsh

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 200 美元的免费额度!

CSS 最棒的一点在于它允许 Web 开发人员用更少的代码实现更多功能。 这到底意味着什么? 首先,CSS 允许开发人员

  • 编写更少、更少的 XHTML 代码
  • 将网站格式与内容分离
  • 使用一个 CSS 文件控制开发人员允许自己控制的尽可能多的网站主题/设计
  • 轻松地使网站显示适应用户,而不是用户适应网站
  • 更改我们网站针对特定设备和特殊情况的显示

列表还在继续。 用更少的代码做更多事情的功能就在那里; 开发人员需要编写 XHTML 代码以充分利用 CSS 的强大功能。 我经常看到 CSS 未被充分利用的一个地方是导航菜单。

根据您网站的设计,您可以使用垂直导航或水平导航。 您也可以同时使用两者。 如果您使用 XHTML 列表(<ol> 或 <ul>)作为导航,那么您很有可能编写了额外的代码。 现在是时候利用 CSS 的 display 属性了。 我们将把…

<div id="navigation">
	<h3>Categories</h3>
	<ul class="nav-list">
		<li><a href="/css">CSS</a></li>
		<li><a href="/html">HTML</a></li>
		<li><a href="/mootools">MooTools</a></li>
		<li><a href="/php">PHP</a></li>
		<li><a href="/xml">XML</a></li>
	</ul>
</div>

…转换成…

<div id="navigation">
	<h3>Categories</h3>
	<a href="/css">CSS</a>
	<a href="/html">HTML</a>
	<a href="/mootools">MooTools</a>
	<a href="/php">PHP</a>
	<a href="/xml">XML</a>
</div>

…使用一些非常基本的、跨浏览器兼容的 CSS。

在这种情况下,使用列表/列表项结构方法的唯一真正优势是 <li> 本质上是“块”元素; 它们是实心的容器,除非浮动,否则会换行。 CSS 允许我们使用 display:block; 属性/值组合来阻止指定的元素。 为了去除上面冗余的列表代码,我们可以为导航菜单内的任何链接(<a>)指定 display:block;

#navigation a { display:block; }

上面的示例是垂直导航所需的一切。 对于水平导航,您需要指定一个 float 值,就像使用列表项一样。

#navigation a { display:block; float:left; }

就这些?是的! 在很多情况下,您可以简单地获取以前的 <li> 属性并将它们移动到链接选择器! 上面的代码对开发人员和用户都具有巨大的优势,因为

  • 开发人员可以节省大量带宽
  • 页面加载速度更快
  • 更少的代码意味着更快的维护
  • 列表属性不会干扰您的锚点属性

如果您不相信或想看看此 CSS/XHTML 的实际效果,请随时查看我的网站的源代码:davidwalsh.name

在您发表评论之前…

我的方法受到了批评,所以我想回答一些我预见的几个问题/评论。

1. 这段代码很丑!

我从未听说过客户说我的代码很丑。 但是,我确实因为创建加载速度快的网站而受到了感谢。 请记住,在大多数情况下,只有开发人员才会关心代码的外观。 功能是关键。

2. 它并没有节省那么多代码!

想想您的页面被用户下载了多少次! 想想您的 JavaScript 库增加了多少额外的下载时间! 所有 Web 开发人员都应该考虑下载时间。

3. 您的代码降级效果不好。

可访问性始终是我考虑的一个因素。 如果您关闭所有 CSS 样式,页面将简单地显示用空格分隔的链接。 与列表一样好? 不,但仍然易于阅读。

在与 Chris 交流时,他提出了一个非常巧妙的观点。 可以创建一个 <h2> 标签(或您选择的任何标签),将其命名为“导航”,并使用 CSS 隐藏它。 如果 CSS 被关闭,则“导航”标题将显示,用户将清楚地知道他/她正在查看导航。

我要特别感谢 Chris 让我与大家分享我的方法。 我计划监控评论,所以请分享您的想法和建议。