CSS 미디어 쿼리 중복에 대한 규칙은 무엇입니까?


88

겹침을 피하기 위해 미디어 쿼리의 간격을 어떻게 정확하게 지정합니까?

예를 들어 코드를 고려하면 다음과 같습니다.

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

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

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

정확히 20em 및 45em에서 지원되는 모든 브라우저에서 어떤 일이 발생합니까?

나는 사람들이 799px와 800px 같은 것을 사용하는 것을 보았지만 799.5px의 화면 너비는 어떻습니까? (분명히 일반 디스플레이가 아니라 레티 나 디스플레이?)


사양을 고려할 때 여기에 대한 답이 가장 궁금합니다.


1
현재 질문 제목이 요청한 내용과 일치하지 않는 것 같습니다. 질문 내용의 첫 번째 줄이 제목에 더 적합 할 것 같습니다. :)
BoltClock

@BoltClock, 항상 감사합니다 — 나는 그것들을 바 꾸었습니다. 하지만 "미디어 쿼리 간격"을 어떻게 해석 했습니까?
Baumr 2011

1
@Baumr : 좋은 질문입니다. 사실 그게 무슨 뜻인지 완전히 이해하지 못합니다. 나머지 질문은 내가 이해하고 답을 쓰고 있습니다.
BoltClock

1
너비가 정확히 20em이면 먼저 max-width: 20em정의를 적용한 다음 min-width: 20em정의 도 적용 한다고 가정합니다 .
사용자

1
@Baumr, 나는 그것이 일반적인 CSS 선언과 동일하게 계단식으로 연결되어 있다고 생각합니다. 너비가 20em이면 두 쿼리를 모두 만족하므로 두 쿼리 정의가 모두 적용됩니다.
사용자

답변:


108

CSS 미디어 쿼리 중복에 대한 규칙은 무엇입니까?

종속.

@media규칙은 캐스케이드에 투명하므로 두 개 이상의 @media규칙이 동시에 일치하는 경우 브라우저는 일치하는 모든 규칙에 스타일을 적용하고 그에 따라 캐스케이드를 해결해야합니다. 1

정확히 20em 및 45em에서 지원되는 모든 브라우저에서 어떤 일이 발생합니까?

정확히 20em 너비에서 첫 번째 및 두 번째 미디어 쿼리가 모두 일치합니다. 브라우저는 @media규칙과 캐스케이드 모두에 스타일을 적용 하므로 재정의해야하는 충돌 규칙이있는 경우 마지막으로 선언 된 규칙이 우선합니다 (특정 선택자 !important등을 고려). 뷰포트의 너비가 정확히 45em 일 때 두 번째 및 세 번째 미디어 쿼리도 마찬가지입니다.

몇 가지 실제 스타일 규칙이 추가 된 예제 코드를 고려하십시오.

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

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

브라우저 뷰포트의 너비가 정확히 20em이면 이러한 미디어 쿼리는 모두 true를 반환합니다. 캐스케이드에 의해는 클래스가있는 모든 요소를 display: block재정의 display: none하고 float: left적용합니다 .sidebar.

미디어 쿼리가 시작되지 않은 것처럼 규칙을 적용하는 것으로 생각할 수 있습니다.

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

브라우저가 두 개 이상의 미디어 쿼리와 일치 할 때 캐스케이드가 발생하는 방법에 대한 또 다른 예는 이 다른 답변 에서 찾을 수 있습니다 .

하지만 두 규칙 에서 겹치지 않는 선언이 있는 경우 @media해당 규칙이 모두 적용됩니다. 여기서 일어나는 일은 두 규칙 의 선언 이 결합 된 것 입니다. @media후자가 전자를 완전히 무시하는 것이 아니라 이전 질문으로 이어집니다.

겹침을 피하기 위해 미디어 쿼리의 간격을 어떻게 정확하게 지정합니까?

중복을 피하려면 상호 배타적 인 미디어 쿼리를 작성하기 만하면됩니다.

기억 min-max-접두사가 "최소 포함"와 "최대 포함"을 의미한다; 즉 (min-width: 20em), (max-width: 20em)둘 다 정확히 20em 너비의 뷰포트와 일치합니다.

이미 예제가있는 것 같습니다. 마지막 질문으로 이어집니다.

나는 사람들이 799px와 800px 같은 것을 사용하는 것을 보았지만 799.5px의 화면 너비는 어떻습니까? (분명히 일반 디스플레이가 아니라 레티 나 디스플레이?)

이것은 완전히 확실하지 않습니다. CSS의 모든 픽셀 값은 논리적 픽셀이며 뷰포트 너비에 대해 분수 픽셀 값을보고하는 브라우저를 찾기가 힘들었습니다. 나는 일부 iframe을 실험 해 보았지만 아무것도 생각할 수 없었습니다.

내 실험에서 iOS의 Safari는 모든 분수 픽셀 값을 반올림 하여 뷰포트가 실제로 799.5px (분명히 이전과 일치 함) 인 경우에도 max-width: 799px및 중 하나 min-width: 800px가 일치 하는지 확인합니다 .


1 조건부 규칙 모듈 이나 캐스케이드 모듈 (현재 재 작성 예정)에 명시 적으로 언급되어 있지는 않지만 캐스케이드가 정상적으로 발생하는 것을 의미합니다. 브라우저 또는 미디어와 일치하는 모든 규칙.@media


2
@Baumr : 아직 완료되지 않았지만 문제 없습니다. 미디어 쿼리 중복에 대한 질문을 놓쳤습니다. 나는 내 대답을 업데이트했고 그것을 밤이라고 부릅니다. 아 그리고 그냥 킥 : 미디어 쿼리는 CSS에서 내가 가장 좋아하는 주제 중 하나이지만 RWD라는 용어는 참을 수 없습니다.)
BoltClock

BoltClock, 내가 실제로 "RWD"를 사용한 것은 아마 처음일지도 모른다 — 당신의 콜드 리셉션이 주목 받았다, 하하! 잘 자,하지만 돌아 오면 내가 원래 질문에 대한 업데이트를 확인하십시오. 이제 업데이트를 살펴 보겠습니다 ...
Baumr 2011

BoltClock, 업데이트를 제거하여 자체 질문으로 만들어야합니까? 나는이 뒤얽힌 만들기 느낀다
Baumr

@Baumr : 네, 그게 훨씬 낫습니다.
BoltClock

BoltClock : 저는 그것을 꺼내서 좀 더 간결한 질문에 넣었습니다. 미디어 쿼리 겹침을 피하는 방법? — 다른 사람들에게 더 적용 할 수있는 편집 제안이 있으면 공유하십시오. 추신 : 댓글에 @ 당신을 허용하지 않습니다.
Baumr 2011

6

여기에서 권장하는대로 시도했습니다.

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

하지만 우분투 데스크탑이나 안드로이드 폰에서 현재 크롬에서 작동하지 않기 때문에 이것이 좋은 생각이 아니라는 것을 알았습니다. (여기에 설명 된대로 : calc () not working within media query )하지만 더 나은 방법을 찾았습니다 ...

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

그리고 bam!


이것은 받아 들여진 대답이어야합니다. BoltClock이 현명한 답변을 제공했지만이 답변이 가장 유용합니다!
John Henckel

2

calc()이 문제를 해결하는 데 사용할 수 있지만 (min-width: 50em and max-width: calc(50em - 1px)올바르게 쌓일 수 있습니다.) 브라우저 지원이 좋지 않아 권장하지 않습니다.

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

정보 :

em단위를 사용하지 않는 다른 일부 언급 은 쿼리 스택에 도움이 될 것입니다.


4
calc()미디어 쿼리 사양의 일부가 아니며 작동하지 않습니다.
Jason T Featheringham 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.