5.3.1 声明式用法

一般下拉菜单都是在导航条(navbar)和选项卡(tab)上实现,如图5-4所示的效果就是navbar的效果,单击每个Dropdown链接都可以弹出事先隐藏设置的菜单。

5.3.1 声明式用法 - 图1 图5-4 下拉菜单运行效果

上述效果的示例代码如下:

  1. <div class="navbar navbar-default" id="navbar-example">
  2. <a href="#" class="navbar-brand">Project Name</a>
  3. <ul role="navigation" class="nav navbar-nav">
  4. <li class="dropdown">
  5. <a data-toggle="dropdown" class="dropdown-toggle" role="button"
  6. href="#" id="drop1">Dropdown <b class="caret"></b></a>
  7. <ul aria-labelledby="drop1" role="menu" class="dropdown-menu">
  8. <li role="presentation"><a href="#" tabindex="-1" role=
  9. "menuitem">Action</a></li>
  10. ...
  11. </ul>
  12. </li>
  13. <li class="dropdown">
  14. <a data-toggle="dropdown" class="dropdown-toggle" role="button"
  15. id="drop2" href="#">Dropdown 2 <b class="caret"></b></a>
  16. <ul aria-labelledby="drop2" role="menu" class="dropdown-menu">
  17. <li role="presentation"><a href="#" tabindex="-1" role=
  18. "menuitem">Action</a></li>
  19. </ul>
  20. </li>
  21. </ul>
  22. <ul class="nav navbar-nav navbar-right">
  23. <li class="dropdown" id="fat-menu">
  24. <a data-toggle="dropdown" class="dropdown-toggle" role="button"
  25. id="drop3" href="#">Dropdown 3 <b class="caret"></b></a>
  26. <ul aria-labelledby="drop3" role="menu" class="dropdown-menu">
  27. <li role="presentation"><a href="#" tabindex="-1" role=
  28. "menuitem">Action</a></li>
  29. </ul>
  30. </li>
  31. </ul>
  32. </div>

注意上述代码,首先navbar的父容器上要应用.navbar样式,其次顶级ul块上要应用.nav和.navbar-nav样式。Dropdown3应用了.navbar-right样式后,就变成了向右浮动对齐了。

另外一种运行在选项卡(tab)上的效果如图5-5所示。

5.3.1 声明式用法 - 图2 图5-5 选项卡上的下拉菜单运行效果

图5-5的实现HTML代码如下:

  1. <ul class="nav nav-pills">
  2. <li class="active"><a href="#">Regular link</a></li>
  3. <li class="dropdown">
  4. <a href="#" data-toggle="dropdown" class="dropdown-toggle"
  5. role="button" id="drop4">Dropdown <b class="caret"></b></a>
  6. <ul aria-labelledby="drop4" role="menu" class="dropdown-menu" id="menu1">
  7. <li role="presentation"><a href="#" tabindex="-1" role="menuitem">
  8. Action</a></li>
  9. </ul>
  10. </li>
  11. <li class="dropdown">
  12. <a href="#" data-toggle="dropdown" class="dropdown-toggle" role=
  13. "button" id="drop5">Dropdown 2 <b class="caret"></b></a>
  14. <ul aria-labelledby="drop5" role="menu" class="dropdown-menu" id="menu2">
  15. <li role="presentation"><a href="#" tabindex="-1" role="menuitem">
  16. Action</a></li>
  17. </ul>
  18. </li>
  19. <li class="dropdown">
  20. <a href="#" data-toggle="dropdown" class="dropdown-toggle" role=
  21. "button" id="A1">Dropdown 3 <b class="caret"></b></a>
  22. <ul aria-labelledby="drop5" role="menu" class="dropdown-menu" id="menu3">
  23. <li role="presentation"><a href="#" tabindex="-1" role="menuitem"
  24. >Action</a></li>
  25. </ul>
  26. </li>
  27. </ul>

根据上面的两种运行效果,可以发现,用户单击Dropdown链接或者小箭头的时候,隐藏的菜单会弹出来。在HTML编写方面只需要满足如下规则即可:

❑菜单样式和菜单项保持一致(即按照第4章的要求编写)。

❑被单击的链接或者按钮上需要应用data-toggle="dropdown"样式,以便在初始化的时候JavaScript可以监控单击事件。

其实现原理如下:

❑Dropdown插件在网页加载的时候,对所有带有data-toggle="dropdown"样式的元素进行事件绑定。

❑用户单击带有data-toggle="dropdown"样式的链接或按钮时,触发JavaScript事件代码。

❑Javascript事件代码在父容器(本例是:<li class="dropdown">)上加一个.open样式。

❑默认隐藏的.dropdown-menu菜单在外部有了.open样式后,即可显示出来,从而达到预期的效果。

结合上面的例子和原理,其基本用法示例如下:

  1. <div class="dropdown">
  2. <a class="dropdown-toggle" data-toggle="dropdown" href="#">下拉菜单触发元素</a>
  3. <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
  4. ...
  5. </ul>
  6. </div>

为了避免href="#"被单击时页面跳到顶部,可以使用data-target="#"代替href="#"。

  1. <div class="dropdown">
  2. <a class="dropdown-toggle" data-toggle="dropdown" data-target="#" id="dLabel"
  3. role="button" href="/page.html">下拉菜单触发元素<span class="caret"></span>
  4. </a>
  5. <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
  6. ...
  7. </ul>
  8. </div>

关于data-target属性,还有一个有趣的用法,那就是触发元素可以放在菜单的父容器外部。如下示例中,触发元素是一个button按钮,而菜单在nav样式内的li元素里,这样单击button也能弹出默认隐藏的菜单项。

这种用法有两点需要注意:一是要设置父容器的id值(本例是menutest1),二是要设置button元素的data-toggle属性和data-target属性,而且data-target属性值是#id,即#menutest1。

  1. <button id="btn" data-toggle="dropdown" data-target="#menutest1">外部按钮</button>
  2. <ul class="nav nav-pills">
  3. <li class="dropdown" id="menutest1"> <!--必须在父元素上设置和data-target一致的id值,
  4. 即menutest1 -->
  5. <ul class="dropdown-menu">
  6. <li><a href="#">动作</a></li>
  7. <li class="divider"></li>
  8. <li><a href="#">被间隔的链接</a></li>
  9. </ul>
  10. </li>
  11. </ul>