biến đổi css, các cạnh lởm chởm trong chrome


193

Tôi đã sử dụng biến đổi CSS3 để xoay hình ảnh và hộp văn bản có viền trong trang web của mình.

Vấn đề là đường viền trông lởm chởm trong Chrome, giống như một trò chơi (độ phân giải thấp) mà không có khử răng cưa. Trong IE, Opera và FF có vẻ tốt hơn nhiều vì được sử dụng AA (vẫn rõ ràng nhưng không tệ lắm). Tôi không thể kiểm tra Safari vì tôi không sở hữu máy Mac.

Các bức ảnh xoay và văn bản chính nó trông ổn, nó chỉ là đường viền trông lởm chởm.

CSS tôi sử dụng là đây:

.rotate2deg {
    transform: rotate(2deg);
    -ms-transform: rotate(2deg); /* IE 9 */
    -webkit-transform: rotate(2deg); /* Safari and Chrome */
    -o-transform: rotate(2deg); /* Opera */
    -moz-transform: rotate(2deg); /* Firefox */
}

Có cách nào tôi có thể khắc phục điều này không, ví dụ như bằng cách buộc Chrome sử dụng AA?

Ví dụ dưới đây:

Ví dụ răng cưa


Đối với những người đọc nó sau: nó sẽ được sửa trong Chrome kể từ phiên bản 15 (tháng 11 năm 2011), nhưng Safari đã giới thiệu chính xác vấn đề tương tự trong 5.1 cho Mac, hiện tại vẫn chưa được sửa
dtech

Và họ đã sửa nó rất tốt, việc quay trở lại là không thể. Chúng tôi có trường hợp khử răng cưa là điều cuối cùng chúng tôi muốn, nhưng hiện tại Chrome / Chromium / Safari không có phương pháp tắt khử răng cưa trong các hình ảnh được chuyển đổi mặc dù chúng là hình ảnh 1 bit (ví dụ: b / w gif). Blur thật tuyệt, thật tuyệt, càng nhiều thì càng tuyệt, họ nói! Cách duy nhất để đảm bảo các cạnh sắc nét là chuyển đổi tất cả thành các đường dẫn hoặc đối tượng svg và thêm thuộc tính shape-render = "crispEdges".
Timo Kähkönen

Đối với tôi, vấn đề là với các đường viền trong suốt được sử dụng để tạo một mũi tên. Đây là trong Chrome 40 trên win và mac. Không có tùy chọn nào ở đây khắc phục vấn đề.
Gurnard

Câu trả lời:


389

Trong trường hợp bất cứ ai tìm kiếm điều này sau này, một mẹo hay để loại bỏ các cạnh lởm chởm trên các biến đổi CSS trong Chrome là thêm thuộc tính CSS -webkit-backface-visibilityvới giá trị là hidden. Trong các thử nghiệm của riêng tôi, điều này đã hoàn toàn làm mịn chúng ra. Mong rằng sẽ giúp.

-webkit-backface-visibility: hidden;

7
Lifesaver - thủ thuật này đã cho phép chúng tôi kích hoạt lại -webkit-Transform trên một số trang web mà trước đây chúng tôi buộc phải tắt chuyển đổi vì các vấn đề chống răng cưa. Cảm ơn!
Darren

Bất kỳ trợ giúp về điều này: stackoverflow.com/questions/9235342/ trên ?
abernier

5
Điều này hoạt động trong Chrome, nhưng nó khiến chúng bị lởm chởm một lần nữa trong iOS 6!
lazd

11
@lazd để sửa nó trong iOS addpadding: 1px; -webkit-background-clip: content-box;
Rob Fletcher

2
@RobFletcher đã thêm phần đệm và clip nền dường như, theo chủ đề này, cần thiết cho giải pháp trình duyệt chéo và hệ điều hành chéo. Điều này cũng khắc phục sự cố OSX / Chrome của tôi vì vậy ... Tôi nghĩ rằng một giải pháp hoàn chỉnh sẽ giống như:padding: 1px;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-background-clip:content-box;background-clip:content-box;
Benjamin Luoma

119

Nếu bạn đang sử dụng transitionthay vì transform, -webkit-backface-visibility: hidden;không hoạt động. Một cạnh lởm chởm xuất hiện trong khi hoạt hình cho một tệp png trong suốt.

Để giải quyết nó tôi đã sử dụng: outline: 1px solid transparent;


4
điều này dường như giúp ích trong các tình huống mà thuộc tính hiển thị web-kit-backface-bỏ lỡ.
dgibbs

2
Làm việc cho tôi khi không ai khác làm. Trước khi thêm thuộc tính này, Chrome Android đã gặp sự cố. Bây giờ tất cả các trình duyệt dường như hoạt động đúng.
Bernie Sume

Hoạt động với tôi trong Safari trên iOS 8.
Moritz Friedrich

Giải pháp hoàn hảo. Những người khác đã không làm việc. Tôi gần như đã bỏ cuộc, và đã nghi ngờ điều này sẽ làm việc. Nhưng nó làm!
Garconis

1
Hoạt động hoàn hảo cho nhu cầu của tôi. Tôi thực sự đang sử dụng quá trình chuyển đổi và các câu trả lời khác đã khiến PNG của tôi trở thành pixel ở trạng thái mặc định. Câu trả lời của bạn đã giúp loại bỏ bất kỳ pixel hóa nào - trên cả trạng thái mặc định và trong quá trình chuyển đổi. Hoàn hảo!
Garconis

24

Thêm viền trong suốt 1px sẽ kích hoạt khử răng cưa

outline: 1px solid transparent;

Ngoài ra, thêm bóng hộp trong suốt 1px.

box-shadow: 0 0 1px rgba(255,255,255,0);

rgba (255, 255, 255, 0) có lẽ tốt hơn
mmm

4
Thêm phần trên cùng của CSS vào câu trả lời của bạn và phần này outline: 1px solid transparent;hoạt động tốt với tôi. Các giải pháp khác ở trên không hoạt động đủ tốt.
Timothy Zorn

outline: 1px solid transparent;cũng kích hoạt tính năng khử răng cưa trong Firefox 52 (có cùng rắc rối với Chrome)
Luca Detomi

18

Hãy thử chuyển đổi 3d. Công việc này như một cái duyên vậy!

/* Due to a bug in the anti-liasing*/
-webkit-transform-style: preserve-3d; 
-webkit-transform: rotateZ(2deg);

1
cố gắng này trong chrome bây giờ (tháng 8 năm 2013 trên máy Mac), các giải pháp được chấp nhận không đang làm việc, nhưng sử dụng này (đặc biệt preserve-3d; rotatevẫn có thể được sử dụng mà không cần thay đổi để rotateZ) does.
Dave

Siêu hacky, nhưng làm việc cho tôi. Hãy thử thậm chí một mức độ nhỏ hơn như 0,05 để tránh sự sai lệch có thể nhìn thấy.
cpursley

bảo tồn-3d cứu mạng tôi.
Hannes Schneidermayer

8

Câu trả lời được chọn (cũng không phải câu trả lời nào khác) không phù hợp với tôi, nhưng điều này đã làm:

img {outline:1px solid transparent;}


2

Tôi đã gặp sự cố với gradient CSS3 với -45deg. Các backgroundxiên, bị lởm chởm tương tự nhưng tệ hơn bài gốc. Vì vậy, tôi bắt đầu chơi với cả hai background-size. Điều này sẽ kéo dài sự lởm chởm, nhưng nó vẫn còn đó. Sau đó, tôi cũng đọc được rằng những người khác cũng gặp vấn đề với mức tăng 45deg nên tôi đã điều chỉnh từ -45degsang-45.0001deg và vấn đề của tôi đã được giải quyết.

Trong CSS của tôi dưới đây, background-sizeban đầu 30pxdegđộ dốc nền là chính xác -45deg, và tất cả các khung hình chính là 30px 0.

    @-webkit-keyframes progressStripeLTR {
        to {
            background-position: 60px 0;
        };
    }

    @-moz-keyframes progressStripeLTR {
        to {
            background-position: 60px 0;
        };
    }

    @-ms-keyframes progressStripeLTR {
        to {
            background-position: 60px 0;
        };
    }

    @-o-keyframes progressStripeLTR {
        to {
            background-position: 60px 0;
        };
    }

    @keyframes progressStripeLTR {
        to {
            background-position: 60px 0;
        };
    }

    @-webkit-keyframes progressStripeRTL {
        to {
            background-position: -60px 0;
        };
    }

    @-moz-keyframes progressStripeRTL {
        to {
            background-position: -60px 0;
        };
    }

    @-ms-keyframes progressStripeRTL {
        to {
            background-position: -60px 0;
        };
    }

    @-o-keyframes progressStripeRTL {
        to {
            background-position: -60px 0;
        };
    }

    @keyframes progressStripeRTL {
        to {
            background-position: -60px 0;
        };
    }

    .pro-bar-candy {
        width: 100%;
        height: 15px;

        -webkit-border-radius:  3px;
        -moz-border-radius:     3px;
        border-radius:          3px;

        background: rgb(187, 187, 187);
        background: -moz-linear-gradient(
                        -45.0001deg,
                        rgba(187, 187, 187, 1.00) 25%,
                        transparent 25%,
                        transparent 50%,
                        rgba(187, 187, 187, 1.00) 50%,
                        rgba(187, 187, 187, 1.00) 75%,
                        transparent 75%,
                        transparent
                    );
        background: -webkit-linear-gradient(
                        -45.0001deg,
                        rgba(187, 187, 187, 1.00) 25%,
                        transparent 25%,
                        transparent 50%,
                        rgba(187, 187, 187, 1.00) 50%,
                        rgba(187, 187, 187, 1.00) 75%,
                        transparent 75%,
                        transparent
                    );
        background: -o-linear-gradient(
                        -45.0001deg,
                        rgba(187, 187, 187, 1.00) 25%,
                        transparent 25%,
                        transparent 50%,
                        rgba(187, 187, 187, 1.00) 50%,
                        rgba(187, 187, 187, 1.00) 75%,
                        transparent 75%,
                        transparent
                    );
        background: -ms-linear-gradient(
                        -45.0001deg,
                        rgba(187, 187, 187, 1.00) 25%,
                        transparent 25%,
                        transparent 50%,
                        rgba(187, 187, 187, 1.00) 50%,
                        rgba(187, 187, 187, 1.00) 75%,
                        transparent 75%,
                        transparent
                    );
        background: linear-gradient(
                        -45.0001deg,
                        rgba(187, 187, 187, 1.00) 25%,
                        transparent 25%,
                        transparent 50%,
                        rgba(187, 187, 187, 1.00) 50%,
                        rgba(187, 187, 187, 1.00) 75%,
                        transparent 75%,
                        transparent
                    );
        background: -webkit-gradient(
                        linear,
                        right bottom,
                        right top,
                        color-stop(
                            25%,
                            rgba(187, 187, 187, 1.00)
                        ),
                        color-stop(
                            25%,
                            rgba(0, 0, 0, 0.00)
                        ),
                        color-stop(
                            50%,
                            rgba(0, 0, 0, 0.00)
                        ),
                        color-stop(
                            50%,
                            rgba(187, 187, 187, 1.00)
                        ),
                        color-stop(
                            75%,
                            rgba(187, 187, 187, 1.00)
                        ),
                        color-stop(
                            75%,
                            rgba(0, 0, 0, 0.00)
                        ),
                        color-stop(
                            rgba(0, 0, 0, 0.00)
                        )
                    );

        background-repeat: repeat-x;
        -webkit-background-size:    60px 60px;
        -moz-background-size:       60px 60px;
        -o-background-size:         60px 60px;
        background-size:            60px 60px;
        }

    .pro-bar-candy.candy-ltr {
        -webkit-animation:  progressStripeLTR .6s linear infinite;
        -moz-animation:     progressStripeLTR .6s linear infinite;
        -ms-animation:      progressStripeLTR .6s linear infinite;
        -o-animation:       progressStripeLTR .6s linear infinite;
        animation:          progressStripeLTR .6s linear infinite;
        }

    .pro-bar-candy.candy-rtl {
        -webkit-animation:  progressStripeRTL .6s linear infinite;
        -moz-animation:     progressStripeRTL .6s linear infinite;
        -ms-animation:      progressStripeRTL .6s linear infinite;
        -o-animation:       progressStripeRTL .6s linear infinite;
        animation:          progressStripeRTL .6s linear infinite;
        }

1

Bạn có thể che dấu răng cưa bằng cách sử dụng bóng hộp mờ . Sử dụng -webkit-box-Shadow thay vì box-Shadow sẽ đảm bảo nó không ảnh hưởng đến các trình duyệt không phải webkit. Bạn có thể muốn kiểm tra Safari và các trình duyệt webkit di động.

Kết quả có phần tốt hơn, nhưng vẫn kém hơn rất nhiều so với các trình duyệt khác:

với bóng hộp (mặt dưới)


1

Chỉ cần nghĩ rằng chúng tôi cũng sẽ đưa ra giải pháp của mình vì chúng tôi có cùng một vấn đề chính xác trên Chrome / Windows.

Chúng tôi đã thử giải pháp bằng cách @stevenWatkins ở trên, nhưng vẫn có "bước".

Thay vì

-webkit-backface-visibility: hidden;

Chúng tôi đã sử dụng:

-webkit-backface-visibility: initial;

Đối với chúng tôi, đây là một mẹo nhỏ


1

Thêm phần sau vào div xung quanh phần tử trong câu hỏi đã sửa lỗi này cho tôi.

-webkit-transform-style: preserve-3d;

Các cạnh lởm chởm đã xuất hiện xung quanh cửa sổ video trong trường hợp của tôi.


0

Đối với tôi, đó là thuộc tính CSS phối cảnh đã thực hiện thủ thuật:

-webkit-perspective: 1000;

Hoàn toàn phi logic trong trường hợp của tôi vì tôi không sử dụng chuyển tiếp 3d, nhưng dù sao cũng hoạt động.


0

Dành cho canvas trong Chrome (Phiên bản 52)

Tất cả các câu trả lời được liệt kê là về hình ảnh. Nhưng vấn đề của tôi là về canvas trong chrome (v.52) với biến đổi xoay. Họ trở nên lởm chởm và tất cả các phương pháp này không thể giúp được.

Giải pháp hiệu quả với tôi:

  1. Làm cho khung vẽ lớn hơn trên 1 px cho mỗi bên => +2 px cho chiều rộng và chiều cao;
  2. Vẽ hình ảnh với offset + 1px (ở vị trí 1,1 thay vì 0,0) và kích thước cố định (kích thước của hình ảnh phải nhỏ hơn 2px so với kích thước của khung vẽ)
  3. Áp dụng xoay yêu cầu

Vì vậy, các khối mã quan trọng:

// Unfixed version
ctx.drawImage(img, 0, 0, 335, 218);
// Fixed version
ctx.drawImage(img, 1, 1, 335, 218);
/* This style should be applied for fixed version */
canvas {
  margin-left: -1px;
  margin-top:-1px;
}        
<!--Unfixed version-->
<canvas width="335" height="218"></canvas>
<!--Fixed version-->
<canvas width="337" height="220"></canvas>

Mẫu: https://jsfiddle.net/tLbxgusx/1/

Lưu ý: có rất nhiều div lồng nhau vì đây là phiên bản đơn giản hóa từ dự án của tôi.


Vấn đề này cũng được sao chép cho Firefox đối với tôi. Không có vấn đề như vậy trên Safari và FF với võng mạc.

giải pháp thành lập khác là đặt canvas vào div có cùng kích thước và áp dụng css sau cho div này:

overflow: hidden;
box-shadow: 0 0 1px rgba(255,255,255,0);
// Or
//outline:1px solid transparent;

Và xoay nên được áp dụng cho div gói này. Vì vậy, giải pháp được liệt kê là làm việc nhưng với sửa đổi nhỏ.

Và ví dụ sửa đổi cho giải pháp đó là: https://jsfiddle.net/tLbxgusx/2/

Lưu ý: Xem kiểu div với lớp 'thứ ba'.

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.