Các vị trí thập phân trong chiều rộng CSS có được tôn trọng không?


225

Một cái gì đó tôi đã tự hỏi một lúc trong khi thiết kế CSS.

Các vị trí thập phân trong chiều rộng CSS có được tôn trọng không? Hay chúng được làm tròn?

.percentage {
  width: 49.5%;
}

hoặc là

.pixel {
  width: 122.5px;
}

Câu trả lời:


186

Nếu đó là chiều rộng phần trăm, thì có, nó được tôn trọng . Như Martin đã chỉ ra, mọi thứ sẽ bị phá vỡ khi bạn chuyển sang pixel phân đoạn, nhưng nếu giá trị phần trăm của bạn mang lại giá trị pixel nguyên (ví dụ: 50,5% của 200px trong ví dụ), bạn sẽ có hành vi được mong đợi, hợp lý.

Chỉnh sửa: Tôi đã cập nhật ví dụ để hiển thị những gì xảy ra với các pixel phân đoạn (trong Chrome, các giá trị được cắt bớt, vì vậy tất cả 50, 50,5 và 50,6 đều hiển thị cùng chiều rộng).


7
Bạn nói đúng về các giá trị phần trăm không được làm tròn, nhưng độ rộng pixel với vị trí thập phân và kết quả cuối cùng của phép tính tỷ lệ phần trăm sẽ luôn được làm tròn thành toàn bộ pixel :)
MartinodF

2
@MartinodF Cảm ơn bạn đã làm rõ. Đúng, các pixel được làm tròn, nhưng không xác định được chúng thực sự làm tròn đến gần nhất, sàn hay trần nhà (đó là ý nghĩa của "sự việc bị phá vỡ").
Skilldrick

1
@Skilldrick Tôi đã thử các pixel phân đoạn trong bản demo của bạn trên một số trình duyệt vì sự tò mò: cả IE9p7 và FF4b7 đều làm tròn pixel gần nhất, trong khi Opera 11b, Chrome 9.0.587.0 và Safari 5.0.3 cắt giảm giá trị. @andras Chỉ cần làm rõ: Tôi không nói rằng các giá trị bên trong được làm tròn, chỉ là các giá trị kết xuất cuối cùng là. Nếu bạn phóng to hoặc một số thành phần kế thừa các thuộc tính, v.v., vị trí thập phân đó sẽ được tính.
MartinodF

10
Cập nhật hiện đại: phiên bản Chrome 24 của tôi thực sự làm tròn các pixel phân đoạn. Xem jsFiddle, 50,5 và 50,6 đều làm tròn lên đến 51px, rộng hơn 1 pixel so với div 50px.
Michael Butler

5
Điều có thể quan trọng nhất cần lưu ý là cách các phần tử có kích thước pixel phân đoạn xếp cạnh nhau. Mặc dù chúng tự làm tròn một cách trực quan, nhưng chúng cũng không chiếm thêm không gian khi đặt cạnh các yếu tố có kích thước nhỏ khác: cssdesk.com/8R2rB
Sandy Gifford

53

Ngay cả khi số được làm tròn khi trang được vẽ, toàn bộ giá trị vẫn được giữ trong bộ nhớ và được sử dụng để tính toán con tiếp theo. Ví dụ: nếu hộp 100.4999px của bạn vẽ thành 100px, thì con của nó có chiều rộng 50% sẽ được tính là .5 * 100.4999 thay vì .5 * 100. Và như vậy đến mức sâu hơn.

Tôi đã tạo ra các hệ thống bố trí lưới lồng nhau sâu trong đó chiều rộng của cha mẹ là con cái và con cái là phần trăm và bao gồm tối đa bốn điểm thập phân ngược dòng có tác động đáng chú ý.

Trường hợp cạnh, chắc chắn, nhưng một cái gì đó để ghi nhớ.


2
Câu trả lời được chấp nhận là đầy đủ hơn câu trả lời này, nhưng giai thoại trong câu hỏi này cho tôi cảm giác tốt hơn về cách các ý nghĩa kỹ thuật sẽ làm cho chính họ cảm thấy. Cảm ơn đã đăng nó.
Tom

23

Mặc dù các pixel phân đoạn có thể xuất hiện để làm tròn trên các yếu tố riêng lẻ (như @SkillDrick thể hiện rất rõ) điều quan trọng cần biết là các pixel phân đoạn thực sự được tôn trọng trong mô hình hộp thực tế .

Điều này có thể được nhìn thấy tốt nhất khi các yếu tố được xếp cạnh nhau (hoặc trên đầu) của nhau; nói cách khác, nếu tôi đặt 400 div div cạnh nhau, chúng sẽ có cùng chiều rộng với một div 200 pixel. Nếu tất cả chúng thực sự được làm tròn lên tới 1px (khi nhìn vào các yếu tố riêng lẻ sẽ ngụ ý), chúng tôi hy vọng div 200px sẽ dài bằng một nửa.

Điều này có thể được nhìn thấy trong đoạn mã có thể chạy này:

body {
  color:            white;
  font-family:      sans-serif;
  font-weight:      bold;
  background-color: #334;
}

.div_house div {
  height:           10px;
  background-color: orange;
  display:          inline-block;
}

div#small_divs div {
  width:            0.5px;
}

div#large_div div {
  width:            200px;
}
<div class="div_house" id="small_divs">
  <p>0.5px div x 400</p>
  <div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div>
</div>
<br>
<div class="div_house" id="large_div">
  <p>200px div x 1</p>
  <div></div>
</div>


11
Liên quan đến kết xuất: trong ví dụ của bạn, bạn có hai div cạnh tranh cho mỗi pixel. Trong những trường hợp này, trình duyệt của bạn sẽ chọn một trong số chúng để hiển thị toàn bộ pixel - để tránh làm mờ và các đồ tạo tác kỳ lạ khác. Nếu bạn đặt một nửa pixel thành màu xanh lam, bằng cách sử dụng :nth-child(even)hoặc :nth-child(odd), bạn nhận thấy rằng toàn bộ màu đó là màu cam hoặc toàn bộ là màu xanh lam - không phải là hỗn hợp của màu xanh lam và màu cam (sẽ là một màu sắc mơ hồ màu tím).
Daan Wilmer

16

Chiều rộng sẽ được làm tròn thành số pixel nguyên .

Tôi không biết nếu mọi trình duyệt sẽ làm tròn nó theo cùng một cách. Tất cả họ dường như có một chiến lược khác nhau khi làm tròn tỷ lệ phần trăm pixel phụ. Nếu bạn quan tâm đến các chi tiết làm tròn pixel phụ trong các trình duyệt khác nhau, có một bài viết tuyệt vời về ElastiCSS .

chỉnh sửa : Tôi đã thử nghiệm bản demo của @ Skilldrick trong một số trình duyệt vì tò mò. Khi sử dụng các giá trị pixel phân đoạn (không phải là tỷ lệ phần trăm, chúng hoạt động như được đề xuất trong bài viết tôi đã liên kết) IE9p7 và FF4b7 dường như làm tròn đến pixel gần nhất, trong khi Opera 11b, Chrome 9.0.587.0 và Safari 5.0.3 cắt bớt các vị trí thập phân. Không phải là tôi hy vọng rằng họ có điểm chung sau tất cả ...


7

Họ dường như làm tròn các giá trị đến số nguyên gần nhất; nhưng tôi thấy sự không nhất quán trong chrome, safari và firefox.

Ví dụ: nếu 33,3% chuyển đổi thành 420,945px

chrome và firexfox hiển thị nó là 421px. trong khi safari hiển thị là 420px.

Điều này có vẻ như chrome và firefox tuân theo logic sàn và trần trong khi safari thì không. Trang này dường như thảo luận về cùng một vấn đề

http://ejohn.org/blog/sub-pixel-probols-in-css/


6

Các yếu tố phải vẽ thành một số pixel pixel và như các câu trả lời khác được đề cập, tỷ lệ phần trăm thực sự được tôn trọng.

Một lưu ý quan trọng là các pixel trong trường hợp này có nghĩa là pixel css , không phải pixel màn hình, do đó, một thùng chứa 200px với con 50,7499% sẽ được làm tròn thành pixel pixel 101px , sau đó được hiển thị lên 202px trên màn hình võng mạc chứ không phải 400 *. 507499 ~ = 203px.

Mật độ màn hình bị bỏ qua trong tính toán này và không có cách nào để vẽ * một yếu tố cho kích thước pixel phụ võng mạc cụ thể. Bạn không thể có nền hoặc viền của các phần tử được hiển thị ở kích thước pixel dưới 1 css , mặc dù kích thước của phần tử thực tế có thể nhỏ hơn 1 css pixel như Sandy Gifford đã hiển thị.

[*] Bạn có thể sử dụng một số kỹ thuật như bóng hộp bù 0,5, v.v., nhưng các thuộc tính mô hình hộp thực tế sẽ vẽ thành một pixel CSS đầy đủ.


Quan sát tuyệt vời
ngày
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.