Các phần tử khối nội tuyến của tôi không được sắp xếp đúng cách


82

Tất cả các phần tử bên trong .track-containerphải xếp hàng đẹp và thẳng hàng, mỗi bên cạnh nhau, bị giới hạn bởi chiều cao 200px mà chúng đã được cung cấp mà không có lề hoặc phần đệm kỳ lạ. Thay vào đó, bạn có sự kỳ lạ xảy ra trong trò chơi khó nói trên.

Điều gì đang gây ra .album-artwork.track-infobị đẩy xuống nửa trang và làm cách nào để khắc phục? Ngoài ra, tôi thừa nhận rằng một bảng có thể là cách tốt hơn để tiếp cận toàn bộ thiết lập này, nhưng tôi muốn tìm ra vấn đề từ đoạn mã trên để tôi có thể học hỏi từ sai lầm này.

.track-container {
    padding:0;
    width: 600px;
    height: 200px;
    border: 1px solid black;
    list-style-type: none;
    margin-bottom: 10px;
}

.position-data {
    overflow: none;
    display: inline-block;
    width: 12.5%;
    height: 200px;
    margin: 0;
    padding: 0;
    border: 1px solid black;
}

.current-position, .position-movement {
    height: 100px;
    width: 100%;
    margin: 0;
    padding: 0;
    border: 1px solid black;
}

.album-artwork {
    display: inline-block;
    height: 200px;
    width: 20%;
    border: 1px solid black;
}

.track-info {
    display: inline-block;
    padding-left: 10px;
    height: 200px;
    border: 1px solid black;
}
<div class="track-container">
    <div class="position-data">
        <div class="current-position">1</div>
        <div class="position-movement">2</div>
    </div>
    <div class="album-artwork">fdasfdsa</div>
    <div class="track-info">fdafdsa</div>
</div>

Đây là một JSFiddle .

Câu trả lời:


179

10.8 Tính toán chiều cao dòng: thuộc tính 'line-height' và 'vertical-align'

Đường cơ sở của 'khối nội tuyến' là đường cơ sở của hộp dòng cuối cùng của nó trong quy trình bình thường, trừ khi nó không có hộp dòng trong dòng hoặc nếu thuộc tính 'tràn' của nó có giá trị được tính khác ngoài 'hiển thị', trong trường hợp nào thì đường cơ sở là cạnh lề dưới cùng.

Đây là một vấn đề phổ biến liên quan đến inline-blockcác yếu tố. Trong trường hợp này, giá trị mặc định của thuộc vertical-aligntính là baseline. Nếu bạn thay đổi giá trị thành top, nó sẽ hoạt động như mong đợi.

Ví dụ cập nhật

.position-data {
    vertical-align: top;
}

2
Cảm ơn bạn! Đã được tìm kiếm tuổi. Vấn đề của tôi là chèn html vào các phần tử khối nội tuyến, điều này ảnh hưởng đến vị trí dọc. Sự cố chỉ hiển thị trong Safari.
kapoko

2
Tôi đã thử mọi thứ, làm điều này ngay lập tức khắc phục được sự cố của tôi!
xorinzor

2
đã cứu ngày của tôi, anh bạn
osyan

3
Tôi đã dành rất nhiều thời gian cho vấn đề này vì div bên trong của tôi không phù hợp với dự án React của tôi. Điều này thực sự đã giúp tôi tiết kiệm hàng giờ!
SeaWarrior404,

3
5 năm sau vẫn cứu được mạng người. Cảm ơn bạn!
Seu Madruga

33

Các phần tử bên trong .track-containercác hộp cấp dòng trong cùng một hộp dòng .

Do đó, căn chỉnh dọc của chúng được chỉ định bởi thuộc vertical-aligntính:

Thuộc tính này ảnh hưởng đến vị trí thẳng đứng bên trong hộp dòng của các hộp được tạo bởi phần tử cấp nội tuyến.

Theo mặc định, giá trị của nó là baseline:

Căn chỉnh đường cơ sở của hộp với đường cơ sở của hộp mẹ. Nếu hộp không có đường cơ sở, hãy căn chỉnh cạnh lề dưới cùng với đường cơ sở của hộp chính.

Trong trường hợp này, tất cả chúng đều có đường cơ sở, được tính toán theo

Đường cơ sở của 'khối nội tuyến' là đường cơ sở của hộp dòng cuối cùng của nó trong quy trình bình thường, trừ khi nó không có hộp dòng trong dòng hoặc nếu thuộc tính 'tràn' của nó có giá trị được tính khác ngoài 'hiển thị', trong trường hợp nào thì đường cơ sở là cạnh lề dưới cùng.

Hình ảnh sau đây làm rõ những gì đang xảy ra (đường màu đỏ là đường cơ sở):

nhập mô tả hình ảnh ở đây

Do đó, bạn có thể

  • Thay đổi căn chỉnh theo chiều dọc của các phần tử, ví dụ: thành top, middlehoặcbottom

    .track-container > * {
      vertical-align: middle;
    }
    

  • Đặt các overflowphần tử thành một cái gì đó khác với visible, ví dụ hiddenhoặc auto, để đường cơ sở của chúng sẽ là cạnh lề dưới cùng của chúng.

    .track-container > * {
      overflow: hidden;
    }
    

  • Đảm bảo các phần tử không có hộp dòng trong dòng, để đường cơ sở của chúng sẽ là cạnh lề dưới cùng của chúng. Đó là, nội dung phải nằm ngoài luồng :

    Một phần tử được gọi là out of flow nếu nó được thả nổi, được định vị tuyệt đối hoặc là phần tử gốc. Một phần tử được gọi là trong luồng nếu nó không nằm ngoài luồng.

    Vì vậy, ví dụ: bạn có thể đặt nội dung của các phần tử trong một trình bao bọc và tạo kiểu cho nó bằng float: left:

    .track-container > * > .wrapper {
      float: left;
    }
    


2
cách chi tiết hơn và giải thích tốt hơn câu trả lời được chấp nhận. Wonder tại sao điều này đã không được bỏ phiếu tán hơn

1
@ user141554 Cảm ơn :) Lưu ý rằng câu trả lời này gần đây hơn nhiều so với những câu khác, vì vậy có ít lượt ủng hộ hơn là bình thường.
Oriol

8

Bạn cần thêm vertical-align: top vào hai phần tử đó:

.album-artwork, .track-info {
    vertical-align:top;
}

ví dụ jsFiddle

Căn chỉnh theo chiều dọc mặc định là đường cơ sở, nhưng thay vào đó bạn đang tìm hàng trên.


Để đơn giản hóa, tôi sẽ làm .track-container div {vertical-align: top;}
Cam

1

Hoặc bạn có thể đặt float:left;thành 3 phần tử.

http://jsfiddle.net/fC2nt/


Điều đó sẽ hiệu quả, nhưng nó đánh bại mục đích của việc sử dụng inline-blockcác phần tử.
Josh Crozier

đúng, bạn đúng. Tôi không xóa anwser này, nó có thể là bài học cho một ai đó :)
Szymon

1
Bạn nói đúng - 1+ .. ngoài ra, overflow:hiddencó thể cần phải được thêm vào phần tử mẹ để chứa các phần tử nổi. Tuy nhiên, bạn nên thêm một bản trình diễn minh họa nó.
Josh Crozier

1

Đảm bảo rằng tỷ lệ chiều cao dòng trên tất cả các phần tử bạn đang cố gắng căn chỉnh cũng giống nhau. Nếu bạn đang sử dụng kết hợp các thẻ DIV, P, H1-5, DT, DD, INPUT, BUTTON, điều này cũng sẽ gây ra sự bất thường trong căn chỉnh dọc tùy thuộc vào những gì bạn đã xác định ở nơi khác.

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.