위아래 이미지와 텍스트로 메뉴 시스템을 만들려고합니다. 데이터는 동적입니다. 메뉴 시스템을 표시하여 각 이미지가 서로 다른 이미지와 동일한 거리를 유지하여 이미지가 가로 및 세로로 격자 모양으로 정렬되도록하고 싶습니다.
문제는 텍스트입니다. 텍스트가 이미지보다 길면 div가 확대됩니다. 그러나 이미지가 더 이상 서로 간격을 두지 않기 때문에 어색한 간격이 생깁니다.
이 문제를 해결하려면 가장 좋은 방법은 다른 div 각각이 더 큰 div의 크기를 채택하는 것입니다. 그러나이 작업을 수행하는 방법을 잘 모르겠습니다.
flex-wrap
속성을 사용하여 flexbox로 시도 했습니다. 멋지게 포장하는 동안 각 이미지를 서로 같은 거리에 배치하는 방법을 찾을 수 없었습니다.
이것을 달성하려면 어떻게해야합니까?
내 코드는 다음과 같습니다.
#outer {
display: flex;
}
#main {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
border: solid black 25px;
border-radius: 25px;
width: 450px;
height: 500px;
padding: 20px;
}
.section {
background-color: #ddd;
padding: 15px;
}
.label, .icon {
text-align: center;
}
<div id="outer">
<div id="main">
<div class="section">
<div class="label">Label 1AAAAAAAAAAA</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 1B</div>
</div>
<div class="section">
<div class="label">Label 2A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 2B</div>
</div>
<div class="section">
<div class="label">Label 3A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 3B</div>
</div>
<div class="section">
<div class="label">Label 4A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 4B</div>
</div>
<div class="section">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
</div>
추신. 또한 섹션 div의 높이가 왜 증가하는지 잘 모르겠습니다. 따라서 이것에 대한 통찰력도 감사하겠습니다.
답변
모든 요소가 가장 큰 요소만큼 커지도록 만들 수 있는지 확실하지 않지만 모든 행에서 특정 수의 요소를 원한다고 가정 할 수 있다면 크기를 동일하게 만드십시오. flexbox 대신 CSS 그리드로 훨씬 쉽게 수행 할 수 있다고 생각합니다. 아래 솔루션을 참조하십시오. 그리드를 사용하여 섹션 요소 를 배치하고 각 섹션 안에 세 부분 (상단 텍스트, 이미지, 하단 텍스트)이 각각 div의 1/3을 차지하는지 확인하십시오. 이는 모든 이미지가 수직으로 정렬되도록하는 것입니다 . 또한 레이블 에 flex를 사용 하여 텍스트가 중간 (가로 및 세로)에 있는지 확인합니다.
#outer {
}
#main {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: auto;
border: solid black 25px;
border-radius: 25px;
width: 450px;
height: 500px;
padding: 20px;
}
.section {
display: grid;
grid-template-columns: 100%;
grid-template-rows: 1fr 1fr 1fr;
background-color: #ddd;
padding: 5px;
margin: 5px;
min-width: 80px;
vertical-align: center;
}
.label, .icon {
display: flex;
justify-content: center;
align-items: center;
vertical-align: middle;
text-align: center;
}
<div id="outer">
<div id="main">
<div class="section">
<div class="label">Label 1AAAAAAAAAAA</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 1B</div>
</div>
<div class="section">
<div class="label">Label 2A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 2B</div>
</div>
<div class="section">
<div class="label">Label 3A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 3B</div>
</div>
<div class="section">
<div class="label">Label 4A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 4B</div>
</div>
<div class="section">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
</div>
답변
이 빠른 코드 펜을 돌리십시오. 없는 것은 그것이 내가 바꿀 것 모두가되는 행의 3 열을 맞지 않을 때 행동하는 방법에 대한 미디어 쿼리입니다 max-width
속성으로 50% - individual item padding left and right - how much space you want between
변경flex: 1 33%
에flex: 1 55%
(당신은 같은 박스 크기 속성과 그것의 폭이 폭 있도록 작품을 크기 조정 당신의 상자가 패딩을 포함하는 방법을 변경하는 경우는 패딩 값을 건너 뛸 수 있습니다 이 )
https://codepen.io/mihaelnikic/pen/bGGPBYG
<div class="container">
<div class="item">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
<div class="item">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
<div class="item">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
<div class="item">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
<div class="item">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
<div class="item">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
CSS :
.container {
display: flex;
flex-flow: row wrap;
width: 100%;
justify-content: space-between;
}
.item {
min-height: 200px;
background: coral;
border: 1px solid black;
flex: 1 33%;
max-width: calc(33% - 20px - (15px * 2) / 3);
min-width: 200px;
margin-bottom: 15px;
display: flex;
flex-flow: column nowrap;
align-items: center;
justify-content: center;
padding: 10px;
}
답변
이것이 도움이되기를 바랍니다.
CSS
#outer {
display: flex;
}
#main {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
border: solid black 25px;
border-radius: 25px;
width: 450px;
height: 500px;
padding: 20px;
}
.section {
/* background-color: #ddd; */
padding: 10px;
flex-grow: 1;
box-sizing: border-box;
min-width: 50%;
}
.innerSection{
background-color: #ddd;
padding: 15px;
}
.label, .icon {
text-align: center;
}
<div id="outer">
<div id="main">
<div class="section">
<div class="innerSection">
<div class="label">Label 1AAAAAAAAAAA</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 1B</div>
</div>
</div>
<div class="section">
<div class="innerSection">
<div class="label">Label 2A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 2B</div>
</div>
</div>
<div class="section">
<div class="innerSection">
<div class="label">Label 3A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 3B</div>
</div>
</div>
<div class="section">
<div class="innerSection">
<div class="label">Label 4A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 4B</div>
</div>
</div>
<div class="section">
<div class="innerSection">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
</div>
</div>
#outer {
display: flex;
}
#main {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
border: solid black 25px;
border-radius: 25px;
width: 450px;
height: 500px;
padding: 20px;
}
.section {
/* background-color: #ddd; */
padding: 10px;
min-width:50%;
box-sizing: border-box;
}
.innerSection{
background-color: #ddd;
padding: 15px;
}
.label, .icon {
text-align: center;
}
HTML
<div id="outer">
<div id="main">
<div class="section">
<div class="innerSection">
<div class="label">Label 1AAAAAAAAAAA</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 1B</div>
</div>
</div>
<div class="section">
<div class="innerSection">
<div class="label">Label 2A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 2B</div>
</div>
</div>
<div class="section">
<div class="innerSection">
<div class="label">Label 3A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 3B</div>
</div>
</div>
<div class="section">
<div class="innerSection">
<div class="label">Label 4A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 4B</div>
</div>
</div>
<div class="section">
<div class="innerSection">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
</div>
</div>
답변
라벨 컨테이너에 너비와 단어 구분을 추가하고 그에 따라 너비를 조정할 수 있습니다
#outer {
display: flex;
}
#main {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
border: solid black 25px;
border-radius: 25px;
width: 450px;
height: 500px;
padding: 20px;
}
.section {
background-color: #ddd;
padding: 15px;
}
.label {
width: 100px;
height: 100px;
overflow-y: auto;
word-break: break-all;
margin-bottom: 10px;
}
.label, .icon {
text-align: center;
}
<div id="outer">
<div id="main">
<div class="section">
<div class="label">Label 1AAAAAAAAAAA</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 1B</div>
</div>
<div class="section">
<div class="label">Label 2A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 2B</div>
</div>
<div class="section">
<div class="label">Label 3A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 3B</div>
</div>
<div class="section">
<div class="label">Label 4A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 4B</div>
</div>
<div class="section">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
</div>
답변
문제를 올바르게 이해하고 있다면 첫 번째 줄이 감겨지면 두 번째 줄에있는 이상한 차이가 사라집니다. 그건 당신이 해결하려는 모든 있다면, 아마도 당신이해야 할 모든 변화는 justify-content
에서 space-between
에 flex-start
여백이 추가로 .section
요소와의 패딩 #main
조정이 일치 할 수 있습니다. 이제 모든 이미지 사이의 간격이 20 픽셀이됩니다.
#outer {
display: flex;
}
#main {
display: flex;
justify-content: center;
flex-wrap: wrap;
border: solid black 25px;
border-radius: 25px;
width: 450px;
height: 500px;
padding: 10px;
}
.section {
background-color: #ddd;
padding: 15px;
margin: 10px;
}
.label, .icon {
text-align: center;
}
<div id="outer">
<div id="main">
<div class="section">
<div class="label">Label 1AAAAAAAAAAA</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 1B</div>
</div>
<div class="section">
<div class="label">Label 2A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 2B</div>
</div>
<div class="section">
<div class="label">Label 3A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 3B</div>
</div>
<div class="section">
<div class="label">Label 4A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 4B</div>
</div>
<div class="section">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
</div>
그 모습이, 다른 시도 할 수있는 방법이 마음에 들지 않으면 justify-content
값이 좋아 flex-start
, flex-end
, space-around
, space-evenly
.
다른 방법으로는 제거 할 수 justify-content
및 사용 flex-grow
각을 확장하기 위해 .section
주변 환경에 맞게.
#outer {
display: flex;
}
#main {
display: flex;
flex-wrap: wrap;
border: solid black 25px;
border-radius: 25px;
width: 450px;
height: 500px;
padding: 10px;
}
.section {
background-color: #ddd;
padding: 15px;
margin: 10px;
flex-grow: 1;
}
.label, .icon {
text-align: center;
}
<div id="outer">
<div id="main">
<div class="section">
<div class="label">Label 1AAAAAAAAAAA</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 1B</div>
</div>
<div class="section">
<div class="label">Label 2A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 2B</div>
</div>
<div class="section">
<div class="label">Label 3A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 3B</div>
</div>
<div class="section">
<div class="label">Label 4A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 4B</div>
</div>
<div class="section">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
</div>
또는 각 .section
요소의 내용 에 맞게 확장하면서 거터를 정렬하려는 경우display: table
대신 .
여기서 단점은 HTML을 행으로 분할해야한다는 것입니다.
#outer {
display: flex;
}
#main {
display: table;
flex-wrap: wrap;
border: solid black 25px;
border-radius: 25px;
width: 450px;
height: 500px;
border-collapse: separate;
border-spacing: 20px;
}
.row {
display: table-row;
}
.section {
display: table-cell;
background-color: #ddd;
padding: 15px;
}
.label, .icon {
text-align: center;
}
<div id="outer">
<div id="main">
<div class="row">
<div class="section">
<div class="label">Label 1AAAAAAAAAAA</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 1B</div>
</div>
<div class="section">
<div class="label">Label 2A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 2B</div>
</div>
<div class="section">
<div class="label">Label 3A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 3B</div>
</div>
</div>
<div class="row">
<div class="section">
<div class="label">Label 4A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 4B</div>
</div>
<div class="section">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
</div>
</div>
대신 모든 .section
요소를 가장 큰 .section
요소 와 동일하게 확장하려면
CSS의 형제 요소는 서로에 대해 많이 알지 못하므로 JavaScript를 사용해야 할 가능성이 높습니다.
페이지에 다음 JavaScript를 추가하고 CSS를 이와 같이 조정할 수 있습니다.
function expandSectionsToLargest() {
// Grab all of the elements with "section" class names
var sectionElements = document.getElementsByClassName('section');
// Find the largest width among our section elements
var largestWidth = -Infinity;
Array.prototype.forEach.call(sectionElements, section => {
if (section.offsetWidth > largestWidth) {
largestWidth = section.offsetWidth;
}
});
// Set all of the sections to at least equal the largest width
Array.prototype.forEach.call(sectionElements, section => {
section.style.minWidth = largestWidth + 'px';
});
}
// Expand the section widths now (must be called after the section elements are loaded)
expandSectionsToLargest();
#outer {
display: block;
}
#main {
display: block;
border: solid black 25px;
border-radius: 25px;
width: 450px;
height: 500px;
padding: 10px;
}
.section {
background-color: #ddd;
box-sizing: border-box; /* Important to make the element's CSS width coincide with JavaScript's offsetWidth value */
padding: 15px;
margin: 10px;
float: left;
}
.label, .icon {
text-align: center;
}
<div id="outer">
<div id="main">
<div class="section">
<div class="label">Label 1AAAAAAAAAAA</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 1B</div>
</div>
<div class="section">
<div class="label">Label 2A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 2B</div>
</div>
<div class="section">
<div class="label">Label 3A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 3B</div>
</div>
<div class="section">
<div class="label">Label 4A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 4B</div>
</div>
<div class="section">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
</div>
답변
CSS Grid도 제안합니다.
너비를 서로 동일하게 공유하는 3 개의 열과 2 개의 행을 지정하고 섹션 사이에 간격을 표시하기 위해 작은 여백을 갖도록 섹션에 지시합니다.
.section {
background-color: #ddd;
padding: 15px;
margin: 10px;
}
.label, .icon {
text-align: center;
}
#main {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 1fr);
}
<div id="outer">
<div id="main">
<div class="section">
<div class="label">Label 1AAAAAAAAAAA</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 1B</div>
</div>
<div class="section">
<div class="label">Label 2A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 2B</div>
</div>
<div class="section">
<div class="label">Label 3A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 3B</div>
</div>
<div class="section">
<div class="label">Label 4A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 4B</div>
</div>
<div class="section">
<div class="label">Label 5A</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">Label 5B</div>
</div>
</div>
</div>
답변
이러한 모든 기준을 갖춘 순수한 CSS 솔루션은 불가능하지만 CSS 그리드와 결합 된 JS 솔루션은 가능하다고 생각합니다.
요소가 텍스트에 동적으로 적응하고 다른 모든 요소로 변경되는 세트가 가능한 순수 CSS 솔루션은 불가능합니다. 텍스트에 맞게 요소의 너비를 동적으로 설정할 수 있지만 같은 클래스를 가진 다른 모든 요소의 너비를 최소로 설정할 수는 없습니다.
let textClass = document.getElementsByClassName("text");
let texts = Array.from(textClass);
var widths = [];
texts.forEach(function(item){
widths.push(item.offsetWidth)
});
let maxWidth = Math.max.apply(Math, widths) + 20; // change the 20 to adjust padding
let root = document.documentElement;
root.style.setProperty('--card-min-width', maxWidth + "px");
:root {
--card-min-width: 0px;
}
#outer {
min-width: 350px; /*this just needs a minimal value*/
min-height: 200px; /*this just needs a minimal value*/
}
#main {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(var(--card-min-width), 1fr));
grid-template-rows: auto;
grid-gap: 0.5rem; /*padding between elements*/
padding: 0.5rem; /*outer padding*/
/*
border: solid black 25px;
border-radius: 25px; <--- black border
*/
}
.section {
display: grid;
grid-template-columns: 100%;
grid-template-rows: 1fr 1fr 1fr;
background-color: #ddd;
padding: 5px;
margin: 5px;
min-width: 80px;
vertical-align: center;
}
.label, .icon {
display: flex;
justify-content: center;
align-items: center;
vertical-align: middle;
text-align: center;
}
<div id="outer">
<div id="main">
<div class="section">
<div class="label">
<p class="text">
Label 1AAAAAAAAAAAdsadasdasd
</p>
</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">
<p class="text">
Label 1B
</p>
</div>
</div>
<div class="section">
<div id="x" class="label">
<p class="text">
Label 2A
</p>
</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">
<p class="text">
Label 2B
</p>
</div>
</div>
<div class="section">
<div class="label">
<p class="text">
Label 3A
</p>
</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">
<p class="text">
Label 3B
</p>
</div>
</div>
<div class="section">
<div class="label">
<p class="text">
Label 4A
</p>
</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">
<p class="text">
Label 4B
</p>
</div>
</div>
<div class="section">
<div class="label">
<p class="text">
Label 5A
</p>
</div>
<div class="icon"><img src="https://via.placeholder.com/75"></div>
<div class="label">
<p class="text">
Label 5B
</p>
</div>
</div>
</div>
</div>
