众所周知,“DHTML”下拉菜单包含大量讨厌的JavaScript,其中包含大量浏览器特定的黑客攻击,使得任何其他整洁的语义HTML都无法访问。哦,这是一个轻量级、易访问、符合标准、兼容交叉浏览器的方法的梦想!输入吸管鱼下拉列表。
文章续下
首先,我们应该使用定义导航菜单的最佳方法-列表。对于这个例子,我们将处理一个简单的HTML无序列表。{换行已标记». –预计起飞时间。}
<ul><li>太阳鱼<ul><li>黑带»太阳鱼</a></li><li>阴影低音</a></li><li>奥扎克低音</a></li><li>白色克拉皮</a></li></ul></li><li>格伦茨<ul><li>小嘴咕噜声</a></li><li>Burrito公司</a></li><li>猪鱼</a></li></ul>雷莫拉斯<ul><li>捕鲸人</a></li><li>马林斯克</a></li><li>锡兰语remora</a></li><li><a href=“”>长矛鱼</a></li><li>细长吸管鱼</a></li></ul></li></ul>
非常简单,非常简洁的HTML,因此非常容易访问。但现在我们想将其转换为动态列表-第一级列表项将组成一个水平菜单栏,第二级列表将从中下拉。
开始时,所有列表都需要稍微调整一下,即填充和边距设置为零,列表样式设置为无:
ul公司{填充:0;边距:0;列表样式:无;}
现在,我们需要将一级列表转换为水平菜单栏。有许多方法可以做到这一点,并进行了详细讨论在别处。我们可以内联显示列表项(显示:内联
),但对于这个示例,我们要将它们向左浮动。
李{浮动:左;位置:相对;宽度:10em;}
位置已设置为相对的
因为我们希望第二级嵌套列表的位置相对于第一级列表项,并且宽度已设置为将其分隔开一点。下拉菜单正在合并。
下一步是处理二级列表,这些列表本身就是下拉列表:
锂ul{显示:无;位置:绝对;顶部:1em;左:0;}
这绝对地定位了第二级列表(将它们从HTML流中拉出来,进入一个完全属于它们自己的世界),并将它们的初始状态设置为不显示。如果您替换显示:无
具有显示:块
,您将在Internet Explorer中看到对顶部和左侧属性的需要,因为如果没有它们,IE将把二级列表对齐到其相对父级的右上角,而不是左下角。不幸的是,此IE修复程序会在Opera等浏览器中造成混乱,因此添加以下CSS以重置除IE浏览器以外的所有浏览器的顶部和左侧属性:
li>ul{顶部:自动;左:自动;}
现在,让吸盘工作。为了在其父列表项“滚动”时显示二级列表,我们只需添加以下内容:
li:悬停ul{display:block;}
这意味着应该显示嵌套在列表项中且光标悬停在其上的任何列表。
最后,由于列表是向左浮动的,因此需要通过应用清除:左侧
到它。
我听到102.6%的人(或最新比例的人)哭了:“这句废话没用!”。正如一些人可能已经猜到的那样,我正在谈论Internet Explorer用户。您使用和开发的浏览器(如Mozilla)越多,就越能意识到Internet Explorer在web标准方面是多么可怜。这个:悬停
pseudo类应该可以处理任何元素,但在InternetExplorer中它只能处理链接。那么,当下拉菜单只适用于-2.6%的浏览器时,它有什么用?说实话,没什么。我们需要运用更多的魔法。
基于DOM的救援脚本#第5节
我们已经确定IE缺乏对:悬停
伪类,但通过使用文档对象模型,我们可以将mouseover和mouseout事件附加到任何元素。这对我们来说是个好消息,因为这意味着通过简单的JavaScript片段,我们可以有效地修补IE的:悬停
问题。
因为IE是盲目的,我们需要找到另一种方法来识别:悬停
伪类。使用JavaScript,我们知道可以操作元素的className属性,因此我们首先要做的是更改CSS:
li:悬停ul{display:block;}
变为:
li:将ul悬停,li悬停在ul上{显示:块;}
现在我们可以调用:悬停
通过添加类的CSS规则结束
至所需元素。我们还需要一种方法来告诉IE页面上的哪些UL元素是我们真正想要的下拉菜单。我们可以通过提供身份证件
到我们的根美国
元素:
startList=函数(){if(document.all&&document;.getElementById){navRoot=文档.getElementById(“nav”);对于(i=0;i;if(node.nodeName==“LI”){node.onmouseover=函数(){this.className+=“超过”;}node.onmouseout=函数(){this.className=this.classesName.replace(“over”,“”);}}}}}window.onload=startList;
页面加载时startList(启动列表)
函数被调用。该函数通过检查是否存在文档.all
对象和文档.getElementById
功能。这是一种粗略的方法,但它很简短,而且很甜蜜,因为我们正在尝试制定一个紧凑的解决方案,这就行了。然后它循环通过,启用mouseover和mouseout事件,从而添加和删除结束
来自的类类名
元素的属性。
给你。如果你在任何地方迷路了,看看评论,光网络示例正在运行。
到目前为止,情况有点不妙。这个想法是为了显示吸管鱼下拉菜单的基本工作方式,但CSS可以让事情看起来漂亮多了一个明显的起点是为二级列表应用背景色。
按说明重置顶部和左侧属性后早期的,中的下拉列表漂亮的在大多数现代浏览器中,示例直接出现在菜单标签的下方,但不幸的是,并不是全部。在Safari 1.0中,它们仍然从屏幕左上角向下下拉。{检查讨论论坛解决方法。–预计起飞时间。}
进一步的可用性和可访问性#第7节
从第一级列表项中创建链接将允许不使用指针设备的读者使用tab-stoping。将这些链接指向比下拉列表中的链接更高级别的页面会更好。