2009-04-14 31 views
39

Tôi biết việc đặt phần tử khối bên trong phần tử nội tuyến là sai, nhưng điều gì sau đây?Có sai khi thay đổi phần tử khối thành nội dòng bằng CSS nếu nó chứa một phần tử khối khác không?

Hãy tưởng tượng đánh dấu hợp lệ này:

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

Bây giờ thêm CSS này:

div { 
    display:inline; 
} 

Điều này tạo ra một tình huống mà một phần tử nội tuyến có chứa một yếu tố ngăn chặn (The div trở thành inline và p là khối theo mặc định)

Các yếu tố trang vẫn hợp lệ?

Chúng tôi đánh giá như thế nào và khi nào HTML hợp lệ - trước hoặc sau khi áp dụng các quy tắc CSS?

UPDATE: Tôi đã kể từ khi biết được rằng trong HTML5 nó là hoàn toàn hợp lệ để đưa các yếu tố mức khối bên trong thẻ liên kết ví dụ:

<a href="#"> 
     <h1>Heading</h1> 
     <p>Paragraph.</p> 
</a> 

Đây thực sự là thực sự hữu ích nếu bạn muốn có một khối lượng lớn các HTML là một liên kết.

+2

Tôi rất vui vì html5 coi mã này hợp lệ, nhưng mã hợp lệ không phải là tất cả nội dung trên web. Các Googles sử dụng mã trông giống như súp thẻ bị hỏng khủng khiếp, nhưng nó hoạt động. – JKirchartz

Trả lời

22

Từ CSS 2.1 Spec:

Khi một hộp inline chứa một hộp khối cấp trong dòng chảy, hộp inline (và tổ tiên inline của mình trong cùng một hộp line) bị phá vỡ xung quanh hộp khối cấp (và bất kỳ anh chị em cấp khối nào liên tiếp hoặc được phân tách chỉ bằng khoảng trống có thể đóng lại và/hoặc các phần tử ngoài dòng), chia hộp nội tuyến thành hai hộp (ngay cả khi hai bên trống), một ở mỗi bên của khối -ống hộp (es). Các hộp dòng trước khi ngắt và sau khi ngắt được bao bọc trong các hộp khối ẩn danh và hộp cấp khối trở thành anh chị em của các hộp ẩn danh đó. Khi một hộp nội tuyến bị ảnh hưởng bởi vị trí tương đối, bất kỳ bản dịch kết quả nào cũng sẽ ảnh hưởng đến hộp cấp khối chứa trong hộp nội tuyến.

Mô hình này sẽ được áp dụng trong ví dụ sau nếu các quy tắc sau:

p { display: inline } 
span { display: block } 

đã được sử dụng với tài liệu HTML này:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 
<HEAD> 
    <TITLE>Anonymous text interrupted by a block</TITLE> 
</HEAD> 
    <BODY> 
    <P> 
     This is anonymous text before the SPAN. 
     <SPAN>This is the content of SPAN.</SPAN> 
     This is anonymous text after the SPAN. 
    </P> 
    </BODY> 

Yếu tố P có chứa một đoạn (C1) của văn bản ẩn danh theo sau là một phần tử cấp khối theo sau bởi một đoạn văn bản ẩn danh (C2) khác. Các hộp kết quả sẽ là một hộp khối biểu diễn BODY, chứa một hộp khối ẩn danh quanh C1, hộp khối SPAN và một hộp khối ẩn danh khác xung quanh C2.

Thuộc tính của hộp ẩn danh được kế thừa từ hộp không ẩn danh kèm theo (ví dụ: trong ví dụ ngay bên dưới tiêu đề phụ "Hộp chặn ẩn danh", hộp dành cho DIV). Các thuộc tính không được kế thừa có giá trị ban đầu của chúng. Ví dụ: phông chữ của hộp ẩn danh được kế thừa từ DIV, nhưng lợi nhuận sẽ là 0.

Thuộc tính được đặt trên các yếu tố gây ra hộp khối ẩn danh được tạo vẫn áp dụng cho hộp và nội dung của phần tử đó. Ví dụ: nếu đường viền đã được đặt trên phần tử P trong ví dụ trên, đường viền sẽ được vẽ xung quanh C1 (mở ở cuối dòng) và C2 (mở ở đầu dòng).

Một số đại lý người dùng đã triển khai đường viền trên dòng nội tuyến chứa các khối theo cách khác, ví dụ: bằng cách gói các khối lồng nhau đó vào "hộp dòng ẩn danh" và do đó vẽ đường viền nội tuyến xung quanh các hộp đó. Vì CSS1 và CSS2 không xác định hành vi này, các tác nhân người dùng chỉ CSS1 và CSS2 có thể triển khai mô hình thay thế này và vẫn yêu cầu sự phù hợp với phần này của CSS 2.1. Điều này không áp dụng cho UA được phát triển sau khi đặc điểm kỹ thuật này được phát hành.

Làm như vậy bạn sẽ làm gì. Rõ ràng hành vi được chỉ định trong CSS, mặc dù hành vi đó bao gồm tất cả các trường hợp hoặc được triển khai nhất quán trên các trình duyệt hiện tại không rõ ràng.

+0

Chỉ để làm rõ, có vẻ như với tôi nó không phải là sai, nhưng một phần của đặc tả css mà bạn 'có thể'. Nó đòi hỏi thêm công việc trên trình duyệt để tạo các khối ẩn danh. Cũng không nhất quán trên các trình duyệt web. – Chad

0

Tôi không biết hết đầu nếu điều này xác thực bất kỳ quy tắc nào nhưng tôi khuyên bạn nên sử dụng W3C HTML ValidatorW3C CSS Validator để xác định điều đó. Hy vọng điều này là hữu ích!

-1

Tôi nghĩ, (x) html là hợp lệ, css hợp lệ. Kết quả có hợp lệ không? Có, nếu nó đang tìm kiếm trong trình duyệt như bạn muốn.

+0

Sự cố khi sử dụng trình duyệt để xác thực mã là bạn cần phải xác thực lại trang cho mỗi phiên bản mới của mọi trình duyệt trên mọi hệ thống mà bạn muốn trang hoạt động ... – Guffa

+0

Vâng, đó là vấn đề thực sự. Trình duyệt không phải là trình duyệt tính hợp lệ :) Và tôi nghĩ, câu hỏi về xác thực kết quả HTML + CSS là một câu hỏi về hương vị. Nhân tố con người. –

15

Bất kể nó có hợp lệ hay không, cấu trúc phần tử sai. Lý do bạn không đặt các phần tử khối bên trong các phần tử nội tuyến là để trình duyệt có thể hiển thị các phần tử theo cách dễ dàng dự đoán được.

Thậm chí nếu nó không vi phạm bất kỳ quy tắc nào cho HTML hoặc CSS, nó vẫn tạo ra các yếu tố không thể hiển thị như dự định. Trình duyệt phải xử lý các phần tử giống như mã HTML không hợp lệ.

+3

vì vậy sau đó bạn làm gì, khi bạn cần toàn bộ một hàng trong một bảng có thể nhấp được? – mgPePe

+2

@mgPePe: Có một số tùy chọn. Bạn có thể đặt liên kết trong mọi ô trong hàng, bạn có thể sử dụng Javascript để nắm bắt sự kiện nhấp chuột trên hàng hoặc bạn có thể sử dụng thứ gì đó khác với bảng. – Guffa

+0

Vâng, JS là một giải pháp tốt. Những gì tôi đã kết thúc làm là có một 'a' với lồng nhau' span display = "block" 'theo ví dụ này: http://www.jakpsatweb.cz/css/css-vertical-center-solution.html – mgPePe

2

HTML được xác thực độc lập với CSS, vì vậy trang sẽ vẫn hợp lệ. Tôi khá chắc chắn rằng CSS spec nói gì về nó, nhưng không báo cho tôi về điều đó. Tuy nhiên, tôi sẽ rất cẩn thận bằng cách sử dụng một kỹ thuật như thế này, như thể nó có thể hiển thị như dự định trong một số trình duyệt, bạn cần kiểm tra tất cả chúng - tôi không thấy nhiều sự bảo đảm được thực hiện.

5

HTML và CSS sẽ vẫn hợp lệ. Lý tưởng nhất, bạn sẽ không phải làm một cái gì đó như thế này, nhưng bit cụ thể của CSS thực sự là một cách hữu dụng (và cú pháp hợp lệ nhưng không có ngữ nghĩa) để nhận được lỗi lợi nhuận kép của Internet Explorer mà không cần đến các bảng định kiểu có điều kiện hoặc hack. CSS của bạn. HTML (X) có giá trị ngữ nghĩa nhiều hơn CSS, vì vậy điều quan trọng hơn là CSS có giá trị ngữ nghĩa. Trong tâm trí của tôi, nó có thể chấp nhận được vì nó giải quyết một vấn đề trình duyệt gây phiền nhiễu mà không làm mất hiệu lực mã của bạn.

1

Các yếu tố trang vẫn hợp lệ?

"Hợp lệ" theo nghĩa HTML, có; HTML không biết gì về CSS.

Kết xuất bạn nhận được trong trình duyệt, tuy nhiên, là ‘không được xác định’ bởi đặc tả CSS, vì vậy nó có thể trông giống như bất cứ thứ gì. Mặc dù bạn có thể bao gồm quy tắc như vậy trong CSS hacks nhằm vào một trình duyệt cụ thể (nơi bạn biết cách trình duyệt hiển thị trường hợp này), nó không nên được phân phát cho các trình duyệt nói chung.

+1

và hỏi bạn ... làm cách nào để bạn tạo một hàng toàn bộ một bảng có thể nhấp được? – mgPePe

+0

@mgPePe: Bạn đặt một liên kết trong mỗi ô và đặt nó thành 'display: block' để nó lấp đầy chiều rộng của ô. – bobince

+0

2 câu hỏi phát sinh: tôi có thể có ' [..more spans]' và sau đó: tôi có thể đặt 'vertical-align: middle' vào khối span, liệu có giá trị? – mgPePe

-1

Không, Đó không phải là lựa chọn sai. Chúng tôi có thể sử dụng theo yêu cầu.

-1

Nếu có một logic bạn làm theo và bạn kết thúc việc thực hiện nó như thế này, nó KHÔNG VIẾT. Những thứ làm việc không phải là "sai" chỉ vì chúng kỳ lạ. Có, nó khá bất thường nhưng nó HELPS và nó không phải là một sai lầm. Đó là cố ý. HTML và CSS sẽ phục vụ bạn, không phải là cách khác vì vậy đừng bao giờ lắng nghe ý kiến ​​nói rằng bạn không làm điều đó chỉ vì nó xấu xí.

Đó là điển hình để gọi một giải pháp "không hợp lệ" và đề xuất một chặng đường dài quanh khối. Đôi khi bạn có thể suy nghĩ lại những gì bạn đã làm. Nhưng có thể có nhiều lý do cho những gì bạn đã làm và họ không xem xét chúng.

Tôi thường xuyên sử dụng các khối bên trong nội tuyến. Đó là hợp lệ và nó hoạt động - nó chỉ là không cần thiết trong hầu hết các trường hợp. Vì vậy, những gì. Hãy nhớ rằng khi XHTML yêu cầu chúng tôi luôn đặt dấu ngoặc kép quanh các thuộc tính (và mọi người đã hét vào bạn nếu bạn không làm như vậy!), Bây giờ HTML5 cho phép bỏ qua chúng nếu không có không gian bên trong. Điều gì đã xảy ra với dấu gạch chéo cuối cùng sau các thẻ số ít? "< br/>"? Nào. Thay đổi tiêu chuẩn. Nhưng các trình duyệt vẫn tiếp tục hỗ trợ những thứ không chuẩn. CENTER không được chấp nhận; chúng tôi vào năm 2013 và nó vẫn hoạt động. BẢNG để định tâm dọc? Đôi khi đó là cách duy nhất. DIV bên trong A để làm cho nó di chuột như bạn lên kế hoạch? Cứ tiếp tục đi.

Tập trung vào những điều quan trọng.

Các vấn đề liên quan