Flexbox không cho chiều rộng bằng nhau cho các yếu tố


368

Cố gắng điều hướng flexbox có tối đa 5 mục và ít nhất là 3, nhưng nó không chia chiều rộng bằng nhau giữa tất cả các yếu tố.

Vĩ cầm

Hướng dẫn mà tôi đang lập mô hình này sau là http://www.sitepoint.com/responsive-fluid- thong-variable-item-navlation-css/

SASS

* {
  font-size: 16px;
}

.tabs {
  max-width: 1010px;
  width: 100%;
  height: 5rem;
  border-bottom: solid 1px grey;
  margin: 0 0 0 6.5rem;
  display: table;
  table-layout: fixed;
}
.tabs ul {
  margin: 0;
  display: flex;
  flex-direction: row;
}
.tabs ul li {
  flex-grow: 1;
  list-style: none;
  text-align: center;
  font-size: 1.313rem;
  background: blue;
  color: white;
  height: inherit;
  left: auto;
  vertical-align: top;
  text-align: left;
  padding: 20px 20px 20px 70px;
  border-top-left-radius: 20px;
  border: solid 1px blue;
  cursor: pointer;
}
.tabs ul li.active {
  background: white;
  color: blue;
}
.tabs ul li:before {
  content: "";
}
<div class="tabs">
  <ul>
    <li class="active" data-tab="1">Pizza</li>
    <li data-tab="2">Chicken Noodle Soup</li>
    <li data-tab="3">Peanut Butter</li>
    <li data-tab="4">Fish</li>
  </ul>
</div>


1
cung cấp độ rộng tối thiểu cho bảng của bạn như thế nào và đặt phần đệm với các đơn vị vw có thể giúp: jsfiddle.net/2nY9N/2 thả flex-grow và chỉ cần thực hiện flex: 1; nó sẽ sử dụng các giá trị defaut cho 2 thuộc tính khác
G-Cyrillus

Câu trả lời:


907

Có một bit quan trọng không được đề cập trong bài viết mà bạn đã liên kết và đó là flex-basis. Theo mặc định flex-basisauto.

Từ thông số kỹ thuật :

Nếu cơ sở flex được chỉ định là tự động, thì cơ sở flex được sử dụng là giá trị của thuộc tính kích thước chính của mục flex. (Đây có thể là từ khóa tự động, kích thước mục flex dựa trên nội dung của nó.)

Mỗi mục flex có một flex-basisloại giống như kích thước ban đầu của nó. Sau đó, từ đó, mọi không gian trống còn lại sẽ được phân phối theo tỷ lệ (dựa trên flex-grow) giữa các mục. Với auto, cơ sở đó là kích thước nội dung (hoặc kích thước được xác định với width, v.v.). Do đó, các mục có văn bản lớn hơn bên trong sẽ được cung cấp nhiều không gian hơn trong ví dụ của bạn.

Nếu bạn muốn các yếu tố của bạn hoàn toàn đồng đều, bạn có thể đặt flex-basis: 0. Điều này sẽ đặt cơ sở flex thành 0 và sau đó mọi không gian còn lại (sẽ là tất cả không gian vì tất cả các cơ sở là 0) sẽ được phân bổ theo tỷ lệ dựa trên flex-grow.

li {
    flex-grow: 1;
    flex-basis: 0;
    /* ... */
}

Sơ đồ này từ thông số kỹ thuật làm một công việc khá tốt để minh họa điểm.

đây là một ví dụ làm việc với fiddle của bạn.


3
Tàn tích này gói cho tôi trên Safari.
tuyết

77
Điều tuyệt vời về câu trả lời này là bạn giải thích cơ sở flex với ví dụ này tốt hơn bất kỳ nơi nào khác trên toàn bộ internet. Tôi sẽ liên lạc với MIT về việc trao cho bạn một giáo sư danh dự.
dudewad

96
Chỉ cần đề cập đến flex: 1;là viết tắt cho sự kết hợp của flex-grow: 1, flex-basis: 0.
Vadim Ovchinnikov

1
Chỉ trong trường hợp nếu bất cứ ai muốn biết sâu, tôi đã xem bài viết tuyệt vời này trên web: css-tricks.com/flex-grow-is-weird
Kuldeep Kumar

Ôi trời, luôn đánh vào đầu tôi khi tôi nghĩ tôi đã nắm được CSS.
ibic

15

Để tạo các phần tử có chiều rộng bằng nhau bằng cách sử dụng Flex, bạn nên đặt thành con của bạn (phần tử flex):

flex-basis: 25%;
flex-grow: 0;

Nó sẽ cung cấp cho tất cả các yếu tố trong hàng 25% chiều rộng. Họ sẽ không phát triển và đi từng người một.


77
Điều này khá khó xử vì nó làm giảm hoàn toàn lợi ích của flex. Nếu bạn định mã hóa kích thước cột của mình, có những cách dễ dàng hơn để giải quyết mọi thứ.
Kloar

3
điều đó không sai chút nào .. nếu bạn muốn có các hộp có cùng chiều dài và bị phá vỡ khi hàng bị chiếm hết .. bạn có thể dễ dàng đạt được điều đó như thế này. Có thể đặt cả chiều rộng tối thiểu nếu bạn cần chiều rộng tối thiểu
Ilario Engler

1
@Kloar Bạn đang nói rằng đó giống như lợi ích duy nhất của flexbox ... Chúng chắc chắn vẫn có thể có lợi khi bạn cần độ rộng bằng nhau, ví dụ như để đáp ứng. Ngoài ra, nó không giống như flexboxes không dễ dàng?
user2999349
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.