Жидкие колонки HTML: 25% + 25% +25% +25%!= 100% в веб-наборе / опере
Я пытаюсь создать многостолбцовый макет, который будет адаптивным (плавный, эластичный, что бы вы ни хотели) и создал тестовый документ, чтобы опробовать эту идею.
Я сделал некоторые вычисления, чтобы придумать цифры, которые позволили бы x количеству столбцов поместиться на странице точно бок о бок. 2 было легко (50%), равно как 4 (25%) и 10 (10%). Если вы берете во внимание запас, чтобы оставить желоб и вычесть его, то вы получите ширину столбцов в процентах, которые вам нужны.
Казалось, что все идет хорошо, я создал CSS и HTML (см. Ниже) и опробовал их в Firefox, и все заработало нормально. Однако, когда я попробовал это в Opera, Chrome и Safari, я столкнулся с проблемой. Столбцы, похоже, не составляли до 100% общего количества, когда их размещали рядом друг с другом, казалось, что они немного упали. Чем больше столбцов, тем хуже становится проблема. По 10 колонкам проблема была крайне заметна.
Почему это происходит? Правильно ли поведение Firefox или что происходит в других браузерах? Что еще более важно, как мне обойти это, чтобы произвести последовательный результат во всех браузерах?
Я построил JSFiddle из приведенного ниже кода, который доступен здесь. Полная тестовая страница также доступна здесь. (JSfiddle - просто соответствующий код, тогда как на полной странице также были дополнительные материалы)
CSS для создания столбцов выглядит следующим образом:
.columnHolder {
overflow: hidden;
background: #EFE; /* For layout testing only! */
margin: .5em 0;
padding: 0;
}
.columnHolder h1 {
background: #EFF; /* For layout testing only! */
}
.column {
float: left;
margin: .5%;
background: #FFE; /* For layout testing only! */
text-align: justify;
}
.column.half {
width: 49%;
}
.column.third {
width: 32.33333%
}
.column.quarter {
width: 24%;
}
.column.fifth {
width: 19%;
}
.column.sixth {
width: 15.66666%;
}
.column.seventh {
width: 13.28571%;
}
.column.eighth {
width: 11.5%;
}
.column.ninth {
width: 10.11111%;
}
.column.tenth {
width: 9%;
}
Разметка (сокращенная версия), с которой я тестирую, выглядит следующим образом:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Gordian Solutions</title>
<link rel="stylesheet" href="./css/core.css" media="all" />
</head>
<body>
<article style="margin: 1em 10% 1em 10%;">
<section class="columnHolder">
<h1>2 Column Test</h1>
<div class="column half">
<p> Nulla hendrerit; <a href="#">nunc quis mollis</a> cursus; lectus libero viverra turpis, ut ornare arcu mauris eu ipsum. Curabitur et dolor dui, nec sagittis felis. Nam elit purus, eleifend nec pulvinar et, commodo id nisl. Curabitur pharetra, quam porttitor aliquam volutpat, nunc ipsum semper quam, non imperdiet libero risus non diam. Praesent et dui arcu. Praesent lorem lorem, malesuada sit amet egestas eget, lacinia sed velit. In congue sagittis ipsum, sed venenatis ligula vulputate vel? </p>
</div>
<div class="column half">
<p> Proin ornare, nisl et vestibulum dignissim, purus odio scelerisque massa, in mollis dolor neque nec massa. Vestibulum neque ipsum, sodales sit amet dapibus a, viverra sit amet est. Mauris odio mi, semper vel ultricies ac, hendrerit eget tortor. Quisque eu mi tellus, nec iaculis lectus. Duis pellentesque, ipsum nec molestie aliquet, lorem urna scelerisque risus, quis venenatis nibh dolor ac elit. Duis vitae nisi ante. <a href="#">Morbi dictum ornare</a> justo in fermentum. </p>
</div>
</section>
<section class="columnHolder">
<h1>4 Column Test</h1>
<div class="column quarter">
<p> Nulla hendrerit; <a href="#">nunc quis mollis</a> cursus; lectus libero viverra turpis, ut ornare arcu mauris eu ipsum. Curabitur et dolor dui, nec sagittis felis. Nam elit purus, eleifend nec pulvinar et, commodo id nisl. Curabitur pharetra, quam porttitor aliquam volutpat, nunc ipsum semper quam, non imperdiet libero risus non diam. Praesent et dui arcu. Praesent lorem lorem, malesuada sit amet egestas eget, lacinia sed velit. In congue sagittis ipsum, sed venenatis ligula vulputate vel? </p>
</div>
<div class="column quarter">
<p> Proin ornare, nisl et vestibulum dignissim, purus odio scelerisque massa, in mollis dolor neque nec massa. Vestibulum neque ipsum, sodales sit amet dapibus a, viverra sit amet est. Mauris odio mi, semper vel ultricies ac, hendrerit eget tortor. Quisque eu mi tellus, nec iaculis lectus. Duis pellentesque, ipsum nec molestie aliquet, lorem urna scelerisque risus, quis venenatis nibh dolor ac elit. Duis vitae nisi ante. <a href="#">Morbi dictum ornare</a> justo in fermentum. </p>
</div>
<div class="column quarter">
<p> Donec magna justo, semper nec pulvinar eu, faucibus eget neque. Nunc egestas porttitor orci, eget congue nisl rutrum in. Donec ut dignissim nunc. Sed a suscipit ante. Fusce in nunc id risus elementum molestie eget eget eros. Nunc eget dolor sit amet eros accumsan porta. Phasellus nibh ligula, ullamcorper sed adipiscing at, luctus ut justo. Mauris eleifend posuere laoreet. Integer odio leo, dapibus a pretium sit amet, ultricies id augue. Aliquam mollis ipsum id urna varius iaculis. Class aptent taciti sociosqu ad <a href="#">litora torquent per conubia</a> nostra, per inceptos himenaeos. Pellentesque leo arcu, rhoncus ut suscipit ut, posuere a sapien. Nullam a nisi nec nibh facilisis egestas dignissim quis magna. Nulla nec egestas elit. Nunc nibh est, porttitor at hendrerit a, iaculis vel est. Cras pulvinar dignissim neque, et ultrices massa tristique nec. </p>
</div>
<div class="column quarter">
<p> Nulla hendrerit; <a href="#">nunc quis mollis</a> cursus; lectus libero viverra turpis, ut ornare arcu mauris eu ipsum. Curabitur et dolor dui, nec sagittis felis. Nam elit purus, eleifend nec pulvinar et, commodo id nisl. Curabitur pharetra, quam porttitor aliquam volutpat, nunc ipsum semper quam, non imperdiet libero risus non diam. Praesent et dui arcu. Praesent lorem lorem, malesuada sit amet egestas eget, lacinia sed velit. In congue sagittis ipsum, sed venenatis ligula vulputate vel? </p>
</div>
</section>
<section class="columnHolder">
<h1>10 Column Test</h1>
<div class="column tenth">
<p> Nulla hendrerit; <a href="#">nunc quis mollis</a> cursus; lectus libero viverra turpis, ut ornare arcu mauris eu ipsum. Curabitur et dolor dui, nec sagittis felis. Nam elit purus, eleifend nec pulvinar et, commodo id nisl. Curabitur pharetra, quam porttitor aliquam volutpat, nunc ipsum semper quam, non imperdiet libero risus non diam. Praesent et dui arcu. Praesent lorem lorem, malesuada sit amet egestas eget, lacinia sed velit. In congue sagittis ipsum, sed venenatis ligula vulputate vel? </p>
</div>
<div class="column tenth">
<p> Proin ornare, nisl et vestibulum dignissim, purus odio scelerisque massa, in mollis dolor neque nec massa. Vestibulum neque ipsum, sodales sit amet dapibus a, viverra sit amet est. Mauris odio mi, semper vel ultricies ac, hendrerit eget tortor. Quisque eu mi tellus, nec iaculis lectus. Duis pellentesque, ipsum nec molestie aliquet, lorem urna scelerisque risus, quis venenatis nibh dolor ac elit. Duis vitae nisi ante. <a href="#">Morbi dictum ornare</a> justo in fermentum. </p>
</div>
<div class="column tenth">
<p> Donec magna justo, semper nec pulvinar eu, faucibus eget neque. Nunc egestas porttitor orci, eget congue nisl rutrum in. Donec ut dignissim nunc. Sed a suscipit ante. Fusce in nunc id risus elementum molestie eget eget eros. Nunc eget dolor sit amet eros accumsan porta. Phasellus nibh ligula, ullamcorper sed adipiscing at, luctus ut justo. Mauris eleifend posuere laoreet. Integer odio leo, dapibus a pretium sit amet, ultricies id augue. Aliquam mollis ipsum id urna varius iaculis. Class aptent taciti sociosqu ad <a href="#">litora torquent per conubia</a> nostra, per inceptos himenaeos. Pellentesque leo arcu, rhoncus ut suscipit ut, posuere a sapien. Nullam a nisi nec nibh facilisis egestas dignissim quis magna. Nulla nec egestas elit. Nunc nibh est, porttitor at hendrerit a, iaculis vel est. Cras pulvinar dignissim neque, et ultrices massa tristique nec. </p>
</div>
<div class="column tenth">
<p> Nulla hendrerit; <a href="#">nunc quis mollis</a> cursus; lectus libero viverra turpis, ut ornare arcu mauris eu ipsum. Curabitur et dolor dui, nec sagittis felis. Nam elit purus, eleifend nec pulvinar et, commodo id nisl. Curabitur pharetra, quam porttitor aliquam volutpat, nunc ipsum semper quam, non imperdiet libero risus non diam. Praesent et dui arcu. Praesent lorem lorem, malesuada sit amet egestas eget, lacinia sed velit. In congue sagittis ipsum, sed venenatis ligula vulputate vel? </p>
</div>
<div class="column tenth">
<p> Proin ornare, nisl et vestibulum dignissim, purus odio scelerisque massa, in mollis dolor neque nec massa. Vestibulum neque ipsum, sodales sit amet dapibus a, viverra sit amet est. Mauris odio mi, semper vel ultricies ac, hendrerit eget tortor. Quisque eu mi tellus, nec iaculis lectus. Duis pellentesque, ipsum nec molestie aliquet, lorem urna scelerisque risus, quis venenatis nibh dolor ac elit. Duis vitae nisi ante. <a href="#">Morbi dictum ornare</a> justo in fermentum. </p>
</div>
<div class="column tenth">
<p> Donec magna justo, semper nec pulvinar eu, faucibus eget neque. Nunc egestas porttitor orci, eget congue nisl rutrum in. Donec ut dignissim nunc. Sed a suscipit ante. Fusce in nunc id risus elementum molestie eget eget eros. Nunc eget dolor sit amet eros accumsan porta. Phasellus nibh ligula, ullamcorper sed adipiscing at, luctus ut justo. Mauris eleifend posuere laoreet. Integer odio leo, dapibus a pretium sit amet, ultricies id augue. Aliquam mollis ipsum id urna varius iaculis. Class aptent taciti sociosqu ad <a href="#">litora torquent per conubia</a> nostra, per inceptos himenaeos. Pellentesque leo arcu, rhoncus ut suscipit ut, posuere a sapien. Nullam a nisi nec nibh facilisis egestas dignissim quis magna. Nulla nec egestas elit. Nunc nibh est, porttitor at hendrerit a, iaculis vel est. Cras pulvinar dignissim neque, et ultrices massa tristique nec. </p>
</div>
<div class="column tenth">
<p> Nulla hendrerit; <a href="#">nunc quis mollis</a> cursus; lectus libero viverra turpis, ut ornare arcu mauris eu ipsum. Curabitur et dolor dui, nec sagittis felis. Nam elit purus, eleifend nec pulvinar et, commodo id nisl. Curabitur pharetra, quam porttitor aliquam volutpat, nunc ipsum semper quam, non imperdiet libero risus non diam. Praesent et dui arcu. Praesent lorem lorem, malesuada sit amet egestas eget, lacinia sed velit. In congue sagittis ipsum, sed venenatis ligula vulputate vel? </p>
</div>
<div class="column tenth">
<p> Proin ornare, nisl et vestibulum dignissim, purus odio scelerisque massa, in mollis dolor neque nec massa. Vestibulum neque ipsum, sodales sit amet dapibus a, viverra sit amet est. Mauris odio mi, semper vel ultricies ac, hendrerit eget tortor. Quisque eu mi tellus, nec iaculis lectus. Duis pellentesque, ipsum nec molestie aliquet, lorem urna scelerisque risus, quis venenatis nibh dolor ac elit. Duis vitae nisi ante. <a href="#">Morbi dictum ornare</a> justo in fermentum. </p>
</div>
<div class="column tenth">
<p> Donec magna justo, semper nec pulvinar eu, faucibus eget neque. Nunc egestas porttitor orci, eget congue nisl rutrum in. Donec ut dignissim nunc. Sed a suscipit ante. Fusce in nunc id risus elementum molestie eget eget eros. Nunc eget dolor sit amet eros accumsan porta. Phasellus nibh ligula, ullamcorper sed adipiscing at, luctus ut justo. Mauris eleifend posuere laoreet. Integer odio leo, dapibus a pretium sit amet, ultricies id augue. Aliquam mollis ipsum id urna varius iaculis. Class aptent taciti sociosqu ad <a href="#">litora torquent per conubia</a> nostra, per inceptos himenaeos. Pellentesque leo arcu, rhoncus ut suscipit ut, posuere a sapien. Nullam a nisi nec nibh facilisis egestas dignissim quis magna. Nulla nec egestas elit. Nunc nibh est, porttitor at hendrerit a, iaculis vel est. Cras pulvinar dignissim neque, et ultrices massa tristique nec. </p>
</div>
<div class="column tenth">
<p> Nulla hendrerit; <a href="#">nunc quis mollis</a> cursus; lectus libero viverra turpis, ut ornare arcu mauris eu ipsum. Curabitur et dolor dui, nec sagittis felis. Nam elit purus, eleifend nec pulvinar et, commodo id nisl. Curabitur pharetra, quam porttitor aliquam volutpat, nunc ipsum semper quam, non imperdiet libero risus non diam. Praesent et dui arcu. Praesent lorem lorem, malesuada sit amet egestas eget, lacinia sed velit. In congue sagittis ipsum, sed venenatis ligula vulputate vel? </p>
</div>
</section>
</article>
</body>
</html>
2 ответа
Проблема заключается в том, чтобы делать разницу между округлениями, когда вы начинаете использовать ширину в процентах - например, если исходный контейнер имеет размер 205 пикселей и у вас есть столбцы 4 x 25%, вы устанавливаете ширину каждого столбца 51,25 пикселя. Вы не можете иметь четверть пикселя, но то, как это обрабатывается, может варьироваться от браузера к браузеру - некоторые могут упасть на четверть пикселя в каждом случае; другие могут пометить 1px на последнем столбце.
Редактировать: прочитайте хорошую статью об этом давным-давно Джона Резига, который стоит прочитать. У него есть цитата из Дэвида Барона, разработчика Mozilla, которая хорошо подводит итоги:
- 4 смежных объекта шириной / высотой 25% (например), начиная с одного края контейнера, должны заканчиваться точно с другого края; в контейнере не должно быть лишних пикселей, и они никогда не должны быть обернуты из-за ширины пикселя
- объекты, которые являются логически смежными, всегда должны касаться визуально; из-за ошибки округления никогда не должно быть зазора в пикселях или пересечения пикселей
- объекты с одинаковой шириной должны занимать одинаковое количество пикселей
- границы объекта всегда (визуально) должны быть привязаны к определенной границе пикселя на дисплее (они никогда не должны быть размытыми)
В спецификации CSS нет реальной стандартизации того, как должны быть выполнены вышеуказанные 4 требования, поэтому браузеры по-разному компрометируют их.
Изменить: просто сказать также, как вы спросили, как можно наилучшим образом избежать этой проблемы - по возможности, сохраняйте элементы контейнера на ширине, равномерно делимой по столбцам. (Хотя это не всегда возможно с текучими макетами).
Обычно помогает опустить настройку ширины в одном или двух столбцах. Это позволяет браузеру самостоятельно рассчитывать их ширину.
Например, обзор результатов поиска на моем веб-сайте в настоящее время имеет макет с тремя столбцами, из которых только левый и правый столбцы имеют указанную ширину. Ширина среднего столбца (article#main) рассчитывается браузером:
http://www.omegajunior.net/found.html