Hai phần tử khối nội tuyến, mỗi phần tử rộng 50%, không nằm cạnh nhau trong một hàng


87
<!DOCTYPE html>
<html>
<head>
<title>Width issue</title>
<style type="text/css">
body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
}
</style>
</head>
<body>
    <div id="left">Left</div>
    <div id="right">Right</div>
</body>
</html>

JSFiddle: http://jsfiddle.net/5EcPK/

Đoạn mã trên đang cố gắng đặt div #left và div #right cạnh nhau, trong một hàng. Nhưng như bạn có thể thấy trong URL JSFiddle ở trên, đây không phải là trường hợp.

Tôi có thể giải quyết vấn đề khi giảm chiều rộng của một trong các div xuống 49%. Xem http://jsfiddle.net/mUKSC/ . Nhưng đây không phải là một giải pháp lý tưởng vì một khoảng cách nhỏ xuất hiện giữa hai div.

Một cách khác mà tôi có thể giải quyết vấn đề là thả nổi cả hai div. Xem http://jsfiddle.net/VptQm/ . Điều này hoạt động tốt.

Nhưng câu hỏi ban đầu của tôi vẫn còn. Tại sao khi cả hai div được giữ dưới dạng phần tử khối nội tuyến, chúng không khớp cạnh nhau?

Câu trả lời:


139

Khi sử dụng inline-blockcác phần tử, sẽ luôn có whitespace vấn đề giữa các phần tử đó (không gian đó rộng khoảng ~ 4px).

Vì vậy, hai của bạn divs, cả hai đều có chiều rộng 50%, cộng với whitespace(~ 4px) có chiều rộng hơn 100%, và do đó, nó bị hỏng. Ví dụ về vấn đề của bạn:


Có một số cách để khắc phục điều đó:

1. Không có khoảng trống giữa các phần tử đó

2. Sử dụng nhận xét HTML

3. Đặt cha mẹ font-sizethành 0, sau đó thêm một số giá trị vào inline-blockcác phần tử

4. Sử dụng một biên âm giữa chúng ( không thích hợp )

5. Góc đóng cửa giảm

6. Bỏ qua một số thẻ đóng HTML nhất định (cảm ơn @thirtydot đã tham khảo )


Người giới thiệu:

  1. Chống lại khoảng trống giữa các phần tử khối nội tuyến trên thủ thuật CSS
  2. Xóa khoảng trắng giữa các phần tử khối nội tuyến bởi David Walsh
  3. Làm thế nào để loại bỏ khoảng cách giữa các phần tử khối nội tuyến?

Như @ MarcosPérezGude đã nói , cách tốt nhất là sử dụng remvà thêm một số giá trị mặc định font-sizevào htmlthẻ (như trong HTML5Boilerplate ). Thí dụ:

html{
    font-size: 1em;
}

.ib-parent{             /* ib -> inline-block */
    font-size: 0;
}

.ib-child{
    display: inline-block;
    font-size: 1rem;
}

Cập nhật : gần đến năm 2018, hãy sử dụng flexbox hoặc thậm chí tốt hơn - bố cục lưới CSS .


3
@hoosierEE thật không ngoa. Khoảng cách giữa các phần tử là tốt, đó là bởi vì các phần tử khối nội tuyến sẽ định vị ở dòng văn bản. Nếu bạn đặt một khoảng trắng trong một dòng, sẽ có một khoảng trắng. Vì vậy, hành vi là đúng, ngay cả khi bạn nghĩ đó là một vấn đề (như Vucko gọi nó là sai).
Marcos Pérez Gude

2
Tôi đồng ý với @ MarcosPérezGude, hành vi này là đúng. Như bạn có thể thấy từ bài đăng của tôi, có một số cách để loại bỏ khoảng trắng đó (bản thân tôi sử dụng các nhận xét HTML để loại bỏ khoảng trắng). Nhưng nếu bạn bận tâm đến khoảng trắng đó, bạn luôn có thể sử dụng flexbox, table/table-row/table-cellhoặc sử dụng float.
Vucko

2
Tôi sử dụng khối nội tuyến một cách hoàn hảo. Cách tiếp cận bình thường của tôi là parent { font-size:0; } child {font-size: 1rem; }. Với REMS tại là dễ nhất
Marcos Pérez Gude

hơi khó chịu khi các tab vẫn được phân tích cú pháp thành khoảng trắng. Tôi chưa bao giờ thấy việc bỏ bản sửa lỗi thẻ đóng trước đây, điều đó có bất kỳ sự bất ổn định hoặc tác dụng phụ nào không?
MintWelsh

Ngoài ra hãy chắc chắn rằng bordertắt. Điều này có thể thêm không gian nếu bạn đang thả nổi các div.
evolross

22

câu trả lời hay trong css3 là:

white-space: nowrap;

trong nút cha và:

white-space: normal;
vertical-align: top;

trong div (hoặc khác) ở mức 50%

exemple: http://jsfiddle.net/YpTMh/19/

BIÊN TẬP:

có một cách khác với:

font-size: 0;

cho nút cha và ghi đè nó trong nút con


7

Đó là bởi vì khoảng trắng giữa hai div của bạn đang được hiểu là một khoảng trắng. Nếu bạn đặt các <div>thẻ của mình thẳng hàng như hình dưới đây, vấn đề đã được khắc phục :

<div id="left"></div><div id="right"></div>


4

Làm cho chúng chặn thay vì khối nội tuyến. Điều này sẽ hiển thị các div bỏ qua khoảng trắng giữa chúng.

display:block;

hoặc xóa khoảng cách giữa các thẻ

<div id='left'></div><div id='right'></div>

hoặc thêm

margin: -1en;

vào một trong các div để giảm thiểu không gian bị chiếm bởi một không gian duy nhất được hiển thị.


2

Vui lòng kiểm tra mã dưới đây:

body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
    float:left;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
    float:left;
}
<div id="left">Left</div>
<div id="right">Right</div>



1

Nó có thể được thực hiện bằng cách thêm css display: inline vào div chứa các phần tử nội dòng.

Trong khi loại bỏ khoảng trắng bằng cách sử dụng lề có giá trị âm, cần thêm nó vào phần tử cụ thể này. Vì thêm nó vào một lớp sẽ ảnh hưởng đến những nơi mà lớp này đã được sử dụng.

Vì vậy, sẽ an toàn hơn nếu sử dụng display: inline;


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.