As I extend an ASP.Net application with MVC functionality, I also need to replace some of the components that the AjaxControlToolkit provides. Case in point, the HoverMenuExtender.
The HME is declared in markup like this:
<ajax:HoverMenuExtender ID=”hme” runat=”server” TargetControlID=”tdTable” PopupControlID=”paTable” PopupPosition=”Bottom” OffsetX=”0″ OffsetY=”2″>
</ajax:HoverMenuExtender>
tdTable being, in my case, a TD table cell in a menu bar, and paTable the submenu that is meant to dropdown when hovering over the table cell.
As replacement, I found the Simple jQuery Dropdowns library on CSS-Tricks, and the sample looked similar to the solution I wanted to replace.
Adding the Simple Dropdowns was straight forward, as it consists only of a couple of Javascript lines and some CSS classes. Integration was easy and quickly done.
But then…
As I mentioned, the menu bar was defined as single-row HTML table, and the cells are fixed-width for all drop-down menus, except the one displaying a record identifier – this cell uses a table’s (built-in!) capability to expand so that the table extends over the defined width, no matter how many other fixed-width cells there are and how wide the browser window is.
So I added some display:table* styles like this
<ul class="dropdown" style="width: 99%; display:table"> <li style="display:table-cell; "> <a href="#">Menu 1</a> <ul class="sub_menu"> <li><a href="#">Command 1</a></li> <li><a href="#">Command 2</a></li> </ul> </li> <li style="display:table-cell; width: auto" > <a href="#">ID</a> <ul class="sub_menu"> <li><a href="#">Command 1</a></li> <li><a href="#">Command 2</a></li> </ul> </li> <li style="display:table-cell; "> <a href="#">Menu 2</a> <ul class="sub_menu"> <li><a href="#">Command 1</a></li> <li><a href="#">Command 2</a></li> </ul> </li> <li style="display:table-cell"> </li> </ul>
Chrome and IE9 displayed the menu as expected, but Firefox insisted on displaying the dropdown left-aligned below to <ul> table, no matter how I changed the individual styles and classes.
Fortunately I found this answer on SO that illustrated a solution that works for Firefox (and the other browsers!): add a <div style=”position:relative”> inside the <td>.
So now my menu bar looks like this:
<ul class="dropdown" style="width: 99%; display:table"> <li style="display:table-cell; " > <div style="position: relative"> <a href="#">Menu 1</a> <ul class="sub_menu"> <li><a href="#">Command 1</a></li> <li><a href="#">Command 2</a></li> </ul> </div> </li> <li style="display:table-cell; width: auto" > <div style="position: relative"> <a href="#">ID</a> <ul class="sub_menu"> <li><a href="#">Command 1</a></li> <li><a href="#">Command 2</a></li> </ul> </div> </li> <li style="display:table-cell; " > <div style="position: relative"> <a href="#">Menu 2</a> <ul class="sub_menu"> <li><a href="#">Command 1</a></li> <li><a href="#">Command 2</a></li> </ul> </div> </li> <li style="display:table-cell" class="command"> </li> </ul>