Cách ngăn thay đổi kết xuất văn bản Webkit trong quá trình chuyển đổi CSS


81

Tôi đang sử dụng chuyển tiếp CSS để chuyển đổi giữa các trạng thái được chuyển đổi CSS (về cơ bản là chuyển đổi quy mô của một phần tử). Tôi nhận thấy rằng khi phần tử đang chuyển đổi, phần còn lại của văn bản trên trang (trong Webkit) có xu hướng thay đổi một chút kết xuất của nó cho đến khi quá trình chuyển đổi hoàn tất.

Fiddle: http://jsfiddle.net/russelluresti/UeNFK/

Tôi cũng nhận thấy rằng điều này không xảy ra trên các tiêu đề của tôi, có cặp thuộc -webkit-font-smoothing: antialiasedtính / giá trị trên chúng. Vì vậy, tôi tự hỏi, có cách nào để văn bản duy trì giao diện mặc định của nó (giá trị "tự động" để làm mịn phông chữ) và không thay đổi kết xuất trong quá trình chuyển đổi hay không.

Tôi đã thử đặt văn bản một cách rõ ràng để sử dụng giá trị "tự động", nhưng điều đó không làm được gì. Tôi cũng nên lưu ý rằng việc đặt làm mịn phông chữ thành "không có" cũng ngăn cản việc hiển thị nhấp nháy trong quá trình chuyển đổi.

Bất kỳ trợ giúp được đánh giá cao.

Chỉnh sửa 1

Tôi nên lưu ý rằng tôi đang sử dụng OS X. Trong khi xem xét thử nghiệm của tôi trong Chrome trên Parallels, tôi không thấy hai đoạn văn bản khác nhau hoạt động khác nhau, vì vậy đây có thể là vấn đề dành riêng cho máy Mac.


21. Và phiên bản Safari là 6. Nó xảy ra trên cả hai trình duyệt, khiến tôi nghĩ đó là Webkit, chứ không phải trình duyệt.
RussellUresti 19/09/12

cả đoạn antialiased và aliased đang thể hiện cùng một hành vi. Phiên bản chrome 23.0.1270.0 canary | 21.0.1180,89 m | 5,17 safari

Tôi đoán bạn đang sử dụng bản phát hành Chrome dành cho nhà phát triển. Mặc dù vậy, hệ điều hành có thể đóng một vai trò trong việc này. Tôi sẽ chỉnh sửa câu hỏi để lưu ý rằng tôi đang sử dụng OSX.
RussellUresti 19/09/12

1
Tôi hoàn toàn không biết lý do tại sao điều này hoạt động, nhưng thêm '-webkit-biến đổi: translateZ (0);' thành '.antialiased {} dường như sửa được. Nó thậm chí hoạt động nếu bạn thêm nó vào 'p {}'. Vì tôi không thể giải thích lý do tại sao điều này hoạt động, tôi cảm thấy không đúng khi cung cấp nó như một câu trả lời. Hy vọng rằng sẽ giúp!
Christofer Vilander,

@Christofer Điều đó làm cho chúng nhất quán - nhưng nó làm cho tất cả chúng có vẻ chống răng cưa (chúng đều là văn bản mỏng hơn). Tôi đang cố gắng làm cho văn bản chưa được khử răng cưa (đoạn đầu tiên) vẫn ở kiểu mặc định của nó (hiển thị đậm hơn một chút so với văn bản đã khử răng cưa).
RussellUresti 20/09/12

Câu trả lời:


83

Tôi nghĩ rằng tôi đã tìm thấy một giải pháp:

-webkit-transform: translateZ(0px);

Buộc tăng tốc phần cứng trên phần tử mẹ dường như giải quyết được vấn đề ...

CHỈNH SỬA Như đã nhận xét, bản hack này vô hiệu hóa tính năng làm mịn phông chữ và có thể làm giảm khả năng hiển thị văn bản tùy thuộc vào phông chữ, trình duyệt và hệ điều hành của bạn!


Đã thử làm mịn phông chữ và nó không hoạt động. Đã thử điều này, nó hoạt động hoàn hảo
locrizak

Điều này không mang lại cho tôi kết quả mong muốn cho vấn đề đã nêu này, nhưng điều này đã giúp khắc phục các sự cố chuyển tiếp CSS khác mà tôi gặp phải (như văn bản nhấp nháy kỳ lạ khi ẩn / hiển thị nội dung trong phần tử chuyển tiếp).
RussellUresti

3
Không hiệu quả với tôi trong khi -webkit-font-smoothing: antialiased; và -webkit-backface-vision: ẩn; làm. Tín dụng đến đây stackoverflow.com/questions/11589985/…
F Lekschas

1 tuyệt vời, đây là phương pháp duy nhất mà làm việc cho tình hình tôi thấy bản thân mình trong
Larry

4
Điều này sẽ tắt làm mịn phông chữ ngay từ đầu. Vì vậy, bạn không làm mịn phông chữ khi bắt đầu chuyển đổi, không làm mịn phông chữ khi chuyển đổi và không làm mịn phông chữ ở cuối. Vì vậy, không có thay đổi làm mịn phông chữ, nhưng cũng không làm mịn phông chữ nào cả.
yunzen

45

CẬP NHẬT tháng 8 năm 2020

Bạn không còn cần phải nhắm mục tiêu Safari bằng truy vấn phương tiện để bật làm mịn phông chữ subpixel. Mặc định là ổn.

Tuy nhiên , mặc dù nó sử dụng làm mịn phông chữ subpixel theo mặc định, nhưng có một sự thay đổi đáng kể trong thuốc mỡ trong việc làm mịn phông chữ của Chrome , đối với bất kỳ ai đang tìm kiếm một kết xuất văn bản nhất quán .

  1. Đây là cách Chrome hiển thị văn bản sáng trên nền tối sáng tối
  2. Đây là cách Chrome hiển thị văn bản tối trên nền sáng tối sáng

Nhìn vào kích thước của tổng thể trong chữ e ở trên. Văn bản sáng trên nền tối được hiển thị với trọng lượng nặng hơn có thể cảm nhận được so với văn bản tối trên nền sáng (với kiểu phông chữ css giống hệt nhau).

Một giải pháp, đối với các trang web tôn trọng cài đặt chủ đề tối / sáng của người dùng, là nhắm mục tiêu Chrome bằng một truy vấn phương tiện được giới hạn ở chế độ tối và chuyển nó sang làm mịn không subpixel như sau:

@media screen
and (-webkit-min-device-pixel-ratio: 0)
and (min-resolution: 0.001dpcm)
and (prefers-color-scheme: dark) {
  body {
    -webkit-font-smoothing: antialiased;
  }
}

Kết quả :

tối sángsáng trên tối chống răng cưa

Trọng lượng văn bản nhất quán hơn nhiều bất kể hiển thị ánh sáng trên bóng tối hay tối trên ánh sáng.

Kiểm tra so sánh song song của trước và sau: sáng tốisáng trên tối chống răng cưa

-

CẬP NHẬT tháng 5 năm 2018

-webkit-font-smoothing: subpixel-antialiasedbây giờ không có hiệu lực trong Chrome nhưng trong Safari, nó vẫn cải thiện mọi thứ rất nhiều NHƯNG CHỈ DUY NHẤT KHI QUAY LẠI. Không có nó trong Safari trên màn hình retina, văn bản mỏng và vô vị, trong khi với nó, văn bản có trọng lượng thích hợp. Nhưng nếu bạn sử dụng tính năng này trên các màn hình không có võng mạc trong Safari, (đặc biệt là ở các giá trị trọng lượng nhẹ) thì văn bản là một thảm họa. Thực sự khuyên bạn nên sử dụng truy vấn phương tiện:

@media screen and (-webkit-min-device-pixel-ratio: 2) {
  body {
    -webkit-font-smoothing: subpixel-antialiased;
  }
}

Cài đặt rõ ràng -webkit-font-smoothing: subpixel-antialiasedlà giải pháp tốt nhất hiện tại nếu bạn muốn ít nhất một phần tránh được văn bản khử răng cưa mỏng hơn.

--tl; dr--

Với cả Safari và Chrome, nơi hiển thị phông chữ mặc định sử dụng khử răng cưa phụ, bất kỳ CSS nào buộc hiển thị dựa trên GPU, như các đề xuất ở trên sử dụng chuyển đổi bằng translateZ hoặc thậm chí chỉ là chuyển đổi tỷ lệ, sẽ khiến Safari và Chrome tự động "bỏ cuộc "trên cách làm mịn phông chữ subpixel-antialiased và thay vào đó chuyển sang chỉ văn bản khử răng cưa, trông nhẹ và mỏng hơn rất nhiều, đặc biệt là trên Safari.

Các phản hồi khác đã tập trung vào việc duy trì kết xuất liên tục bằng cách đơn giản đặt hoặc buộc làm mịn phông chữ cho văn bản mỏng hơn. Đối với mắt tôi, việc sử dụng translateZ hoặc backface ẩn làm giảm đáng kể chất lượng hiển thị văn bản và giải pháp tốt nhất nếu bạn muốn văn bản luôn nhất quán và bạn có thể sử dụng văn bản mỏng hơn -webkit-font-smoothing: antialiased. Tuy nhiên, cài đặt rõ ràng -webkit-font-smoothing: subpixel-antialiasedthực sự có một số ảnh hưởng - văn bản vẫn thay đổi một chút và mỏng hơn rõ ràng trong quá trình chuyển đổi được hiển thị trên GPU nhưng không mỏng như khi không có cài đặt này. Vì vậy, nó có vẻ như điều này ít nhất một phần ngăn chặn việc chuyển sang văn bản chống liên kết thẳng.


2
Cảm ơn vì một bài viết tuyệt vời!
Denis Gorbachev

2
Đây là giải pháp tốt nhất. Tất cả những thứ khác làm suy giảm kết xuất văn bản, đó là điều mà OP đặc biệt yêu cầu tránh
fregante

Cứu mạng cho tôi! Cảm ơn. Tránh đột ngột chuyển sang hiển thị pixel phụ sau khi chuyển đổi css. Ít nhất với quá trình chuyển đổi độ mờ, điều này giữ cho phông chữ trên (về mặt lý thuyết luôn là mặc định) hiển thị pixel phụ ngay cả trong quá trình chuyển đổi. Tuyệt quá!
Garavani

giải pháp tốt nhất cho chúng tôi! Cảm ơn bạn
kernel

Cảm ơn, tôi đã xem qua điều này hơn một năm trước và đã quên tất cả về nó. Đây là giải pháp duy nhất giải quyết vấn đề được mô tả cho tôi.
Iain Collins

20

Tôi đã nhận thấy điều đó khá nhiều mỗi khi gặp sự cố đồ họa (chập chờn / nói lắp / cho bất hạnh / v.v.) do chuyển đổi, sử dụng -webkit-backface -ibility: hidden; trên các yếu tố đang hoạt động có xu hướng giải quyết vấn đề.


3
Đây là câu trả lời (hiện tại) chính xác. Theo hiểu biết của tôi, tính năng làm mượt phông chữ trên web đã bị xóa cách đây một thời gian, đáng lẽ sẽ được thêm lại, nhưng hiện không hoạt động đối với tôi trong phiên bản Chrome mới nhất. Thủ thuật translateZ dường như không còn hoạt động nữa. Tôi đoán điều này có thể thay đổi lại bất cứ lúc nào. : /
Mantriur

3
Điều này làm cho một số văn bản trở nên mờ đối với tôi.
John

8

Để ngăn các thay đổi hiển thị văn bản do tăng tốc phần cứng, bạn có thể:

  1. Đặt tất cả văn bản thành -webkit-font-smoothing: antialiased. Điều này có nghĩa là văn bản mỏng hơn và không được khử răng cưa của pixel phụ.

  2. Nếu bạn muốn văn bản đang bị ảnh hưởng bởi tăng tốc phần cứng được khử răng cưa điểm ảnh phụ (kiểu làm mịn phông chữ mặc định), thì việc đặt văn bản đó vào bên trong đầu vào, không có đường viền và bị vô hiệu hóa, sẽ giữ cho điểm ảnh phụ đó được khử răng cưa (ít nhất là trên Chrome trên Mac OS X). Tôi chưa thử nghiệm điều này trên các nền tảng khác, nhưng nếu khử răng cưa điểm ảnh phụ là quan trọng, thì ít nhất bạn có thể sử dụng thủ thuật này.


Tôi đã thử nghiệm tùy chọn 2 (thủ thuật với phần tử đầu vào) trên Win8.1 và Chrome 47 và nó không hoạt động.
Paya


3

Đây là những gì làm việc cho tôi. Hy vọng nó giúp. Tìm thấy trong bài đăng stackoverflow khác.

-webkit-font-smoothing:antialiased;
-webkit-backface-visibility:hidden;

1

Để ngăn thay đổi kết xuất, bạn cần đặt font-smoothing: antialiased(hoặc none).

Việc trình duyệt tắt hiển thị phông chữ subpixel có thể là một tác dụng phụ của việc tăng tốc phần cứng. Khi nền bạn đang hiển thị liên tục thay đổi, văn bản không thể được hiển thị trên một lớp riêng biệt, vì mỗi khung phải được kiểm tra dựa trên tất cả các lớp nền. Điều này có thể làm giảm hiệu suất nghiêm trọng.

Apple thường tắt tính năng làm mịn phông chữ subpixel trên các trang web của riêng họ .


Vấn đề với việc đặt làm mịn phông chữ thành chống răng cưa là văn bản trông không giống như tôi muốn. Tôi muốn hiệu ứng hình ảnh của việc đặt làm mịn phông chữ thành "tự động" (giao diện đậm hơn) - nhưng khi bạn làm điều này, văn bản sẽ thay đổi trong bất kỳ quá trình chuyển đổi nào. Vì vậy, mục tiêu của tôi là luôn duy trì vẻ ngoài táo bạo của "tự động".
RussellUresti

1
Bạn có thể khắc phục nó bằng cách không sử dụng tăng tốc phần cứng. Sử dụng bộ đếm thời gian trong jQuery và thực hiện chuyển đổi bằng tay (không có chuyển tiếp CSS). Tuy nhiên, tôi không chắc mình sẽ giới thiệu nó vì hiệu suất và độ mượt mà sẽ kém hơn.
Henrik

Đúng, tôi chỉ có thể sử dụng jQuery để tạo hiệu ứng cho nó ... Đó có thể là giải pháp duy nhất nếu không có giải pháp nào khác.
RussellUresti 24/09/12

1

Ngoài các giải pháp trên ( -webkit-transform: translateZ(0px)trên phần tử và -webkit-font-smoothing: antialiasedtrên trang), một số phần tử vẫn có thể hoạt động không tốt. Đối với tôi, đó là văn bản giữ chỗ trong phần tử đầu vào: Đối với điều này, hãy sử dụngposition:relative


-1

Tôi đã từng gặp vấn đề tương tự. Đọc nó cẩn thận:

Tôi nhận thấy rằng khi phần tử đang chuyển đổi, phần còn lại của văn bản trên trang (trong Webkit) có xu hướng thay đổi một chút kết xuất của nó cho đến khi quá trình chuyển đổi hoàn tất.

không có giải pháp nào ở trên dường như hoạt động. Tuy nhiên, cài đặt (những thứ như)

#myanimation { -webkit-transform: translateZ(0px); }

trên phần tử có hoạt ảnh đã hoạt động.

Bằng cách đưa phần tử động vào lớp GPU, bạn đưa nó ra khỏi quy trình hiển thị trang bình thường (ví dụ: những thứ như z-index cũng sẽ không hoạt động nữa). Như một hiệu ứng phụ, hoạt ảnh và phần còn lại của trang sẽ không ảnh hưởng đến nhau nữa.

Nếu nó ảnh hưởng đến việc hiển thị phông chữ của bạn, tất nhiên nó chỉ làm như vậy đối với phần tử động. Tôi không thấy sự khác biệt trong Chrome của mình.


Tôi đứng sửa lại. Tôi thấy những thay đổi trong kết xuất phông chữ ở phần còn lại của trang, cũng như ở những nơi không áp dụng translateZ (0).
commonpike

Đây là điều duy nhất phù hợp với tôi khi tôi có các biểu tượng phông chữ bị mờ. Đã áp dụng chuyển đổi cho các phần đang được làm động và nó giải quyết được vấn đề.
Hóa đơn

Anh bạn, điều này đã được trả lời cách đây 2 năm. Ngay trên ... Câu trả lời / mã chính xác.
NiCk Newman

vâng, điểm duy nhất của tôi là bạn phải đặt -webkit-transformtrên yếu tố đó có các hình ảnh động , để ngăn chặn những thay đổi render trên các yếu tố khác trên trang . nhưng như đã nhận xét, nó hoạt động trong một thời gian và ngừng hoạt động khi tôi thay đổi các bit của trang sau đó.
commonpike
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.