Я пытаюсь создать макет с различным количеством div, т.е.
| Large | Large |
|Small | Small | Small |
| Large | Large |
...
У больших div будет 50% ширины, а у меньших - 33%.
Как я могу это сделать? Я перемещаю div так, чтобы они располагались в ряд, но не уверен, как я могу получить три меньших div, ниже более крупных, при этом все еще гарантируя, что все находится в центре?
Текущий подход:
.case-card--large {
width: 50%;
float: right;
}
.case-card {
float: right;
text-align: center;
padding: 40px;
width: 33%;
border: 1px solid blue;
}<div class = "case-card case-card--large">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card case-card--large">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>Хотя я не понимаю, что вы имеете в виду под центрированием здесь для начала - 2 * 50% и 3 * 33% в любом случае всегда покрывают всю ширину (почти), так что именно вы хотите «центрировать» тогда…?
@CBroe 3 * 33% покрывает только 99% ширины .. Хотя вы упомянули это как почти, но просто для ясности: для достижения точной ширины оно должно составлять 33,33%. :)






Вы можете работать с техникой CSS: flex (Документы MDN).
Поместите эти элементы в родительский контейнер, установите его ширину и заставьте его вести себя как гибкий блок с помощью display: flex. Вот пример того, как я это сделал. Правила CSS ниже /* show case rules below */ используются для получения визуального результата того, что вы можете получить, используя гибкие блоки.
#cont {
display: flex;
flex-direction: row;
width: 600px;
flex-wrap: wrap;
justify-content: space-between;
}
.case-card {
width: 33%;
box-sizing: border-box;
/* show case rules below */
background-color: red;
border: 1px solid black;
}
.case-card--large {
width: 50%;
/* show case rules below */
background-color: yellow;
}<div id = "cont">
<div class = "case-card case-card--large">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card case-card--large">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card case-card--large">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card case-card--large">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
</div>edit: Сначала я использовал justify-content: space-around;, который немного выравнивает элементы с width: 33% посередине по отношению друг к другу. Изменение этого на justify-content: space-between; гарантирует, что внешние блоки выровнены по той же границе, что и контейнер, что может больше понравиться OP. Кредиты для Д.Шаллера
Я бы посоветовал justify-content:space-between
@ D.Schaller: да, это дает лучший результат. Это зависит от конечного результата, но я думаю, что ОП был бы более доволен этим. Отредактировал пост.
У меня есть небольшой фрагмент с похожим подходом, возможно, вы захотите отредактировать его в своем ответе в качестве альтернативы. автоматическое изменение размера для подразделов в flexbox. Что я там сделал: я использовал subdivs под названием «row», чтобы обернуть элементы в каждой строке. Затем я сделал их гибкими и сказал всем дочерним элементам "row" иметь одинаковую ширину, так что ширина меняется в зависимости от количества элементов, поэтому ему не придется изменять размер, если он будет использовать 4-5 случаев на строку.
Вот мое решение.
Я использовал display:inline-block для каждой коробки
* {
box-sizing: border-box;
}
.container {
font-size: 0; /* to remove space betwen inline elements*/
}
.wrapper {
font-size: initial;
}
.case-card {
text-align: center;
padding: 40px;
width: calc(100% / 3);
border: 1px solid blue;
display: inline-block;
}
.case-card--large {
width: 50%;
}<div class = "container">
<div class = "case-card case-card--large">
<div class = "wrapper">
<p>Dummy text Large</p>
</div>
</div>
<div class = "case-card case-card--large">
<div class = "wrapper">
<p>Dummy text Large</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card case-card--large">
<div class = "wrapper">
<p>Dummy text Large</p>
</div>
</div>
<div class = "case-card case-card--large">
<div class = "wrapper">
<p>Dummy text Large</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
</div>Вам нужно включить box-sizing: border-box, потому что вы используете заполнение, или указать ширину как width: calc (33% - 80px), а также создать класс .large как подкласс или иначе, в вашем случае, поставить! Important, потому что теперь не не работает и все шириной 33%
body{
text-align:center;
}
.case-card {
box-sizing: border-box;
display:inline-block;
text-align: center;
padding: 40px;
width: 33.33%;
border: 1px solid blue;
margin: 0 -2px;
}
.case-card.large{
width: 50%;
}<div class = "case-card large">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card large">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>Хорошо .. Итак, я немного изменил код, и он работает вполне нормально. Надеюсь, это поможет вам.
Вместо float:right использовал
float:left
и добавлена граница в класс-оболочку.
https://codepen.io/anon/pen/oMWMBE
.case-card--large {
width: 50%;
float: left;
text-align: center;
}
.wrapper { border: 1px solid blue; }
.case-card {
float: left;
text-align: center;
width: 33.33%;
}
<div class = "case-card--large">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card--large">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
<div class = "case-card">
<div class = "wrapper">
<p>Dummy text</p>
</div>
</div>
Если вы хотите центрировать объект, то лучше не перемещать его с самого начала ...