Ưu điểm của việc sử dụng display: inline-block vs float: left trong CSS


127

Thông thường, khi chúng tôi muốn có nhiều DIVsliên tiếp chúng tôi sẽ sử dụng float: left, nhưng bây giờ tôi đã phát hiện ra mẹo củadisplay:inline-block

Ví dụ liên kết ở đây . Dường như với tôi đó display:inline-blocklà một cách tốt hơn để align DIVsliên tiếp, nhưng có bất kỳ nhược điểm nào không? Tại sao cách tiếp cận này ít phổ biến hơn sau đó là floatmẹo?


@Moak Đó là câu hỏi cụ thể là về inline, không inline-block. Nhưng cái đầu tiên có liên quan là tốt: stackoverflow.com/a/11823622/918414
ThinkingStiff


2
liên kết ví dụ đã chết
information_interchange

Câu trả lời:


156

Trong 3 từ: inline-blocklà tốt hơn.

Chặn Nội tuyến

Hạn chế duy nhất của display: inline-blockphương pháp này là trong IE7 và bên dưới một phần tử chỉ có thể được hiển thị inline-blocknếu nó đã được inlinemặc định. Điều này có nghĩa là thay vì sử dụng một <div>yếu tố, bạn phải sử dụng một <span>yếu tố. Nó thực sự không phải là một nhược điểm lớn vì về mặt ngữ nghĩa <div>là dành cho việc phân chia trang trong khi a <span>chỉ để che một khoảng của trang, do đó không có sự khác biệt lớn về ngữ nghĩa. Một lợi ích to lớn display:inline-blocklà khi các nhà phát triển khác đang duy trì mã của bạn tại một thời điểm sau đó, rõ ràng hơn những gì display:inline-blocktext-align:right đang cố gắng thực hiện hơn là một tuyên bố float:lefthoặc float:right. Lợi ích ưa thích của tôi trong những inline-blockcách tiếp cận này là nó dễ dàng để sử dụng vertical-align: middle, line-heighttext-align: centerđể tập trung hoàn hảo các yếu tố, theo cách trực quan. Tôi tìm thấy một bài đăng blog tuyệt vời về cách triển khai khối nội tuyến trên nhiều trình duyệt, trên blog Mozilla . Đây là khả năng tương thích trình duyệt .

Phao nổi

Lý do sử dụng float phương pháp này không phù hợp với bố cục trang của bạn là vì thuộc tính floatCSS ban đầu chỉ nhằm mục đích bao bọc văn bản xung quanh một hình ảnh (kiểu tạp chí) và, theo thiết kế, không phù hợp nhất cho mục đích bố cục trang chung. Khi thay đổi các phần tử nổi sau này, đôi khi bạn sẽ gặp vấn đề về định vị vì chúng không nằm trong luồng trang . Một nhược điểm khác là nó thường yêu cầu một mã xóa nếu không nó có thể phá vỡ các khía cạnh của trang. Clearfix yêu cầu thêm một phần tử sau các phần tử nổi để ngăn cha mẹ của chúng sụp đổ xung quanh chúng, điều này vượt qua ranh giới ngữ nghĩa giữa phong cách tách biệt với nội dung và do đó là một mô hình chống phát triển web .

Bất kỳ vấn đề khoảng trắng nào được đề cập trong liên kết ở trên có thể dễ dàng được khắc phục bằng thuộc tính white-spaceCSS.

Biên tập:

SitePoint là một nguồn rất đáng tin cậy cho lời khuyên thiết kế web và họ dường như có cùng quan điểm với tôi:

Nếu bạn chưa quen với bố cục CSS, bạn sẽ được tha thứ vì nghĩ rằng sử dụng CSS nổi theo cách tưởng tượng là chiều cao của kỹ năng. Nếu bạn đã sử dụng nhiều hướng dẫn bố cục CSS như bạn có thể tìm thấy, bạn có thể cho rằng việc làm chủ phao là một nghi thức thông qua. Bạn sẽ bị lóa mắt bởi sự khéo léo, kinh ngạc bởi sự phức tạp và bạn sẽ có được cảm giác thành tựu khi cuối cùng bạn cũng hiểu được cách thức hoạt động của phao.

Đừng để bị lừa. Bạn đang bị tẩy não.

http://www.sitepoint.com/give-floats-the-flick-in-css-layouts/

Cập nhật 2015 - Flexbox là một lựa chọn tốt cho các trình duyệt hiện đại :

.container {
  display: flex; /* or inline-flex */
}

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

Thêm thông tin

Cập nhật ngày 21 tháng 12 năm 2016

Bootstrap 4 đang loại bỏ hỗ trợ cho IE9 và do đó loại bỏ các số float từ các hàng và chuyển sang Flexbox đầy đủ.

Yêu cầu kéo # 21389


4
"Clearfix" chỉ là một cái tên; "sửa chữa" biểu thị việc sửa chữa những kỳ vọng không chính xác và / hoặc thực hiện trình duyệt không chính xác. Tôi (vui vẻ) đồng ý rằng có những lựa chọn thay thế cho nổi / thanh toán bù trừ, nhưng không có gì vốn đã bị phá vỡ hoặc cố định về nó.
Tim Medora

10
@Alex - Có cách nào không hack, tương thích trình duyệt chéo để xóa khoảng trắng giữa các thành phần khối nội tuyến nằm trên các dòng riêng biệt không? Tôi muốn có thể ngừng sử dụng phao nhưng các liên kết tốt nhất tôi có thể tìm thấy về vấn đề này ( ở đâyở đây ) là không thỏa đáng. Bạn đề cập đến white-spacetài sản - bạn có thể giải thích điều này?
antinome

3
@Alex - cảm ơn, điều đó rất tuyệt, nhưng tôi vẫn thấy cách tiếp cận float-with-Modern-Clearfix dễ bảo trì hơn một chút, bởi vì nó sẽ không bị hỏng nếu một ngày nào đó tôi có thể tùy chỉnh letter-spacingở nơi khác trong CSS của mình.
antinome

1
Tại sao bootstrap vẫn sử dụng float cho hệ thống lưới của nó? Không phải đó là bố cục sao?
AzDesign

2
Hãy nhớ rằng khối nội tuyến thêm khoảng trắng xung quanh các phần tử. Nếu bạn đang sử dụng nó cho lưới hoặc không muốn khoảng trắng này, bạn sẽ phải thêm các kiểu hack / HTML bổ sung để giải thích cho việc này. Xem: css-tricks.com/fighting-the-space-b
between

23

Mặc dù tôi đồng ý rằng nhìn chung inline-blocklà tốt hơn, có một điều nữa cần tính đến nếu bạn đang sử dụng độ rộng phần trăm để tạo lưới phản hồi (hoặc nếu bạn muốn độ rộng hoàn hảo pixel):

Nếu bạn đang sử dụng inline-blockcho các lưới có tổng chiều rộng 100% hoặc gần 100%, bạn cần đảm bảo đánh dấu HTML của bạn không chứa khoảng trắng giữa các cột .

Với số float, đây không phải là điều bạn cần lo lắng - các cột nổi trên bất kỳ khoảng trắng hoặc nội dung nào khác giữa các cột. Câu trả lời của câu hỏi này có một số mẹo hay về cách xóa khoảng trắng HTML mà không làm cho mã của bạn trở nên xấu .

Nếu vì bất kỳ lý do nào bạn không thể kiểm soát đánh dấu HTML (ví dụ: CMS hạn chế), bạn có thể thử các thủ thuật được mô tả ở đây hoặc bạn có thể cần phải thỏa hiệp và sử dụng các float thay vì chặn nội tuyến. Ngoài ra còn có các thủ thuật CSS xấu xí chỉ nên được sử dụng trong các trường hợp khắc nghiệt, như font-size:0;trên bộ chứa cột sau đó áp dụng lại kích thước phông chữ trong mỗi cột .

Ví dụ:


Có cách giải quyết nào khả dĩ cho khoảng không giữa khoảng trắng, có thể div+(whitespace) {display:none}hoặc một cái gì đó không?
NoBugs

1
Xem đoạn thứ ba sau câu đầu tiên của nó ... Đặc biệt hãy xem câu hỏi được liên kết
user56reinstatemonica8

@NoBugs chỉ cần áp dụng cỡ chữ: 0; đến phần tử chứa, chỉ cần xem nếu bạn không có kích thước phông chữ cụ thể được đặt trên các phần tử trong khối nội tuyến !!
Jai

@Jai Chính xác, và vì kiểu dáng / khung nhìn nên tách rời khỏi quá trình tạo html / mô hình, đó là một thực tế tồi. (Điều gì sẽ xảy ra nếu bạn sử dụng một dịch vụ mang lại cho bạn <div class="inlinething">hi</div> <div class="inlinething">there</div> more content here... ?)
NoBugs

4

Nếu bạn muốn căn chỉnh divvới pixel chính xác, thì hãy sử dụng float. inline-blockdường như luôn yêu cầu bạn cắt bỏ một vài pixel (ít nhất là trong IE)


6
Vâng, đó là bởi vì bạn phải tránh sử dụng khoảng trắng giữa các phần tử vì các khối nội tuyến tính đến các không gian tài khoản giống như các phần tử nội tuyến. Giữ các thẻ chặn nội tuyến chặt chẽ với nhau và không có vấn đề với pixel.
Ben Sinclair

Ngoài ra, đây có thể là một sự khác biệt của trình duyệt với phần đệm / lề mặc định trên các phần tử .. Ít nhất trong quá khứ tôi luôn làm * {padding:0px; margin:0px; }như vậy vì điều này giúp cân bằng mã hóa của tôi
Angry 84

Đây có phải là lý do Bootstrap (có thể là những người khác) sử dụng nó chứ không phải là khối nội tuyến tôi tự hỏi?
NoBugs

1

Bạn có thể tìm thấy câu trả lời sâu ở đây .

Nhưng nói chung với floatbạn cần phải nhận thức và quan tâm đến các yếu tố xung quanh và inline-blockcách đơn giản để các yếu tố dòng.

Cảm ơn


1

Có một đặc điểm về khối nội tuyến có thể không đơn giản. Đó là giá trị mặc định cho căn chỉnh dọc trong CSS là đường cơ sở. Điều này có thể gây ra một số hành vi liên kết bất ngờ. Nhìn vào bài viết này.

http://www.brunasy.org/test/inline-block.html

Thay vào đó, khi bạn thực hiện float: left, các div độc lập với nhau và bạn có thể căn chỉnh chúng bằng cách sử dụng lề một cách dễ dàng.

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.