Sự khác biệt giữa display: inline và display: inline-block là gì?


607

Chính xác thì sự khác biệt giữa inlineinline-blockgiá trị của CSS là displaygì?

Câu trả lời:


1351

Một câu trả lời trực quan

Hãy tưởng tượng một <span>yếu tố bên trong a <div>. Nếu bạn cho <span>phần tử có chiều cao 100px và viền đỏ chẳng hạn, nó sẽ trông như thế này với

Hiển thị nội dòng

Hiển thị nội dòng

hiển thị: khối nội tuyến

hiển thị: khối nội tuyến

hiển thị: khối

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

Mã: http://jsfiddle.net/Mta2b/

Các phần tử display:inline-blockgiống như display:inlinecác phần tử, nhưng chúng có thể có chiều rộngchiều cao . Điều đó có nghĩa là bạn có thể sử dụng một phần tử khối nội tuyến như một khối trong khi chuyển nó trong văn bản hoặc các phần tử khác.

Sự khác biệt của các kiểu được hỗ trợ như tóm tắt:

  • inline : chỉ margin-left, margin-right, padding-left,padding-right
  • inline-block : margin, padding, height,width

6
Trực giác tuyệt vời. Vì vậy, sự khác biệt duy nhất là thuộc tính chiều cao của các yếu tố nội tuyến không thể được đặt?
dùng2316667

7
@ user2316667 và chiều rộng
Oscar Calderon

2
@ user2316667 và @OscarCalderon: đồng thời, các phần tử nội tuyến không quan tâm đến lề & phần đệm dọc và phần tử tiếp theo sẽ được đặt ở cùng một dòng (không ngắt dòng sau nó). các phần tử khối như as p, divcó được một dòng toàn bộ chiều rộng (buộc ngắt dòng) nhưng tôn trọng chiều rộng / chiều cao và tất cả các phần đệm / lề ngang / dọc. Các phần tử khối nội tuyến có hành vi tương tự như khối nhưng không có ngắt dòng hoàn toàn (các phần tử khác có thể được đặt bên cạnh chúng)
S.Serpooshan

1
padding-top và padding-right cũng ảnh hưởng đến hiệu ứng hiển thị của phần tử nội tuyến, gây ra một số mớ hỗn độn.
tomwang1013

2
@ manuman94 Không, nó không có nghĩa như vậy. Có trường hợp sử dụng cho tất cả các loại màn hình khác nhau.
splattne

126

display: inline;là một chế độ hiển thị để sử dụng trong một câu. Chẳng hạn, nếu bạn có một đoạn văn và muốn làm nổi bật một từ bạn làm:

<p>
    Pellentesque habitant morbi <em>tristique</em> senectus
    et netus et malesuada fames ac turpis egestas.
</p>

Phần <em>tử có một display: inline;mặc định, bởi vì thẻ này luôn được sử dụng trong một câu. Phần <p>tử có một display: block;mặc định, bởi vì nó không phải là một câu hay trong một câu, nó là một khối các câu.

Một phần tử display: inline; không thểheighta widthhoặc a dọc margin. Một phần tử có display: block; thể có một width, heightmargin.
Nếu bạn muốn thêm một heightđến <em>yếu tố, bạn cần phải đặt yếu tố này để display: inline-block;. Bây giờ bạn có thể thêm một heightphần tử và mọi kiểu khối khác ( blockphần của inline-block), nhưng nó được đặt trong một câu ( inlinephần của inline-block).


11
Câu trả lời chính xác! tl; dr - Nếu bạn muốn thay đổi kích thước các phần tử nội tuyến, bạn có thể sử dụng khối nội tuyến làm loại hiển thị.
lỗi

7
Hiệu chỉnh nhỏ: các phần tử nội tuyến có thể có lề ngang (phải, trái), nhưng không phải lề dọc (trên, dưới)
whyleee

1
Câu trả lời hay vì bạn đã đề cập về những gì chúng ta có thể / không thể làm khi chọn một trong các displaygiá trị.
ha9u63ar

14

Một điều không được đề cập trong câu trả lời là phần tử nội tuyến có thể ngắt giữa các dòng trong khi khối nội tuyến không thể (và rõ ràng là chặn)! Vì vậy, các phần tử nội tuyến có thể hữu ích để định kiểu các câu văn bản và các khối bên trong chúng, nhưng vì chúng không thể được đệm nên bạn có thể sử dụng chiều cao dòng thay thế.

<div style="width: 350px">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
  <div style="display: inline; background: #F00; color: #FFF">
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  </div>
  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
<hr/>
<div style="width: 350px">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
  <div style="display: inline-block; background: #F00; color: #FFF">
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  </div>
  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

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


6

Tất cả các câu trả lời ở trên đóng góp thông tin quan trọng về câu hỏi ban đầu. Tuy nhiên, có một khái quát có vẻ sai.

Có thể đặt chiều rộng và chiều cao cho ít nhất một phần tử nội tuyến (mà tôi có thể nghĩ đến) - <img>phần tử.

Cả hai câu trả lời được chấp nhận ở đây và trên trạng thái trùng lặp này là không thể nhưng điều này dường như không phải là một quy tắc chung hợp lệ.

Thí dụ:

img {
  width: 200px;
  height: 200px;
  border: 1px solid red;
}
<img src="#" />

Các imgdisplay: inline, nhưng nó widthheightđã được thiết lập thành công.


2
Trên thực tế, thẻ img có giá trị hiển thị nội tuyến làm giá trị hiển thị mặc định của chúng. Vì vậy, đó là lý do tại sao có thể đặt chiều rộng và chiều cao.
Alex

img là một yếu tố nội tuyến -> developer.mozilla.org/en-US/docs/Web/HTML/Inline_elements ... Vì vậy, về cơ bản, bạn đang nói chính xác hơn hoặc ít hơn những gì tôi đang nói và bạn đang từ chối ??
alexandros84

7
Không, tôi không phải. Thẻ img là một "phần tử được thay thế", về cơ bản có nghĩa là nội dung được thay thế để nó hoạt động như một phần tử khối nội tuyến. Và có, thuộc tính mặc định thực tế (thuộc tính tính toán của trình duyệt là nội tuyến). Nhưng lý do duy nhất cho điều đó là do khối nội tuyến không được giới thiệu cho đến CSS2 và ở đó là "phần tử nội tuyến hoạt động giống như phần tử khối nội tuyến" vì nó được thay thế bởi nội dung của nó. tức là bạn không đặt chiều cao / chiều rộng cho phần tử, bạn đang đặt nó trên nội dung của nó - Wierd, vâng. Tôi biết. dự thảo.csswg.org/css2/conform.html#replaces
Alex

Đó là thực sự thú vị những gì bạn đang nói. Hãy cho tôi một chút thời gian để nghiên cứu và chỉnh sửa lại và có thể lấy lại downvote và upvote thay thế ..! Vào cuối ngày, tôi thành thật cảm thấy rằng cuộc thảo luận này đang góp phần vào sự hoàn chỉnh của toàn bộ cuộc tranh luận.
alexandros84

1

Câu trả lời của splattne có lẽ bao trùm hầu hết mọi thứ vì vậy tôi sẽ không lặp lại điều tương tự, nhưng: inlineinline-blockhành xử khác với thuộc tính directionCSS.

Trong đoạn mã tiếp theo bạn thấy one two(theo thứ tự) được hiển thị, giống như trong bố cục LTR. Tôi nghi ngờ trình duyệt ở đây tự động phát hiện phần tiếng Anh dưới dạng văn bản LTR và hiển thị nó từ trái sang phải.

body {
  text-align: right;
  direction: rtl;
}

h2 {
  display: block; /* just being explicit */
}

span {
  display: inline;
}
<h2>
  هذا عنوان طويل
  <span>one</span>
  <span>two</span>
</h2>

Tuy nhiên, nếu tôi tiếp tục và đặt displaythành inline-block, trình duyệt sẽ tôn trọng thuộc directiontính và hiển thị các thành phần từ phải sang trái theo thứ tự, do đó, two oneđược hiển thị.

body {
  text-align: right;
  direction: rtl;
}

h2 {
  display: block; /* just being explicit */
}

span {
  display: inline-block;
}
<h2>
  هذا عنوان طويل
  <span>one</span>
  <span>two</span>
</h2>

Tôi không biết nếu có bất kỳ sự kỳ quặc nào khác về điều này, tôi chỉ tìm thấy về điều này theo kinh nghiệm trên Chrome.

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.