Liftweb菜单自定义

时间:2010-02-01 07:27:24

标签: css scala menu sitemap lift

我想创建一个看起来像的菜单:

首页| FOO | BAR |关于| CONTACT

我该怎么做呢?

以下是我的尝试:

<lift:Menu.builder ul:class="menu" li_item:class="current" />

ul.menu li {
   display: inline;
   list-style-type: none;
   text-transform: uppercase;
   border-right: 1px solid white;
   padding-right: 5px;
}

li.current span {
   background: white;
   color: black; 
   padding: 5px 5px 3px 5px;
   font-size: 11px;
}

li.current a, a:visited, a:link {
   color: white; 
   padding: 5px 5px 3px 5px;
   font-size: 11px;
}

这很接近,但看起来不太合适。最后你最后会得到一条额外的线。我希望这些线条与文字的高度相同。

http://lh5.ggpht.com/_5DxlOp9F12k/S2aFQHfupzI/AAAAAAAAJiY/Ds0IpEyu78I/s800/menu.png

4 个答案:

答案 0 :(得分:4)

可能有更简洁的方法来做到这一点。在您的站点地图中声明网址后,您几乎可以将它们用作模板中的常规链接。你会把它们写成纯HTML。

在Boot.scala中:

val menus = List(
  Menu(Loc("home", List("index"), "Home")),
  Menu(Loc("foo", List("foo"), "Foo")),
  Menu(Loc("bar", List("bar"), "Bar")),
  Menu(Loc("about", List("about"), "About")),
  Menu(Loc("contact", List("contact"), "Contact"))
)
LiftRules.setSiteMap(SiteMap(menus: _*))

在您的模板中,例如的index.html:

<div id="menu">
  <a href="/index">Home</a> |
  <a href="/foo">Foo</a> |
  <a href="/bar">Bar</a> |
  <a href="/about">About</a> |
  <a href="/contact">Contact</a>
</div>

或者如Debilski所说,您也可以按名称调用每个菜单项。这将更像是Lift-iesc。

<div id="menu">
  <lift:Menu.item name="home"/>
  <lift:Menu.item name="foo"/>
  <lift:Menu.item name="bar"/>
  <lift:Menu.item name="about"/>
  <lift:Menu.item name="contact"/>
</div>

然后,您可以在外部样式表文件或页面内添加所需的任何样式。

答案 1 :(得分:3)

要删除最后一行,可以使用:last-child伪类:

ul.menu li:last-child {
  border: none;
}

答案 2 :(得分:1)

您可能希望尝试使<li>元素具有inline-block display

ul.menu li {
   display: inline-block;
   *display: inline; zoom: 1; /* inline-block under IE */
   vertical-align: middle;
}

这样,它们的行为就像块元素一样,可能会与链接同步。此外,您可以尝试使用line-height属性而不是添加垂直填充,因为行高会使文本以更精确的方式垂直居中。

答案 3 :(得分:1)

找到其他答案后,我发现了自己的解决方案......

(请注意,我是Lift的新手并且认为菜单太难以手动编码)

<强>解决方案

  • 部分使用MenuWidget(来自lift-widgets)进行启用超级鱼菜单的管道
  • 不要使用MenuWidget渲染菜单,因为它没有正确执行
  • 使用标准Menu.build呈现菜单
  • 添加额外内容以正确终止菜单的“浮动”效果
  • 添加额外内容以启用centered menus

完整解决方案可在以下位置获得: http://subversion.assembla.com/svn/freshcode_public/learn_scala/lift/src/main/scala/code/snippet/CustomMenu.scala

package code.snippet

import net.liftweb.widgets.menu.MenuWidget
import xml.{Text, NodeSeq}

object CustomMenu {

  private def styleElem = {
    <style type="text/css">
      {Text(
      ".float-center-item {\n" +
        "  left: 50%;\n" +
        "  position: relative;\n" +
        "}\n\n" +
        ".float-center-wrapper {\n" +
        "  float: right;\n" +
        "  position: relative;\n" +
        "  left: -50%;\n" +
        "}\n\n" +
        ".float-clear {\n" +
        "  clear:both;\n" +
        "}\n" +
        "/* Margin fix for FireFox */\n" +
        "ul.sf-menu {\n" +
        "  margin-bottom: 0\n" +
        "}\n"
    )}
    </style>
  }

  def render(in: NodeSeq) = {
    // Need to get MenuWidget to provide the plumbing
    // We render menu ourselves because MenuWidget doesn't seem to do it properly.
    MenuWidget(List("No Group")) ++
      <head>
        {styleElem}
      </head> ++
      <div class="float-center-wrapper">
          <lift:Menu.builder top:class="sf-menu float-center-item" linkToSelf="true" expandAll="true"/>
      </div> ++
      // This div terminates the floating effects properly.
      <div class="float-clear"></div>
  }
}

用法:

<div class="lift:CustomMenu">nothing</div>