Các quy tắc cho chồng chéo truy vấn phương tiện CSS là gì?


88

Làm cách nào để chúng tôi sắp xếp các truy vấn phương tiện một cách chính xác để tránh chồng chéo?

Ví dụ: nếu chúng ta xem xét mã:

@media (max-width: 20em) {
    /* for narrow viewport */
}

@media (min-width: 20em) and (max-width: 45em) {
    /* slightly wider viewport */
}

@media (min-width: 45em) {
    /* everything else */
}

Điều gì sẽ xảy ra, trên tất cả các trình duyệt hỗ trợ, chính xác là 20em và 45em?

Tôi đã thấy mọi người sử dụng: những thứ như 799px và sau đó là 800px, nhưng chiều rộng màn hình là 799,5 px thì sao? (Rõ ràng không phải trên màn hình thông thường, mà là màn hình võng mạc?)


Tôi tò mò nhất về câu trả lời ở đây khi xem xét thông số kỹ thuật.


1
Tiêu đề câu hỏi hiện tại của bạn dường như không khớp với những gì bạn đang hỏi. Có vẻ như dòng đầu tiên của nội dung câu hỏi của bạn sẽ phù hợp hơn với tiêu đề :)
BoltClock

@BoltClock, cảm ơn như mọi khi - tôi đã chuyển đổi chúng; nhưng bạn đã giải thích "giãn cách giữa các truy vấn phương tiện" như thế nào?
Baumr

1
@Baumr: Câu hỏi hay - tôi không hoàn toàn hiểu ý của bạn về điều đó. Phần còn lại của câu hỏi tôi hiểu và tôi đang viết câu trả lời.
BoltClock

1
Tôi giả sử rằng nếu bạn có chiều rộng chính xác là 20em, thì trước tiên nó sẽ áp dụng các max-width: 20emđịnh nghĩa, sau đó cũng áp dụng các min-width: 20emđịnh nghĩa.
người dùng

1
@Baumr, tôi tin rằng nó chỉ xếp tầng giống như các khai báo CSS chung. Vì chiều rộng 20em thỏa mãn cả hai truy vấn, nên cả hai định nghĩa truy vấn sẽ được áp dụng.
người dùng

Câu trả lời:


108

Các quy tắc cho chồng chéo truy vấn phương tiện CSS là gì?

Xếp tầng.

@mediacác quy tắc là minh bạch đối với phân tầng, vì vậy khi hai hoặc nhiều @mediaquy tắc khớp cùng một lúc, trình duyệt phải áp dụng các kiểu trong tất cả các quy tắc phù hợp và phân giải tầng cho phù hợp. 1

Điều gì sẽ xảy ra, trên tất cả các trình duyệt hỗ trợ, chính xác là 20em và 45em?

Với chiều rộng chính xác là 20em, cả truy vấn phương tiện thứ nhất và thứ hai của bạn sẽ khớp nhau. Trình duyệt sẽ áp dụng các kiểu trong cả @mediaquy tắc và phân tầng tương ứng, vì vậy nếu có bất kỳ quy tắc xung đột nào cần được ghi đè, quy tắc được khai báo cuối cùng sẽ thắng (tính cho các bộ chọn cụ thể !important, v.v.). Tương tự như vậy đối với truy vấn phương tiện thứ hai và thứ ba khi khung nhìn rộng chính xác 45em.

Xem xét mã mẫu của bạn, với một số quy tắc kiểu thực tế được thêm vào:

@media (max-width: 20em) {
    .sidebar { display: none; }
}

@media (min-width: 20em) and (max-width: 45em) {
    .sidebar { display: block; float: left; }
}

Khi khung nhìn của trình duyệt rộng chính xác 20em, cả hai truy vấn phương tiện này sẽ trả về true. Theo tầng, display: blockghi đè display: nonefloat: leftsẽ áp dụng trên bất kỳ phần tử nào có lớp.sidebar .

Bạn có thể coi đó là việc áp dụng các quy tắc như thể các truy vấn phương tiện không có ở đó để bắt đầu:

.sidebar { display: none; }
.sidebar { display: block; float: left; }

Có thể tìm thấy một ví dụ khác về cách phân tầng diễn ra khi một trình duyệt khớp với hai hoặc nhiều truy vấn phương tiện trong câu trả lời khác này .

Tuy nhiên, hãy cảnh báo rằng nếu bạn có các khai báo không trùng lặp trong cả hai @mediaquy tắc, thì tất cả các quy tắc đó sẽ được áp dụng. Điều xảy ra ở đây là sự kết hợp của các khai báo trong cả hai @mediaquy tắc, không chỉ là quy tắc sau hoàn toàn khắc phục quy tắc trước ... điều này đưa chúng tôi đến câu hỏi trước đó của bạn:

Làm cách nào để chúng tôi sắp xếp các truy vấn phương tiện một cách chính xác để tránh chồng chéo?

Nếu bạn muốn tránh chồng chéo, bạn chỉ cần viết các truy vấn phương tiện loại trừ lẫn nhau.

Hãy nhớ rằng tiền tố min-max-có nghĩa là "bao gồm tối thiểu" và "bao gồm tối đa"; điều này có nghĩa là (min-width: 20em)(max-width: 20em)sẽ phù hợp với một khung nhìn có chiều rộng chính xác là 20em.

Có vẻ như bạn đã có một ví dụ, đưa chúng tôi đến câu hỏi cuối cùng của bạn:

Tôi đã thấy mọi người sử dụng: những thứ như 799px và sau đó là 800px, nhưng chiều rộng màn hình là 799,5 px thì sao? (Rõ ràng không phải trên màn hình thông thường, mà là màn hình võng mạc?)

Điều này tôi không hoàn toàn chắc chắn; tất cả các giá trị pixel trong CSS đều là pixel logic và tôi đã rất khó tìm được trình duyệt báo cáo giá trị pixel phân số cho chiều rộng khung nhìn. Tôi đã thử thử nghiệm với một số iframe nhưng không thể tìm ra bất kỳ điều gì.

Từ các thử nghiệm của tôi, có vẻ như Safari trên iOS làm tròn tất cả các giá trị pixel phân số để đảm bảo rằng một trong hai max-width: 799pxmin-width: 800pxsẽ khớp, ngay cả khi chế độ xem thực sự là 799,5px (dường như khớp với cái cũ).


1 Mặc dù không có điều nào trong số này được nêu rõ ràng trong mô-đun Quy tắc có điều kiện hoặc mô-đun Xếp tầng ( mô-đun sau này hiện đang được dự kiến ​​viết lại), phân tầng được ngụ ý là diễn ra bình thường, vì thông số chỉ đơn giản là áp dụng các kiểu trong bất kỳ và tất cả các @mediaquy tắc phù hợp với trình duyệt hoặc phương tiện.


2
@Baumr: Không sao, mặc dù tôi vẫn chưa hoàn thành - Tôi đã bỏ lỡ câu hỏi của bạn về các truy vấn phương tiện trùng lặp. Tôi đã cập nhật câu trả lời của mình và với điều đó, tôi gọi nó là một đêm. Ồ và chỉ dành cho những cú hích: truy vấn phương tiện là một trong những chủ đề yêu thích của tôi trong CSS, nhưng tôi không thể chịu đựng được thuật ngữ RWD;)
BoltClock

BoltClock, có thể đây là lần đầu tiên tôi sử dụng "RWD" thực sự - sự tiếp nhận lạnh lùng của bạn đã được ghi nhận, haha! Chúc bạn ngủ ngon, nhưng khi bạn quay lại, hãy kiểm tra cập nhật tôi đã thực hiện cho câu hỏi ban đầu. Bây giờ để xem bản cập nhật của bạn ...
Baumr

BoltClock, tôi có nên lấy bản cập nhật đó ra và biến nó thành câu hỏi của riêng nó không? Tôi cảm thấy tôi đang làm cho điều này trở nên phức tạp
Baumr

@Baumr: Yup, theo cách đó tốt hơn nhiều.
BoltClock

BoltClock: Tôi đã lấy nó ra và đặt nó vào một câu hỏi, hy vọng, ngắn gọn hơn: Làm thế nào để tránh chồng chéo truy vấn phương tiện? - nếu bạn có bất kỳ đề xuất chỉnh sửa nào để làm cho nó áp dụng hơn cho người khác, vui lòng chia sẻ. PS Nó không cho phép tôi @ bạn trong các ý kiến.
Baumr

6

Tôi đã thử theo đề nghị ở đây:

@media screen and (max-width: calc(48em - 1px)) {
    /*mobile styles*/
}
@media screen and (min-width: 48em) {
    /*desktop styles*/
}

nhưng nhận thấy rằng đây không phải là một ý tưởng hay vì hiện tại nó không hoạt động trên Chrome hoặc trên máy tính để bàn Ubuntu hoặc trên điện thoại Android của tôi. (như đã giải thích ở đây: calc () không hoạt động trong các truy vấn phương tiện ) Nhưng, tôi đã tìm thấy một cách tốt hơn ...

@media screen and (max-width: 47.9999em) {
    /*mobile styles*/
}
@media screen and (min-width: 48em) {
    /*desktop styles*/
}

và bam!


Đây phải là câu trả lời được chấp nhận. BoltClock đã cung cấp câu trả lời theo kiểu ngữ nghĩa, nhưng câu trả lời này là hữu ích nhất!
John Henckel

2

calc()có thể được sử dụng để giải quyết vấn đề này (min-width: 50em and max-width: calc(50em - 1px)sẽ được xếp chồng lên nhau một cách chính xác), nhưng hỗ trợ trình duyệt kém và tôi sẽ không đề xuất nó.

@media (min-width: 20em) and (max-width: calc(45em - 1px)) {
    /* slightly wider viewport */
}

Infos:

Một số người khác đã đề cập, việc không sử dụng emthiết bị sẽ giúp ích trong việc xếp chồng các truy vấn của bạn.


4
calc()không phải là một phần của đặc tả truy vấn phương tiện và sẽ không hoạt động.
Jason T Featheringham
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.