2012-06-26 22 views
8

Tôi lấy một trang có DTD là HTML4 Chuyển tiếp và thay đổi kiểu tài liệu thành <!DOCTYPE html> và thêm khoảng trống xuất hiện giữa h1 và div bên dưới nó. Tôi đã không thực hiện bất kỳ thay đổi nào khác để đánh dấu hoặc CSS.HTML5 vs HTML4 - thẻ h1 được hiển thị với không gian thừa - cách xóa?

Ví dụ JSFiddle: http://jsfiddle.net/ngordon/vSqkg/3/.

Nếu bạn thay đổi loại tài liệu từ HTML5 thành HTML4 Chuyển tiếp, bạn có thể thấy không gian thừa xuất hiện và biến mất ngay cả khi đánh dấu và CSS giống hệt nhau.

Bất kỳ ý tưởng nào về cách loại bỏ không gian đó?

Trả lời

11

HTML 4,01 DOCTYPE chuyển tiếp gây Hầu như tiêu chuẩn chế độ trong các trình duyệt. Tài liệu HTML5 gây ra chế độ Chuẩn.

Bài viết này của Microsoft giải thích sự khác biệt: http://msdn.microsoft.com/en-us/library/ff405794%28v=vs.85%29.

Nó nói rằng cho chế độ Hầu Tiêu chuẩn:

yếu tố góp phần Inline so với Line height khi và chỉ khi một trong những sau đây là đúng.

Nếu các yếu tố:

  • Có ký tự văn bản

  • Có một ranh giới khác không rộng

  • Có một lề khác không

  • Có một đệm khác không

  • Có một hình nền

  • đã vertical-align thiết lập một giá trị khác hơn là cơ sở

Lưu ý rằng một ngắt dòng không được xem là một nhân vật văn bản cho định nghĩa này trừ khi nó là nội dung duy nhất của một hộp đường. Trong trường hợp đó, chiều cao hộp dòng vẫn là trên cùng của hộp nội tuyến trên cùng và dưới cùng của dòng nội tuyến thấp nhất trên dòng, bất kể chiều cao dòng được chỉ định là .

Nếu phần tử img là nội dung duy nhất của ô bảng, hộp dòng chiều cao của chiều cao hộp dòng ô được điều chỉnh về 0.

Nghiêm trọng nhất trong trường hợp của bạn, có nghĩa là việc tính chiều cao của dòng chứa hình ảnh không bao gồm strut, yếu tố nội tuyến tưởng tượng sẽ tăng chiều cao dòng lên giá trị chiều cao dòng phần tử h1.

jsfiddle Điều này cho thấy một span yếu tố thực sự với một &nbsp; như nội dung văn bản thực đứng cho strut, và bạn có thể thấy rằng cách bố trí giống với cả một loại tài liệu được chuyển tiếp HTML 4,01 và một DOCTYPE HTML5.

jsfiddle Điều này cho thấy ý tưởng tương tự, chỉ có thời gian này, các thanh chống được chế tạo sử dụng CSS, như thế này:

h1:before { 
    content: '\A0'; 
} 

Trong trường hợp câu trả lời Khurram, những gì ông đang làm là giảm line-height của h1 và do đó, ở chế độ tiêu chuẩn, chiều cao của thanh chống nhỏ hơn chiều cao của hình ảnh. Điều này có nghĩa là chiều cao của toàn bộ đường thẳng được xác định bởi chiều cao của hình ảnh chứ không phải chiều cao của đường kẻ. Chiều cao của hình ảnh là như nhau trong cả hai tiêu chuẩn và chế độ tiêu chuẩn gần như vậy một lần nữa, bạn không thấy một sự khác biệt trong rendering giữa các chế độ.

Đối với lý do tại sao đặt chiều cao dòng của h1 để khớp với chiều cao của hình ảnh (25px) không hoạt động nhưng đặt nó thành 12px, đó là do strut thiết lập không chỉ trên cùng và dưới cùng, nhưng cũng là đường cơ sở cho dòng. Đường cơ sở cao hơn một chút so với phía dưới để cho phép các con cháu văn bản, cho văn bản kích thước thông thường thường là khoảng 3px. Hình ảnh theo mặc định nằm trên đường cơ sở để khoảng cách giữa đường cơ sở và đáy được thêm vào chiều cao của hình ảnh để thiết lập chiều cao của đường.

Điều này có thể được giải quyết bằng cách di chuyển hình ảnh ra khỏi đường cơ sở, bằng cách sử dụng img { vertical-align: top }, được hiển thị trong số jsfiddle này.Nếu bạn tinker với chiều cao dòng h1 ở đây, bạn sẽ thấy rằng các giá trị lớn hơn 25px tăng khoảng cách giữa các dòng, nhưng các giá trị từ 25px trở xuống không thay đổi khoảng cách đó.

+2

Câu trả lời hay, được nghiên cứu kỹ và giải quyết vấn đề gốc. – ForOhFor

+0

Tôi đã giải quyết điều này bằng cách đặt css của hình ảnh thành "display: block;" ... tuy nhiên trong một ngữ cảnh khác, điều này có thể không khả thi. – KnF

3

Bạn đã áp dụng đặt lại CSS http://meyerweb.com/eric/tools/css/reset/ vào css của mình trước khi bắt đầu áp dụng bất kỳ hiệu ứng css nào khác không?

+0

+1 cho bạn thân. –

+0

thậm chí với CSS đặt lại các sự cố "sự cố" xảy ra. – KnF

2

chỉ cần cung cấp cho line-height:12px; hoặc những gì bạn muốn.
TÌM KIẾM:JSFIDDLE. sửa đổi mã của bạn.

+0

Cảm ơn bạn! Nó hoạt động .. nhưng nó thực sự chỉ đánh lừa trình duyệt. Yếu tố đó chắc chắn cao hơn 12px. Tôi tự hỏi tại sao không gian đó xuất hiện ngay từ đầu, và nếu có cách nào tốt hơn để loại bỏ. – ForOhFor

3

Giao dịch lỗi của bạn với chiều cao dòng mặc định.

Quá trình chuyển đổi HTML4 bỏ qua các nội dung chiều cao dòng wrt H1 của bạn, cho ra một phần tử cao 25px. HTML5 đang tôn trọng chiều cao dòng của thẻ H1, tương đương với 29px.

+0

Nhưng rõ ràng chỉ định chiều cao dòng 25px không hoạt động. (Nó hoạt động khi bạn thay đổi nó thành 12px, nhưng điều đó có vẻ giống như một hack). Tại sao? – ForOhFor

0

Đây là lý do tại sao Boilerplate HTML5 có đặt lại CSS.

Bạn cũng có thể chỉ đặt div thành margin: 0; padding: 0; nhưng bạn sẽ phải làm cho mọi phần tử cho đến khi bạn nhấn tất cả. Câu trả lời về việc đặt lại CSS bởi Meyer trong chuỗi này là chính xác.

Dưới đây là một ví dụ về cách giải quyết: http://jsfiddle.net/mikelegacy/vSqkg/5/