Tạo div có kích thước bằng nhau


17

Tôi đang cố gắng tạo ra một hệ thống menu với một hình ảnh và văn bản ở trên và dưới. Dữ liệu là động. Tôi muốn hệ thống menu xuất hiện sao cho mỗi hình ảnh có khoảng cách bằng nhau với hình ảnh khác nhau để chúng xếp thành một hàng lưới hình ảnh theo chiều ngang và chiều dọc.

Vấn đề là văn bản. Nếu văn bản dài hơn hình ảnh, thì div sẽ được phóng to. Tuy nhiên, sau đó nó tạo ra một khoảng cách nhìn vụng về vì các hình ảnh không còn cách đều nhau.

Để giải quyết vấn đề này, tôi nghĩ cách tiếp cận tốt nhất là để mỗi div khác sử dụng kích thước của div lớn hơn. Tuy nhiên, tôi không chắc chắn làm thế nào để làm điều này.

Tôi đã thử với flexbox bằng cách sử dụng flex-wraptài sản. Trong khi nó được gói gọn gàng, tôi không thể tìm ra cách để mỗi hình ảnh xếp thành khoảng cách bằng nhau với nhau.

Làm thế nào để tôi đạt được điều này?

Mã của tôi là như sau:

#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>

Tái bút Tôi cũng không chắc tại sao divs phần của tôi lại tăng chiều cao. Vì vậy, bất kỳ cái nhìn sâu sắc về điều này cũng sẽ được đánh giá cao.


2
Tôi nghĩ Grid là những gì bạn đang tìm kiếm.
Siraj Alam

1
Lý do các mặt hàng có được một chiều cao tăng lên là align-itemsđược thiết lập để stretchtheo mặc định. Bạn có thể dễ dàng thay đổi điều đó:align-items: flex-start;
Artur Noetzel

Chiều rộng #main hiện tại của bạn là 450px. Nếu nội dung động của bạn cho phần của bạn là, ví dụ; 350px, tất cả họ sẽ tạo thành một hàng mới? Đó là điều bạn muốn?
Gosi

@Gosi, vâng, đó là những gì tôi muốn.
kojow7

bạn có thể sử dụng bootstrap 4 lớp. Bạn đã thử chưa?
Revti Shah

Câu trả lời:


6

Không chắc chắn nếu bạn có thể làm cho nó để mọi phần tử phát triển lớn như phần tử lớn nhất, nhưng nếu bạn có thể giả sử rằng bạn muốn có một số phần tử cụ thể trong mỗi hàng, thì chỉ cần làm cho chúng có kích thước bằng nhau. Tôi nghĩ rằng điều này được thực hiện dễ dàng hơn nhiều với lưới css thay vì flexbox. Xem giải pháp dưới đây. Tôi sử dụng lưới để định vị các thành phần của phần cũng như để đảm bảo rằng bên trong mỗi phần có cả ba phần (văn bản trên cùng, hình ảnh, văn bản dưới cùng) chiếm chính xác 1/3 mỗi div - điều này là để đảm bảo tất cả các hình ảnh cũng được sắp xếp theo chiều dọc . Ngoài ra, tôi sử dụng flex trong nhãn để đảm bảo các văn bản ở giữa (theo chiều ngang và chiều dọc).

#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>


Điều này sẽ không hoạt động vì các yếu tố được cố định về kích thước. Ví dụ: nếu tôi đặt Nhãn 1AAAAAAAAAAAAAAAAAAAAAAAAAAA thì phần tử không thay đổi kích thước để phù hợp với văn bản.
kojow7

này nó sẽ làm việc Tôi sẽ cập nhật trong mã của mình. Xin vui lòng kiểm tra xem nó.
Revti Shah

@ kojow7 bạn có thể đặt tên dài trong nhãn. Hy vọng chúng tôi thực hiện anwser của bạn.
Revti Shah

3

Cung cấp cho codepen nhanh chóng này một spin. Một điều còn thiếu là truy vấn phương tiện về cách ứng xử khi không thể phù hợp với 3 cột liên tiếp mà tất cả những gì tôi sẽ thay đổi là thuộc max-widthtính 50% - individual item padding left and right - how much space you want betweenvà thay đổi flex: 1 33%thànhflex: 1 55%

(Bạn có thể bỏ qua giá trị đệm nếu bạn thay đổi cách kích thước hộp của bạn hoạt động sao cho chiều rộng bao gồm đệm theo chiều rộng của nó với thuộc tính kích thước hộp như thế này )

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;

}

Tôi đoán tôi muốn điều này phù hợp với càng nhiều yếu tố liên tiếp càng tốt. Điều này có thể không dễ thực hiện với các truy vấn phương tiện vì bạn sẽ cần thực hiện nó cho mọi kích thước màn hình có thể với mọi kích thước div có thể.
kojow7

3

Hy vọng điều này có thể giúp cho bạn.

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>

chỉ xem mã đoạn trích, đoạn mã bên dưới không được cập nhật
Fahim Khan

@ kojow7 bạn thấy câu trả lời của tôi không?
Fahim Khan

@Revti Shah Nếu nhãn hộp thứ hai có tên dài thì nó sẽ trông giống như hộp thứ nhất
Fahim Khan

hãy hỏi anh ấy / cô ấy về hình ảnh rõ ràng những gì cô ấy muốn. Bởi vì cô ấy / anh ấy không muốn 100% chiều rộng của hộp.
Revti Shah

0

Bạn có thể thử thêm chiều rộng và ngắt từ vào hộp chứa nhãn và điều chỉnh độ rộng cho phù hợp

#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>


Phá vỡ một nửa là không thể chấp nhận được. Thay vào đó tôi muốn các div khác có được kích thước tương đương với div lớn hơn.
kojow7

Chắc chắn rồi! Chúng ta có thể sử dụng javascript để đạt được điều này?
mất_in_magento

Tôi thích CSS thuần túy, nhưng nếu không thể, JavaScript (không phải jQuery) sẽ được chấp nhận.
kojow7

Đây là câu trả lời hay nhất mà không cần javascript
David Machado

0

Nếu tôi hiểu chính xác vấn đề của bạn, khoảng trống kỳ lạ mà bạn muốn loại bỏ là khoảng trống trên hàng thứ hai sau khi hàng đầu tiên của bạn kết thúc. Nếu đó là tất cả những gì bạn đang cố gắng giải quyết, thì có lẽ tất cả những gì bạn cần làm là thay đổijustify-content từ space-betweensang flex-startmột lề được thêm vào các .sectionyếu tố của bạn và phần đệm trong #mainđiều chỉnh của bạn để phù hợp. Khoảng cách bây giờ sẽ là 20px giữa tất cả các hình ảnh.

#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>

Nếu bạn không thích làm thế nào mà ngoại hình, bạn có thể thử khác justify-contentgiá trị thích flex-start, flex-end, space-around, space-evenly.


Ngoài ra, bạn có thể thoát khỏi justify-contentvà sử dụngflex-grow để mở rộng từng cái .sectionđể phù hợp với môi trường xung quanh.

#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>


Ngoài ra, nếu bạn muốn máng xối của họ xếp hàng trong khi vẫn mở rộng để phù hợp với .sectionnội dung của từng yếu tố, bạn có thể thử sử dụng display: tablethay thế.

Nhược điểm ở đây là bạn cần chia HTML thành các hàng.

#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>


Thay vào đó, nếu bạn thực sự muốn tất cả các .sectionyếu tố mở rộng bằng với .sectionyếu tố lớn nhất ,

rất có thể bạn sẽ cần sử dụng JavaScript vì các phần tử anh chị em trong CSS không biết nhiều về nhau.

Bạn có thể thêm JavaScript sau vào trang của mình và điều chỉnh CSS như sau:

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>


Vâng, cuối cùng là những gì tôi đang tìm kiếm. Vấn đề duy nhất với nó là lề bên phải quá lớn. Sẽ thật tuyệt nếu có khoảng cách khoảng cách bằng nhau giữa tất cả các đối tượng và lề trái / phải.
kojow7

Bạn có thể kiểm tra câu trả lời của tôi @ kojow7
David Machado

0

Tôi cũng đề nghị CSS Grid.

Bạn chỉ định 3 cột và 2 hàng chia sẻ chiều rộng bằng nhau và nói với các phần có lề nhỏ để hiển thị các khoảng trống giữa:

.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>


Vấn đề là các phần là động, bạn có thể phù hợp ít hơn hoặc nhiều hơn trên một hàng để đặt nó thành 3 cột và 2 hàng sẽ không hoạt động.
kojow7

0

Tôi nghĩ rằng một giải pháp CSS thuần túy với tất cả các tiêu chí đó là không thể nhưng một giải pháp JS kết hợp với CSS Grid là có thể.

Một giải pháp CSS thuần túy trong đó phần tử tự động thích ứng với văn bản và thiết lập thay đổi cho tất cả các phần tử khác là không thể. Chúng tôi có thể tự động đặt độ rộng của phần tử để thích ứng với văn bản nhưng chúng tôi không thể biến độ rộng đó thành tối thiểu cho tất cả các phần tử khác có cùng lớp.

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>


Cảm ơn câu trả lời này. Nó dường như là gần nhất với những gì tôi cần (giả sử không có giải pháp CSS thuần túy). Ngoài ra, tôi đã không nhận ra rằng các biến Thuộc tính / CSS tùy chỉnh thực sự tồn tại. Chúng có cần thiết cho việc này để hoạt động đúng không, hay bạn chỉ sử dụng chúng cho thuận tiện?
kojow7

@ kojow7 Tôi thích sử dụng chúng vì chúng làm cho mã có ý nghĩa hơn và chúng phù hợp với trường hợp cụ thể này như một chiếc găng tay
David Machado

Hey, cố gắng để làm việc này mà không có divs kéo dài chiều cao để lấp đầy cha mẹ. Bất kỳ đề xuất? Mỗi hình ảnh vẫn phải được liên kết với nhau theo hình ảnh theo chiều ngang và chiều dọc. Khoảng cách ngang có thể thay đổi giữa các hàng, nhưng khoảng cách giữa các cột phải giống nhau trên mỗi hàng.
kojow7

1
@ kojow7, chỉ cần tạo lưới ở bên trong divvà để phần đệm, đường viền. và trong min-widthmin-heightchính div.
ElChiniNet

@ kojow7 chính xác những gì ElChiniNet vừa nói vừa cập nhật css và js để có đầu ra mong muốn.
David Machado

0

Đây là nó:

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css">
    <link rel="stylesheet" href="style.css">
    <title>Title</title>
    <style>
        .firstone {
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            word-wrap: break-word;
            justify-content: space-evenly;
        }

        .secondone {
            word-wrap: break-word;
            display: flex;
            flex-direction: row;
            flex-wrap: wrap;
            justify-content: space-evenly;
        }
    </style>
</head>

<body>

    <div class="firstone">
        <div>
            <div>Label 1AAAAAAAAAAA</div>
            <div><img src="https://via.placeholder.com/75"></div>
            <div>Label 1B</div>
        </div>
        <div>
            <div>Label 2A</div>
            <div><img src="https://via.placeholder.com/75"></div>
            <div>Label 2B</div>
        </div>
    </div>
    <div class="secondone">
        <div>
            <div>Label 3A</div>
            <div><img src="https://via.placeholder.com/75"></div>
            <div>Label 3B</div>
        </div>
        <div>
            <div>Label 4A</div>
            <div><img src="https://via.placeholder.com/75"></div>
            <div>Label 4B</div>
        </div>
        <div>
            <div>Label 5A</div>
            <div><img src=" https://via.placeholder.com/75"> </div>
            <div>Label 5B</div>
        </div>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.slim.min.js">
    </script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.15.0/umd/popper.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
</body>

</html>

kiểm tra https://jsfiddle.net/sugandhnikhil/b216mx5d/

Thay đổi kích thước cửa sổ để xem eqqual sapcing giữa hình ảnh !!!!

Cảm ơn rất nhiều !!!!!!!

:-)


0

Chỉ tự hỏi tại sao để cho chiều dài của văn bản xác định kích thước của div? Điều đó có làm cho UI trở nên kỳ lạ không? Tôi khuyên bạn nên đặt chiều rộng cho nhãn và tất cả tràn văn bản sẽ trở thành ellipsis (...). Với điều này, không cần JavaScriptmã, chỉ cần thêm một số csscho bạn .label. Đây là một đoạn. Điều này sẽ trông tốt hơn nhiều so với việc divthay đổi kích thước của bạn bất cứ khi nào sẽ có một văn bản dài.

#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;
}

.label{
  width: 100px;
  white-space: nowrap; 
  overflow: hidden;
  text-overflow: ellipsis;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<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 2ASDEASD</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 3AGDSADASD</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 5ASDSAD</div>
			<div class="icon"><img src="https://via.placeholder.com/75"></div>
			<div class="label">Label 5B</div>
		</div>
    <div class="section">
			<div class="label">Label 6BABAF</div>
			<div class="icon"><img src="https://via.placeholder.com/75"></div>
			<div class="label">Label 5B</div>
		</div>
    <div class="section">
			<div class="label">Label 5XAEAFSASFD</div>
			<div class="icon"><img src="https://via.placeholder.com/75"></div>
			<div class="label">Label 5B</div>
		</div>
    <div class="section">
			<div class="label">Label 5AASDASEFSAFGG</div>
			<div class="icon"><img src="https://via.placeholder.com/75"></div>
			<div class="label">Label 5B</div>
		</div>
    <div class="section">
			<div class="label">Label 5ASDASEEGEDSDSD</div>
			<div class="icon"><img src="https://via.placeholder.com/75"></div>
			<div class="label">Label 5B</div>
		</div>
	</div> 
</div>
</body>
</html>

Nếu bạn lo lắng về "làm thế nào người xem của tôi có thể đọc phần còn lại của văn bản?" sau đó bạn có thể chỉ cần áp dụng một số hiệu ứng on hovercho mẫuellipsis giống như mẫu mã này (mẫu không phải của tôi) hoặc có thể thử một cái gì đó như giải pháp SO này .

Hi vọng điêu nay co ich!


0

Đây là góc hơi khác với những gì câu trả lời khác gợi ý. Bạn có thể có khả năng xem xét cắt ngắn văn bản istead.

#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;
    width: 100px; // I had to come up with a number here
    min-width: 0; 
}

.label, .icon {
	text-align: center;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis; // truncate the excess string here
}
<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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.