html - 为什么当 UL 单独出现在 TD 中时 IE 中的布局会发生变化,而有一个额外的空 DIV?

标签 html css internet-explorer semantic-markup css-tables

我正在将基于 css 的选项卡导航添加到仍在使用基于表格的布局的网站。当我将选项卡列表放在 td 中时,您会看到一个视觉“差距”。如果我在 td 中放置一个宽度为 100% 的空 div,那么我的选项卡列表会正确显示。 (它在 table 外面也能正常工作。)

为什么 div 使选项卡布局正确,是否有更好的方法使它们在不添加无内容 div 的情况下做到这一点?

这是我的测试用例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head><title>
    Strange gap
</title>
   <style type ="text/css" >
/* stolen from http://unraveled.com/publications/css_tabs/, then hacked to death */

ul.tabnav { /* general settings */
border-bottom: 1px solid #cbcbcd; /* set border COLOR as desired */
list-style-type: none;
padding: 3px 10px 3px 10px; /* THIRD number must change with respect to padding-top (X) below */
margin: 3px 0px 0px 0px; /* Right on top of the next row */
}

ul.tabnav li { /* do not change */
display: inline;
}

ul.tabnav li.current { /* settings for selected tab */
border-bottom: 1px solid #fff; /* set border color to page background color */
background-color: #fff; /* set background color to match above border color */
/* border: solid 1px red; */
}

ul.tabnav li.current a { /* settings for selected tab link */
background-color: #fff; /* set selected tab background color as desired */
color: #000; /* set selected tab link color as desired */
position: relative;
top: 1px;
padding-top: 4px; /* must change with respect to padding (X) above and below */
}

ul.tabnav li a { /* settings for all tab links */
padding: 3px 4px; /* set padding (tab size) as desired; FIRST number must change with respect to padding-top (X) above */
border: 1px solid #cbcbcd; /* set border COLOR as desired; usually matches border color specified in #tabnav */
background-color: #cbcbcd; /* set unselected tab background color as desired */
color: #666; /* set unselected tab link color as desired */
margin-right: 0px; /* set additional spacing between tabs as desired */
text-decoration: none;
border-bottom: none;
}

/* end css tabs */
    </style>         
    </head>
    <body>

            <table>
                <tr>
                    <td>
                    I'm making some tab navigation with css. I copied the code 
                    from <a href=" http://unraveled.com/publications/css_tabs/"> http://unraveled.com/publications/css_tabs/</a>,
                    and hacked it up. There's an odd behavior that I see on IE (v 7).
                    There's a gap below.

                    </td>
                </tr>
                <tr>
                <td>
                        <ul class="tabnav">
                            <li class="current"><a >Home</a></li>
                            <li ><a >Search</a></li>
                        </ul>
                </td>
                </tr>
                <tr>
                    <td>

                    No gap below this

                    </td>
                </tr>
                <tr>
                <td  >
                <div style="width: 100%"><!-- This div forces the menu to render properly in IE7. I don't know why --></div>
                        <ul class="tabnav">
                            <li class="current"><a >Home</a></li>
                            <li ><a>Search</a></li>
                        </ul>
                </td>
                </tr>
                <tr>
                    <td>

                    why? The difference is the presence of a div with style="width: 100%" on it in the second 
                    case. I don't know why this fixes the rendering; I'd like a better way to do it without adding an 
                    extra empty div. This page should be in standards mode (or at least non-quirks mode).

                    </td>
                </tr>
            </table>

            For comparison, it works fine outside of a table:

                        <ul class="tabnav">
                            <li class="current"><a >Home</a></li>
                            <li ><a >Search</a></li>
                        </ul>

    </body>
</html>

我现在将其交叉发布到我的博客:Bacon Driven Coding: Why does layout change in IE when UL is alone in a TD vs having an extra empty DIV? ,并附上屏幕截图,以便人们可以看到我在说什么。

截图如下:

Mind the Gap

最佳答案

差距是由 IE 使用列表的有趣方式造成的。自 ul标签只能包含 <li> s,IE 显然也认为列表项之间的空格不合适,并将其移到前面的列表项中,在您的情况下,在 <a> 之后.

这会导致所选选项卡的白色背景与 <ul> 重叠s 底部边框(由于其定位)。

在这个例子中,看起来最简单的解决方法就是简单地删除 ul.tabnav li.current 上的背景颜色。 .事实上,我认为您可以删除整个规则集,因为边框也没有任何作用。


如果这些都不能帮助您在实际站点上修复它,最后的办法可能是删除 <li> 之外的所有空白。标签。例如

<ul><li><a>Home</a></li><li>etc.</li></ul>

如果你想保留一些格式的外观,或者像这样:

   <ul><!--
   --><li><a>Home</a></li><!--
   --><li>etc.</li><!--
   --></ul>

但是空白也是所有选项卡之间的间距的原因,因此您必须添加右边距以将其恢复。

关于html - 为什么当 UL 单独出现在 TD 中时 IE 中的布局会发生变化,而有一个额外的空 DIV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1212860/

相关文章:

html - 我应该使用 ./或 index.html 作为 'home' 链接上的超链接引用吗?

javascript - 随机移动图像

css - 由于布局顺序,IE7 z-index 无法正常工作

html - 尽管 ie9 中有行数,但保持表高固定

c# - IE6 : window. onresize 在 IIS 上工作,在 asp.net 开发服务器上崩溃

jquery - 如何在 jQuery 中单击当前 li 获取下一个 ul 元素

javascript - 将 .html 附加到我的 href

javascript - 使用Javascript根据其他DIV(方法)设置相同的DIV高度

css - 如何对同一个 jquery 控件的多个实例设置不同的样式?

jQuery - IE 和 $(document).ready(function() {}) 上预期的对象;