2013-08-15 47 views
22

Tôi đã tạo một hộp phương thức và canh giữa nó bằng cách sử dụng technique Chris Coyer mentioned. Vấn đề duy nhất tôi đã tìm thấy với nó cho đến nay là đôi khi hộp được bù đắp bởi một nửa điểm ảnh, có thể làm cho một số trẻ em trông hơi sôi nổi. Câu hỏi của tôi là ,: có thể chụp kết quả cho toàn bộ pixel gần nhất không?Có thể "snap to pixel" sau khi dịch CSS không?

Cập nhật

Dưới đây là một vài hình ảnh để minh hoạ rõ hơn vấn đề này. Trong hình ảnh đầu tiên này, bạn sẽ nhìn thấy đầu vào văn bản và gạch dưới liên kết đã trả lại một cách chính xác:

Modal box with crisp lines

Hình ảnh thứ hai cho thấy tác dụng sau khi biến đổi CSS đã được sử dụng. Lưu ý sự mờ của đường gạch dưới liên kết và các đầu vào văn bản được hiển thị không chính xác.

enter image description here

Mặc dù hình ảnh thứ hai không hiển thị nó, thỉnh thoảng tôi nhận thấy các dòng trắng trên và dưới wit hiệu ứng mờ tương tự.

Đối với bản ghi, đầu vào văn bản được tạo kiểu bằng các đường viền đơn giản và màu nền. Tôi đã bao gồm CSS cho những đầu vào ở đây để bạn có thể thấy không có gì đặc biệt xảy ra:

input { 
    background-color: #FFFFFF; 
    border: 1px solid #CCCCCC; 
    border-radius: 0; 
    box-shadow: 0 1px 3px -1px #D5D5D5 inset; 
    color: #4C4C4C; 
    display: inline-block; 
    font-family: Arial,Helvetica,sans-serif; 
    font-size: 12px; 
    max-width: 100%; 
    padding: 5px; 
    transition: border-color 0.1s ease 0s; 
} 
+0

Bạn có thể mô tả ý của bạn bằng cách nào "các em trông có vẻ hơi hào nhoáng"? Bạn đang nói về vấn đề chống răng cưa? Bạn có thể chỉ cho chúng tôi một ảnh chụp màn hình hoặc tái tạo vấn đề trong jsFiddle không? – brianpeiris

+0

@brianpeiris Tôi đã thêm hình ảnh để giải thích rõ hơn câu hỏi –

+1

Thành thật mà nói, sự khác biệt hầu như không thể nhận thấy đối với tôi. Tôi đã sử dụng một công cụ so sánh hình ảnh và thực sự có nhiều khác biệt trong các tạo phẩm nén hơn so với các khác biệt thực tế (vì bạn đã lưu các ảnh chụp màn hình dưới dạng JPEG). Sẽ dễ trả lời câu hỏi của bạn hơn nếu bạn sao chép nó trong jsFiddle. – brianpeiris

Trả lời

4

Nếu bạn có thể tránh biến đổi 3d và sử dụng 2d biến thay vào đó, bản dịch sẽ chụp để pixel theo mặc định:

transform: translate(-50%, -50%); 

rendering is snapped to pixels

transform: translate3d(-50%, -50%, 0); 

rendering is anti-aliased

.210

JSBin:http://jsbin.com/epijal/3/edit

+10

Tôi đang sử dụng các biến đổi 2D nhưng tôi vẫn nhận được hiệu ứng. Thật kỳ lạ, kiểm tra liên kết trên trang này trong phiên bản Firefox của tôi (23) cho thấy cả hai cuộc biểu tình với các đường nét rõ ràng –

+3

Tôi cũng chỉ thấy vấn đề chống răng cưa trong Chrome. Firefox dường như có một thuật toán dựng hình khác nhau cho các trường hợp như thế này (tôi nghĩ). – brianpeiris

+3

Đó chắc chắn là sự cố Chrome và đã lâu rồi ... – BJury

6

Giải pháp chống đạn duy nhất là để đảm bảo rằng các yếu tố của bạn chiếm một số thậm chí của pixel. Nếu chiều cao (hoặc chiều rộng) không chia hết cho 2, thì nó sẽ cố gắng hiển thị phần tử của bạn trên một nửa pixel, gây ra sự mờ nhạt.

Firefox không có vấn đề này vì nó hỗ trợ hiển thị subpixel đúng. Vì vậy, mặc dù yếu tố của bạn là trên một nửa pixel, Firefox xử lý nó một cách thanh lịch.

Theo kinh nghiệm của tôi, Webkit thường snaps các yếu tố để các điểm ảnh gần nhất - (ví dụ, khi sử dụng letter-spacing tài sản) - vì vậy nó kinda lạ mà nó không hành xử theo cách tương tự cho translate.

0

Khi gặp phải vấn đề tương tự với subpixels trong Chrome và trong phiên bản 64, nó vẫn không thể xử lý các giá trị biến đổi subpixel, tôi quyết định viết tập lệnh js nhỏ, sửa lỗi subpixel. Bạn có thể tìm thấy nó trên github. Nó chỉ đơn giản làm tròn giá trị chuyển đổi thành pixel đầy đủ.

how subpixel works

Hope ai đó sẽ tìm thấy nó hữu ích!