Sự khác biệt giữa các thẻ HTML <div> và <span> là gì?


543

Tôi muốn hỏi một số ví dụ đơn giản cho thấy việc sử dụng <div><span>. Tôi đã thấy cả hai được sử dụng để đánh dấu một phần của một trang bằng idhoặc class, nhưng tôi muốn biết liệu có những lúc nào cái này được ưa thích hơn cái kia không.

Câu trả lời:


582

Điều này có nghĩa là để sử dụng chúng về mặt ngữ nghĩa, nên sử dụng div để bọc các phần của tài liệu, trong khi các nhịp nên được sử dụng để bọc các phần nhỏ của văn bản, hình ảnh, v.v.

Ví dụ:

<div>This a large main division, with <span>a small bit</span> of spanned text!</div>

Lưu ý rằng việc đặt phần tử cấp khối trong một phần tử nội tuyến là bất hợp pháp, vì vậy:

<div>Some <span>text that <div>I want</div> to mark</span> up</div>

...Là bất hợp pháp.


EDIT: Kể từ HTML5, một số thành phần khối có thể được đặt bên trong một số thành phần nội tuyến. Xem tài liệu tham khảo MDN ở đây để biết danh sách khá rõ ràng. Ở trên vẫn là bất hợp pháp, vì <span>chỉ chấp nhận nội dung phrasing, và <div>là nội dung dòng chảy.


Bạn đã yêu cầu một số ví dụ cụ thể, do đó, một ví dụ được lấy từ trang web bowling của tôi, BowlSK :

<div id="header">
  <div id="userbar">
    Hi there, <span class="username">Chris Marasti-Georg</span> |
    <a href="/edit-profile.html">Profile</a> |
    <a href="https://www.bowlsk.com/_ah/logout?...">Sign out</a>
  </div>
  <h1><a href="/">Bowl<span class="sk">SK</span></a></h1>
</div>

Ok, chuyện gì đang xảy ra vậy?

Ở đầu trang của tôi, tôi có một phần logic, "tiêu đề". Vì đây là một phần, tôi sử dụng div (với id thích hợp). Trong đó, tôi có một vài phần: thanh người dùng và tiêu đề trang thực tế. Tiêu đề sử dụng thẻ thích hợp , h1. Thanh người dùng, là một phần, được bọc trong một div. Trong đó, tên người dùng được gói trong một span, để tôi có thể thay đổi kiểu. Như bạn có thể thấy, tôi cũng đã bọc spankhoảng 2 chữ cái trong tiêu đề - điều này cho phép tôi thay đổi màu sắc của chúng trong biểu định kiểu của mình.

Cũng lưu ý rằng HTML5 bao gồm một tập hợp các yếu tố mới xác định cấu trúc trang phổ biến, chẳng hạn như bài viết, phần, điều hướng, v.v.

Mục 4.4 của dự thảo làm việc HTML 5 liệt kê chúng và đưa ra gợi ý về việc sử dụng chúng. HTML5 vẫn là một thông số kỹ thuật hoạt động, vì vậy chưa có gì là "cuối cùng", nhưng điều đáng nghi ngờ là bất kỳ yếu tố nào trong số này sẽ đi bất cứ đâu. Có một hack javascript mà bạn sẽ cần sử dụng nếu bạn muốn tạo kiểu cho các phần tử này trong một số phiên bản IE cũ hơn - Bạn cần tạo một trong từng phần tử bằng cách sử dụng document.createElementtrước khi bất kỳ phần tử nào được chỉ định trong nguồn của bạn. Có một loạt các thư viện sẽ giải quyết vấn đề này cho bạn - một tìm kiếm nhanh trên Google đã xuất hiện html5shiv .


5
Chris, có một lỗi trong văn bản của bạn: Ngay cả khi bạn đặt kiểu của span thành khối block, thì việc bọc nó xung quanh thành phần cấp khối vẫn là bất hợp pháp!
Konrad Rudolph

7
Bạn không thể sử dụng divspanvề mặt ngữ nghĩa vì chúng không có bất kỳ ý nghĩa nào gắn liền với chúng. divlà một yếu tố cấp khối chung vô nghĩa trong khi spanlà một yếu tố nội tuyến chung vô nghĩa.
apnerve

9
@apnerve Họ vẫn có ngữ nghĩa trong khối đó so với các yếu tố nội tuyến có nghĩa là những thứ khác nhau đối với luồng tài liệu, cả từ góc độ phân tích cú pháp và từ quan điểm "đọc nguồn này để tìm hiểu điều gì đang xảy ra".
Chris Marasti-Georg

20
"Ngữ nghĩa học (từ tiếng Hy Lạp sēmantiká, số nhiều trung tính của sēmantikós) [1] [2] là nghiên cứu về ý nghĩa. Nó tập trung vào mối quan hệ giữa các chữ ký, chẳng hạn như từ, cụm từ, dấu hiệu và ký hiệu . " Các ký hiệu "div" và "span" chắc chắn đại diện cho một cái gì đó. Thông số kỹ thuật HTML có một phân tích tốt về các thành phần khối và nội tuyến. w3.org/TR/html401/struct/global.html#h-7.5.3 . Dự thảo HTML5 thậm chí còn đặt chúng trong các nhóm riêng biệt - Nhóm ngữ nghĩa cấp độ nội dung và văn bản. dev.w3.org/html5/spec/Overview.html
Chris Marasti-Georg

16
Bạn đã cho tôi tại "div là một yếu tố khối, span là nội tuyến." :)
Matical

390

Để hoàn thiện, tôi mời bạn suy nghĩ về nó như thế này:

  • Có rất nhiều yếu tố khối (ngắt dòng trước và sau) được xác định trong HTML và rất nhiều thẻ nội tuyến (không ngắt dòng).
  • Nhưng trong HTML hiện đại, tất cả các yếu tố được cho là có ý nghĩa : a <p>là một đoạn văn, một <li>là một mục danh sách, v.v. và chúng ta phải sử dụng đúng thẻ cho đúng mục đích - không giống như ngày xưa khi chúng ta thụt lề sử dụng <blockquote>cho dù nội dung là một trích dẫn hay không.
  • Vì vậy, bạn sẽ làm gì khi có không có ý nghĩa với điều bạn đang cố gắng để làm gì? Không có ý nghĩa gì với cột rộng 400px, phải không? Bạn chỉ muốn cột văn bản của bạn rộng 400px vì phù hợp với thiết kế của bạn.
  • Vì lý do này, họ đã thêm hai yếu tố nữa vào HTML: các yếu tố chung chung hoặc vô nghĩa <div><span>vì nếu không, mọi người sẽ quay lại lạm dụng các yếu tố có ý nghĩa.

20
Đây là một lời giải thích thích hợp. Tôi tự hỏi tại sao điều này không được chấp nhận là câu trả lời.
apnerve

16
bởi vì nó ở quá xa trang
Jason Sebring

12
Chỉ vì một câu trả lời tốt không được chấp nhận, không có nghĩa là bạn không thể bỏ phiếu. +1 để được làm rõ hữu ích.
CyberFonic

8
Rất vui được biết, nhưng nó không trả lời câu hỏi ban đầu, vì nó không giải thích sự khác biệt giữa các yếu tố div và span.
tehvan

216

Đã có câu trả lời tốt, chi tiết ở đây, nhưng không có ví dụ trực quan, vì vậy đây là một minh họa nhanh:

sự khác biệt giữa div và span

<div>This is a div.</div>
<div>This is a div.</div>
<div>This is a div.</div>
<span>This is a span.</span>
<span>This is a span.</span>
<span>This is a span.</span>

<div>là một thẻ khối, trong khi <span>là một thẻ nội tuyến.


16
Chúng có ảnh hưởng khác nhau đến bố cục, ngay cả khi không có CSS! Đây là lần đầu tiên tôi thấy điều này được hiển thị!
GreenAsJade

2
Cảm ơn bạn, tôi nêu lên câu trả lời này vì nó trả lời rất nhanh rằng div có dòng tiếp theo
Script Kitty

4
cảm ơn bạn đã giải thích những người mới như tôi một cách trực quan :-)
Aritra Chatterjee

73

<div>là một yếu tố cấp khối và <span>là một yếu tố nội tuyến.

Nếu bạn muốn làm một cái gì đó với một số văn bản nội tuyến, đó <span>là cách để đi vì nó sẽ không giới thiệu ngắt dòng mà <div>sẽ làm.


Như đã lưu ý bởi những người khác, có một số ngữ nghĩa ngụ ý với từng điều này, đáng kể nhất là thực tế là một <div>phân chia logic trong tài liệu, gần giống như một phần của tài liệu hoặc một cái gì đó, la:

<div id="Chapter1">
   <p>Lorem ipsum dolor sit amet, <span id="SomeSpecialText1">consectetuer adipiscing</span> elit. Duis congue vehicula purus.</p>
   <p>Nam <span id="SomeSpecialText2">eget magna nec</span> sapien fringilla euismod. Donec hendrerit.</p> 
</div>

1
div có thể được thực hiện nội tuyến (display: inline;) và ngược lại cho span nhưng đây là lời giải thích tốt nhất. Chúng là các thẻ bao, span thường được sử dụng cho câu hoặc tô sáng văn bản, div cho các phần.
Ross

3
Tôi biết rằng bạn có thể sửa đổi điều này bằng CSS, nhưng điều đó giới thiệu một công nghệ khác. HTML có thể tự đứng vững và khi có, div không phải là nội tuyến và nó không có ý định như vậy ở dạng thuần túy.
Jason Bunting

Có một cuốn sách hay giải thích cách sử dụng đúng các yếu tố html trong các tình huống khác nhau.
mko

@mko - Tôi không biết, thành thật mà nói. Kinh nghiệm là người thầy tốt nhất. Cuối cùng, không có câu trả lời "đúng", mỗi lần, chỉ đơn giản là những gì phù hợp với tình huống và mục đích của bạn. ;)
Jason Bunting

30

Sự khác biệt quan trọng thực sự đã được đề cập trong câu trả lời của Chris. Tuy nhiên, ý nghĩa sẽ không rõ ràng đối với mọi người.

Là một yếu tố nội tuyến, <span>chỉ có thể chứa các yếu tố nội tuyến khác. Do đó, đoạn mã sau là sai:

<span><p>This is a paragraph</p></span>

Các mã trên không hợp lệ. Để bọc các phần tử cấp khối, phải sử dụng một phần tử cấp khối khác (chẳng hạn như <div>). Mặt khác, <div>chỉ có thể được sử dụng ở những nơi mà các yếu tố cấp khối là hợp pháp.

Hơn nữa, các quy tắc này được cố định trong (X) HTML và chúng không bị thay đổi bởi sự hiện diện của các quy tắc CSS! Vì vậy, các mã sau đây cũng sai!

<span style="display: block"><p>Still wrong</p></span>
<span><p style="display: inline">Just as wrong</p></span>

7
@Faizan Làm thế nào là có liên quan? Điều đó cũng sai: không phải mọi trình duyệt sẽ tạo ra kết quả nhất quán cho lần đánh dấu này. Tùy thuộc vào loại tài liệu bạn sử dụng (và, một lần nữa, trình duyệt), điều này thậm chí có thể không chạy, và dẫn đến một lỗi xác thực.
Konrad Rudolph

Tôi thấy rằng một số trình duyệt đủ hiệu quả để chạy mã không hợp lệ. đó là lý do tại sao nó chạy Bạn có thể giới thiệu cho tôi một trình xác nhận tốt cho HTML không?
Faizan

6
"Hãy thận trọng trong những gì bạn làm và tự do trong những gì bạn chấp nhận" vi.wikipedia.org/wiki/Robustness_principl
jldupont 28/03/13

5
Chào mừng bạn đến căng tin súp. Các trình duyệt ăn HTML không hợp lệ là lý do rất tối ưu hóa nhưng các trình phân tích HTML kén chọn không phải là tiêu chuẩn. Mọi trình duyệt đều có giá trị muối (nghĩa là tương thích với 'HTML' ngoài kia) sử dụng thư viện 'loại súp' (nội bộ) nào đó để làm cho nó ngon miệng.
ack

8

Tầm quan trọng của "phần tử khối" được ngụ ý nhưng không bao giờ được nêu rõ ràng. Nếu chúng ta bỏ qua tất cả các lý thuyết (lý thuyết là tốt) thì sau đây là một so sánh thực dụng. Sau đây là

<p>This paragraph <span>has</span> a span.</p>
<p>This paragraph <div>has</div> a div.</p>

sản xuất:

This paragraph has a span.

This paragraph

has
a div.

Đó là chương trình mà không chỉ cần một div không được sử dụng nội tuyến, nó chỉ đơn giản sẽ không tạo ra mong muốn ảnh hưởng.


6

Như đã đề cập trong các câu trả lời khác, theo mặc định divsẽ được hiển thị dưới dạng phần tử khối, trong khi spansẽ được hiển thị nội tuyến trong ngữ cảnh của nó. Nhưng không có bất kỳ giá trị ngữ nghĩa; chúng tồn tại để cho phép bạn áp dụng kiểu dáng và nhận dạng cho bất kỳ nội dung nào. Sử dụng các kiểu, bạn có thể thực hiện một divhành động như một spanvà ngược lại.

Một trong những phong cách hữu ích cho divinline-block

Ví dụ:

  1. http://dustwell.com/div-span-inline-block.html

  2. Hiển thị CSS: nội tuyến vs khối nội tuyến

Tôi đã từng inline-blockrất thành công trong các dự án web game.


3
Nếu chúng không có giá trị ngữ nghĩa, sẽ chỉ có một trong số chúng. Một cái có nghĩa là một phân chia cấp độ khối - cái còn lại, một dòng nội tuyến
Chris Marasti-Georg

3

Div là một phần tử khối và span là một phần tử nội tuyến và chiều rộng của nó phụ thuộc vào nội dung của chính nó trong đó div không


3

Tôi sẽ nói rằng nếu bạn biết một chút tiếng Tây Ban Nha để xem trang này , nơi được giải thích chính xác.

Tuy nhiên, một định nghĩa nhanh sẽ divlà phân chia các phần và spanáp dụng một số kiểu cho một phần tử trong một phần tử khối khác như div.


Không cần biết tiếng Tây Ban Nha, phiên bản tiếng Anh là <span> - HTML | MDN .
dùng34660

3

Chỉ muốn thêm một số bối cảnh lịch sử vào làm thế nào để có được spanvsdiv

Lịch sử của span:

Vào ngày 3 tháng 7 năm 1995, Benjamin CW Sittler đề xuất một thẻ chứa văn bản chung để áp dụng các kiểu cho các khối văn bản nhất định. Kết xuất là trung tính trừ khi được sử dụng cùng với biểu định kiểu. Có một cuộc tranh luận xung quanh so với về khả năng đọc, ý nghĩa. Bert Bos đang đề cập đến bản chất mở rộng của phần tử thông qua thuộc tính lớp (với các giá trị như thành phố, người, ngày, v.v.). Paul Prescod lo lắng rằng cả hai yếu tố sẽ bị lạm dụng. Ông phản đối văn bản đề cập rằng "bất kỳ yếu tố mới nào cũng nên có trên một yếu tố cũ" và thêm "Nếu chúng tôi tạo một thẻ không có ngữ nghĩa, nó có thể được sử dụng bất cứ nơi nào mà không bao giờ sai.Chúng ta phải buộc các tác giả gắn thẻ đúng ngữ nghĩa của tài liệu của họ. Chúng ta phải buộc các nhà cung cấp biên tập viên đưa ra lựa chọn đó rõ ràng trong giao diện của họ. "

- Nguồn (wiki w3)

Từ dự thảo RFC giới thiệu span:

Đầu tiên, cần có một người nhận chung chung để mang các thuộc tính LANG và BIDI trong trường hợp không có yếu tố nào khác phù hợp; ele SPAN được giới thiệu cho mục đích đó.

- Nguồn (Dự thảo IETF)

Lịch sử của div:

Các phần tử DIV có thể được sử dụng để cấu trúc các tài liệu HTML dưới dạng phân cấp các bộ phận.

...

TRUNG TÂM đã được Netscape giới thiệu trước khi họ thêm hỗ trợ cho phần tử DIV HTML 3.0. Nó được giữ lại trong HTML 3.2 trên tài khoản triển khai rộng rãi của nó.

Thông số kỹ thuật HTML 3.2

Tóm lại, cả hai yếu tố nảy sinh từ nhu cầu về một thùng chứa chung hơn về mặt ngữ nghĩa. Span đã được đề xuất như là một thay thế chung hơn cho một <text>yếu tố để phong cách văn bản. Div được đề xuất như một cách chung để phân chia các trang và có thêm lợi ích của việc thay thế <center>thẻ cho nội dung căn chỉnh trung tâm. Div luôn là một thành phần khối vì lịch sử của nó là một bộ chia trang. Span luôn là một yếu tố nội tuyến vì mục đích ban đầu của nó là kiểu dáng văn bản và ngày nay cả div và span đều có các yếu tố chung với các thuộc tính hiển thị khối và nội tuyến tương ứng.


2

Trong HTML có các thẻ thêm cấu trúc hoặc ngữ nghĩa vào nội dung. Ví dụ, <p>thẻ được sử dụng để xác định một đoạn văn. Một ví dụ khác là <ol>thẻ cho một danh sách được sắp xếp.

Khi không có thẻ phù hợp có sẵn trong HTML như được hiển thị ở trên, các thẻ <div><span>thường được sử dụng.

Các <div>thẻ được sử dụng để xác định một phần blocklevel / bộ phận của một tài liệu mà có một ngắt dòng cả trước và sau nó.

Ví dụ về nơi các thẻ div có thể được sử dụng là tiêu đề, chân trang, điều hướng, v.v. Tuy nhiên, trong HTML 5, các thẻ này đã được cung cấp.

Các <span>thẻ được sử dụng để xác định một inline phần / bộ phận của một tài liệu.

Ví dụ, thẻ span có thể được sử dụng để thêm chữ tượng hình nội tuyến vào một phần tử.


2

Hãy nhớ rằng, về cơ bản và chúng cũng không thực hiện bất kỳ chức năng nào. Họ không cụ thể về chức năng chỉ bằng các thẻ của họ .

Chúng chỉ có thể được tùy chỉnh với sự trợ giúp của CSS.

Bây giờ đến câu hỏi của bạn:

Thẻ SPAN cùng với một số kiểu dáng sẽ hữu ích khi giữ bên trong một dòng, nói trong một đoạn văn, trong html. Đây là loại mức độ dòng hoặc mức độ tuyên bố trong HTML.

Thí dụ:

<p>Am writing<span class="time">this answer</span> in my free time of my day.</p>

Chức năng thẻ DIV như đã nói chỉ có thể được nhìn thấy được hỗ trợ bằng kiểu dáng, có thể chứa các đoạn mã HTML lớn.

DIV là cấp Khối

Thí dụ:

    <div class="large-time">
    <p>Am writing <span class="time"> this answer</span> in my free time of my day. 
    </p>
    </div>

Cả hai đều có thời gian và trường hợp của họ khi được sử dụng, dựa trên yêu cầu của bạn.

Hy vọng là rõ ràng với câu trả lời. Cảm ơn bạn.


Câu trả lời lý tưởng mà tôi đã tìm kiếm.
PHPFan
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.