Я нашел решение, которое кажется хорошим компромиссом. Это основано на том факте, что установка границы для <ul>
решает проблему, в то время как margin-bottom
элемента блочного уровня предыдущего брата, очевидно, вызывает его.
Таким образом, установка border-top: 1px solid transparent;
на <ul>
смещает его всего на один пиксель, что хорошо для меня. Как справедливо указывает BalusC в комментариях, установка margin-top: -1px;
будет противодействовать смещению.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Test</title>
<style type="text/css">
ul { padding: 0; margin: 0; border-top: 1px solid transparent; list-style-type: none; }
ul li { float: left; width: 140px; background-color: red; }
div { clear: left; background-color: red; }
</style>
</head>
<body>
<h1>Heading 1</h1>
<ul>
<li>bla 1</li><li>bla 2</li><li>bla 3</li>
</ul>
<div>yada</div>
</body>
</html>
Я признаю, что это тоже немного хакерства; для этого нужно помнить, для чего предназначена фиктивная граница, что не намного лучше обычных уловок CSS (но немного).
Предыдущая версия ответа: Я исправил это сейчас (похоже, он работает во всех браузерах и не требует взлома CSS)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Test</title>
<style type="text/css">
div.t ul { padding: 0; margin: 0; list-style-type: none; }
div.t ul li { float: left; width: 140px; background-color: red; }
div.c { background-color: red; }
</style>
</head>
<body>
<h1>Heading 1</h1>
<div class="t">
<ul>
<li>bla 1</li><li>bla 2</li><li>bla 3</li>
</ul>
<br style="clear: left;">
</div>
<div class="c">yada</div>
</body>
</html>
Мне не очень нравится это решение, потому что оно требует дополнительных элементов. Но мне еще больше не нравятся грязные трюки с CSS.