CSS - неточность расчета
У меня есть ul
стихия и 5 детей <li>
,
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<ul>
имеет display: flex
имущество. Я пытался использовать свойство calc на <li>
чтобы равномерно определить размер моего списка элементов:
calc:(100% / 5);
Это дает желаемый результат и равномерно измеряет 5 <li>
блоки
Теперь я добавил границы с правой стороны всех, но последний ребенок <li>
элемент. Таким образом, я уменьшил общую ширину всех границ вместе с общей шириной <ul>
,
calc:((100% - 8px) / 5);
Это также работало правильно и равномерно <li>
блоки с границами.
ul {
width: 600px;
height: 300px;
margin: 0;
padding: 0;
display: flex;
background: red;
}
li {
list-style: none;
display: block;
width: calc((100% - 0.8px) / 5);
height: 100%;
border-right: 0.2px solid black;
background: blue;
}
li:last-child {
border-right: none;
}
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
Теперь я попытался установить ширину границы в окне просмотра vw
вместо px, но это дает другой результат.
ul {
width: 600px;
height: 300px;
margin: 0;
padding: 0;
display: flex;
background: red;
}
li {
list-style: none;
display: block;
width: calc((100% - 0.8vw) / 5);
height: 100%;
border-right: 0.2vw solid black;
background: blue;
}
li:last-child {
border-right: none;
}
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
Как видно из фрагмента выше, справа немного места. Это становится больше с более широким окном просмотра (попробуйте просмотреть полную страницу фрагмента). Поэтому я думаю, что проблема заключается в vw
единицы и flexbox здесь.
Так в чем же причина этой ошибки?
РЕДАКТИРОВАТЬ:
Из предоставленных ответов и комментариев я увидел, что есть другие и более правильные подходы для достижения того, что я пытался сделать. Я ценю эти ответы, но это не ответы на мой вопрос. поскольку calc
показывает ошибку в этом случае, скорее всего, это вызовет больше проблем, когда я пытаюсь использовать calc
и единицы просмотра окна в других случаях (не только границы). Поэтому мне нужно знать причину и calc
"исправить.
3 ответа
Вам не нужно делать calc, чтобы добавить внутренний контент для вашего li. Если вы даете box-sizing: border-box;
опора, бордюр и отступы не заставят контейнер расти.
ul {
width: 600px;
height: 300px;
margin: 0;
padding: 0;
display: flex;
background: red;
}
li {
list-style: none;
display: block;
width: calc(100% / 5);
height: 100%;
border-right: 2px solid black;
background: blue;
box-sizing: border-box;
}
li:last-child {
border-right: none;
}
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
Pixels (px): абсолютные пиксели. Так, например, 20 пикселей будет буквально 20 пикселей на любом экране. Если монитор имеет размер 1980x1200 и вы установили высоту элемента в 200 пикселей, из этого элемента будет получено 200 пикселей.
Высота / ширина области просмотра (vw/vh): Размер относительно области просмотра (в основном браузер windoe).
1px = (100 / document.documentElement.clientWidth) vw 1px = (100/500) = 0.2vw
Кажется, вы используете flex
раздать свой li
внутри твоего ul
, В этом случае вам не нужно calc
увеличьте ширину, чтобы сделать их равными. Что это flex
должен делать.
Смотрите этот пример:
* { box-sizing: border-box; margin: 0; padding: 0; }
ul, li { list-style: none; }
ul { width: 600px; height: 300px; background: red; display: flex; }
li {
flex: 1 0 auto;
border-right: 0.8vw solid black;
background: blue;
}
li:last-child { border-right: none; }
<ul>
<li></li><li></li><li></li><li></li><li></li>
</ul>
При указании flex
dsiplay на контейнерах, вам просто нужно применить flex
собственность на детей, чтобы заставить их вести себя как гибкие предметы. В вашем конкретном случае использования вам необходимо следующее:
flex-grow
: установите в 1. Это позволит вашемуli
расти, чтобы заполнить весьul
ширина.flex-shrink
: установите в 0. Вы не хотите, чтобы вашli
сокращаться.flex-basis
: установлен вauto
, Вы хотите, чтобы вашli
расти до выровненной ширины автоматически.
Итак, вы видите, вам не нужно calc
совсем.
Вам также не нужно специально применять display: block
на ваш li
s. Согласно спецификации здесь: https://www.w3.org/TR/css-flexbox-1/
Отображаемое значение гибкого элемента блокируется: если заданное отображение дочернего элемента в потоке элемента, генерирующего гибкий контейнер, является значением встроенного уровня, оно вычисляется до его эквивалента на уровне блока
Как отметил @BoltClock в комментариях, элемент списка уже заблокирован.
Границы
Теперь подходит к границам. В первом примере вы указали ширину в 0.2px
Блок. Это не имеет никакого смысла. Хотя спецификации допускают дробные пиксели, он округляет его до ближайшего пикселя, доступного на дисплее, который обычно равен 1.
Во втором примере вы хотите, чтобы границы масштабировались с областью просмотра. Это хорошо. Нет проблем с 0.8vw
,
Просто посмотрите на пример, который я разместил в этой скрипке. Измените размер окна результатов, и вы увидите, что границы изменяются относительно размера области просмотра.
Наконец, вы можете или не можете установить box-sizing
, Это зависит от вашего макета. Что бы вы ни использовали, вы используете это последовательно.