이 기사에 포함 된 모드 스위칭은 Firefox 및 기타 Gecko 기반 브라우저, Safari, Chrome 및 기타 WebKit 기반 브라우저, Opera, Konqueror, Mac 용 Internet Explorer, Windows 용 Internet Explorer 및 IE가 내장 된 브라우저에 적합합니다. 브라우저 엔진의 이름을 언급하지 말고 대신 엔진의 가장 잘 알려진 브라우저의 이름을 사용하십시오.
이 기사는 각 패턴의 정확한 동작을 기록하지 않고 패턴의 선택 메커니즘에 중점을 둡니다.
다음은 다양한 모드입니다.
텍스트/HTML 컨텐츠의 패턴 선택은 DocType 스니핑에 따라 다릅니다 (이 기사의 뒷부분에서 논의 된 DocType 스니핑). IE8에서 패턴은 다른 요인에 따라 다릅니다. 그러나 IE8에서 기본적으로 Microsoft의 블랙리스트에서 제공되지 않는 비 투자 사이트의 패턴은 문서 유형에 따라 다릅니다.
이 기사에서 통일 된 토론이 있더라도 각 브라우저에서 패턴의 정확한 동작의 차이를 강조하는 것은 과장이 아닙니다.
Firefox, Safari, Chrome 및 Opera에서 Application/XHTML+XML HTTP 컨텐츠 유형 (메타 요소 또는 DocType!)은 XML 패턴을 트리거합니다. XML 패턴에서 브라우저는 XML 문서에 브라우저에있는 정도까지 올바른 사양을 제공하려고합니다.
IE6, 7 및 8은 응용 프로그램/XHTML+XML을 지원하지 않으며 Mac IE5도 마찬가지입니다.
WebKit 기반 Nokia S60 브라우저에서 Application/XHTML+XML HTTP 컨텐츠 유형은 모바일 벽 정원의 초점이 불규칙한 컨텐츠와 호환되기 때문에 XML 스키마를 트리거 할 수 없습니다. (구식 모바일 브라우저는 비표준 콘텐츠가 XML로 표시되었으므로 실제 XML 파서를 사용할 수 없습니다.)
Konqueror는 완전히 테스트되지 않았 으므로이 브라우저에서 무슨 일이 일어날 지 정확히 말할 수는 없습니다.
일부 엔진이 웹 컨텐츠와 관련이없는 패턴. 완전성을 위해 여기에서만 언급됩니다. 오페라에는 WML2.0 모드가 있습니다. Leopard의 WebKit에는 레거시 대시 보드 위젯에 대한 특정 모드가 있습니다.
다음은 이러한 패턴의 주요 효과입니다.
텍스트/HTML 패턴은 주로 CSS 레이아웃에 영향을 미칩니다. 예를 들어, 테이블이 스타일을 물려받지 않는 퀴크입니다. 일부 브라우저의 Quirk 모드에서 박스 모델은 IE5.5의 박스 모델이됩니다. 이 문서는 모든 레이아웃 기발한 것을 나열하지는 않습니다.
준 표준 모드 (이 모드가있는 브라우저에서) 그림을 포함하는 테이블 셀만이 높고 표준 모드에서 다릅니다.
XML 스키마에서 선택기마다 사례에 민감한 동작이 다릅니다. 또한 HTML 본체 요소에 대한 고유 한 규칙은 최신 CSS2.1 변경 사항을 구현하지 않는 이전 브라우저에 적용 할 수 없습니다.
또한 HTML 및 CSS 구문 분석에 영향을 미치는 몇 가지 기발함이 있으며 표준을 충족하는 웹 페이지를 잘못 구문 분석 할 수 있습니다. 기발한 레이아웃은 이러한 기발한 켜지는지 여부를 결정합니다. 어쨌든 CSS 레이아웃 및 구문 분석 (비 HTML 파싱)에서 quirk 패턴과 표준 패턴의 주요 유사성과 차이점을 이해하는 것이 매우 중요합니다.
어떤 사람들은 실수로 표준 모드 엄격한 구문 분석 모드를 호출하여 사람들이 브라우저의 HTML 구문 규칙과 태그의 정확성에 대한 브라우저의 평가를 오해합니다. 이것은 사실이 아닙니다. 표준 모드 레이아웃이 발효 되더라도 브라우저는 여전히 태그 수프 (태그 수프, http://en.wikipedia.org/wiki/tag_soup) 수정 작업을 만듭니다. (NETSCAPE6이 2000 년에 출시되기 전에 Mozilla는 HTML 구문 규칙을 시행하기위한 파싱 패턴을 가지고있었습니다. 이러한 패턴은 기존 웹 컨텐츠와 호환되지 않는 버려졌습니다.)
또 다른 일반적인 오해는 XHTML 파싱에 관한 것입니다. 일반적으로 XHTML DocType를 사용하여 다른 구문 분석이 얻어 진다고 생각됩니다. 사실, 이것은 사실이 아닙니다. 컨텐츠 유형은 Text/HTML의 XHTML 문서에 사용 된 파서 및 HTML 문서와 동일합니다. 브라우저가 지금 관심을 갖는 것은 문서 유형 텍스트/html을 가진 XHTML은 크라우트가있는 태그 수프 (모든 곳에서 추가 슬래시)라는 것입니다.
XML 문서 유형 문서 (예 : Application/XHTML+XML 또는 XMAPPLICATION/)를 사용하는 경우에만 구문 분석기가 구문 분석 용 XML 스키마를 트리거합니다. 현재 파서는 HTML 파서와 완전히 다릅니다.
Quirk 패턴은 주로 CSS에 관한 것이지만 일부는 스크립팅에 관한 것입니다. 예를 들어, Firefox의 Quirk 패턴에서 HTML ID 속성은 IE와 같이 글로벌 스크립트 범위에 대한 객체 참조를 설정합니다. IE8에서 스크립트의 영향은 다른 브라우저보다 주목할 가치가 있습니다.
XML 스키마에서 XML의 DOM API 동작이 정의 될 때 HTML 동작과 호환되지 않기 때문에 일부 DOM API는 완전히 다르게 행동합니다.
최신 브라우저는 DocType 스니핑을 사용하여 텍스트/HTML 문서의 엔진 모드를 결정합니다. 이는 스키마 선택이 HTML 문서로 시작하는 문서 유형 선언 (또는 누락)을 기반으로 함을 의미합니다. (이것은 XML 문서 유형을 사용하는 문서에 적합하지 않습니다.)
문서 유형 선언 (DocType)은 SGML의 구문 위조입니다. SGML은 구식 마크 업 프레임 워크입니다. HTML5 전 HTML은 이에 따라 정의됩니다. HTML4.01 사양에서 문서 유형 선언은 HTML의 버전 정보를 설명합니다. 이름은 문서 유형 선언이고 HTML 4.01 사양은 버전 정보를 설명하지만 문서 유형 선언은 (이름 때문에) SGML 또는 XML 문서를 특정 유형의 문서로 분류하는 데 적용되지 않습니다. (더 많은 콘텐츠는 부록에 있습니다)
HTML4.01 사양이나 ISO 8879 (SGML)는 문서 유형 선언을 엔진 모드 변환으로 사용하는 것에 대해 아무 말도하지 않습니다. Doctype 스니핑은 관찰을 기반으로합니다. DocType 스니핑이 설계된 경우, 대부분의 단점에는 문서 유형 선언이나 이전 DTD에 대한 참조가 없습니다. HTML5는이 사실을 받아들이고 DocType을 Text/HTML에서 유일한 모드 변환으로 정의합니다.
일반적인 pre-html5 (pre-html5) 문서 유형 선언에는 (공백으로 분리) <! doctype string, 루트 요소 (HTML)의 공통 식별자, 공개 문자열, 따옴표의 DTD 공통 식별자, 가능한 시스템 식별자 (URL) 및 동일한 DTD의 문자가 포함됩니다. 문서 유형 선언은 문서의 루트 요소가 레이블을 시작하기 전에입니다.
다음은 새 텍스트/HTML 문서를 만들 때 DocType를 선택하는 방법에 대한 간단한 안내서입니다.
XHTML은 텍스트/html로 사용하기에 유해한 것으로 간주되므로 XHTML DocType는 권장하지 않습니다. 어쨌든 XHTML DocType를 사용하기로 선택한 경우 XML 선언은 IE6 (IE7이 아님)으로 인해 Quirk 패턴을 트리거합니다.
응용 프로그램/xhtml+xml에 대한 간단한 안내서는 DocType를 사용하지 않습니다. 이 방법의 웹 페이지는 XHMTL1.0과 엄격하게 일치하지 않지만 중요하지 않습니다. (아래 부록을 참조하십시오)
IE8이 DocType 외에도 패턴 선택의 요소 중 하나로 메타 요소 기반 패턴 변환을 사용할 것이라고 한 번 소개했습니다. (Ian Hickson, David Baron, David Baron, Robert O'Callahan 및 Maciej Stachowiak의 리뷰 참조).
IE8에는 IE5.5 Quirk 모드, IE7 표준 모드, IE8 Qual-Standard Mode 및 IE8 표준 모드가 있습니다. 모드 선택은 Doctype, Meta Elements, HTTP 헤더, Microsoft의 정기 다운로드 데이터, 사용자가 만든 설정, LAN 관리자가 작성한 설정, 부모 프레임 워크 모드 (있는 경우)의 여러 측면의 데이터에 따라 달라집니다. (엔진에 내장 된 다른 응용 분야의 경우 패턴은 임베디드 응용 프로그램에 따라 다릅니다.)
다행히도 IE8은 다음과 같은 경우 일반적으로 다른 브라우저와 같이 DocType 스니핑을 사용합니다.
X-UA 호환에 관한 두 가지 경우를 제외하고, IE8은 IE7과 같은 DocType 스니핑을 수행합니다. IE7 에뮬레이션 (IE7 에뮬레이션)을 호환성보기라고합니다.
X-UA 호환의 경우, IE8은 다른 브라우저와 완전히 다르게 작동합니다. 이 페이지에서 PDF 및 PNG 형식의 부록 또는 흐름도를보고 싶습니다.
불행히도, X-UA 호환에 대한 HTTP 헤더 또는 메타 태그는 없으며, 적절한 DocType를 사용하더라도 IE8을 사용하면 사용자가 실수로 IE8의 표준 모드에서 IE7 모드로 페이지를 줄일 수 있으며, 이는 시뮬레이션 된 IE7 표준 모드입니다. 더 나쁜 것은 LAN 관리자도 마찬가지입니다. Microsoft는 사용하는 모든 도메인 이름을 블랙리스트 할 수도 있습니다.
이러한 효과를 다루기 위해서는 DocType로 충분하지 않으므로 X-UA 호환 HTTP 헤더 및 메타 태그가 필요합니다.
다음 간단한 안내서는 X-UA 호환 HTTP 헤더 또는 메타 태그를 선택하는 방법에 대한 다른 브라우저에서 이미 DocType 트리거 표준 모드 또는 준 표준 모드가있는 새 텍스트/HTML 문서에 대한 것입니다.
DocType 스니핑을 XML에 가져 오지 마십시오.
Doctype 스니핑은 차우 더 수프와 같은 방법을 사용하여 레이블이 붙은 차우 더 수프 문제를 해결하는 것입니다. DocType 스니핑은 HTML4 및 CSS2 사양이 출시 된 후 설계된 잠정적 인 접근 방식으로, 저자가 기대할 수있는 오버 디어 문서를 문서와 구별합니다.
때로는 XML에서 DocType 스니핑을 사용하여 다른 처리를 예약하거나 사용중인 어휘를 식별하거나 기능을 활성화하는 것이 좋습니다. 이것은 나쁜 생각입니다. 일정 및 어휘 인식은 네임 스페이스를 기반으로해야하며 기능 활성화는 명시적인 처리 지침 또는 요소를 기반으로해야합니다.
잘 형성된 아이디어는 XML을 허용하는 DTD 구문 분석을 도입하고 DocType-free 문서를 홍보하는 것입니다. 공식적인 경우, 두 개의 XML 문서는 동일한 표준 형태를 가지며 응용 프로그램은이를 다르게 처리합니다 (외부 엔티티를 처리 할 선택이 없기 때문에) 응용 프로그램이 파손될 수 있습니다. 실제로, 두 개의 XML 문서가 SAX2 컨텐츠 프로세서에 동일한 컨텐츠를보고하고 (QNAMES 무시), 응용 프로그램이 문서를 다르게 처리하면 응용 프로그램이 중단 될 수 있습니다. 웹 저자로서 모든 사람이 추가 엔티티를 다루는 XMLProcessors를 사용하여 모든 사람이 페이지를 구문 분석 할 것이라고 믿는 것은 불가능합니다 (일부 브라우저는 특정 공개 식별자가 요약 된 엔티티를 정의하는 엔티티에 특정 공개 식별자를 매핑하는 경우에 해당하는 경우에도 XML에 XML을 정의하는 것)는 무의미하고 종종 컬트 습관을 이끌어냅니다. (W3C 유효성 검사기는 여전히 W3C 유효성 검사기의 DTD 재정의 기능을 사용하지만 W3C 유효성 검사기는 결과 만 일시적이라고 말할 것입니다. 또는 더 나은 NG 검증을 사용할 수 있습니다. 이는 패턴에 의해 참조 된 문서를 오염시키지 않으면 매우 어리석은 일입니다.
또한, 낮은 수준의 사양이 두 가지 동등한 것을 정의 할 때, 높은 수준의 사양은 그들에게 다른 의미를 주려고 시도해서는 안됩니다. <! doctype html public- // w3c // dtd xhtml 1.0 strict // en http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd>를 고려하십시오. 공개 식별자가 삭제되면 동일한 DTD가 여전히 지정되어 있으므로 DocType <! docType html 시스템 http://www.w3.org/tr/xhtml1/dtd/xhtml1-srtrict.dtd>는 이전 Doctype와 동일하게 의미합니다. 다르게 스니핑해야합니까? 추가 이론이 될 수 있습니다. copy to example.com으로 foobar.dtd라는 dtd : <! doctype html 시스템 http://example.com/foobar.dtd>라고 가정하십시오. 이걸 스니핑하는 방법? 그것은 같은 의미를 가져야합니다. 전체 DTD조차 문서에 게시 할 수 있습니다.
다시 말해, #include foo.h가있는 경우 foo.h의 내용을 문서에 복사하거나 foo.h를 bar.h로 복사하고 #include bar.h를 복사 할 수 있으므로 foo.h라는 이름에 흑 마법을 묶어서는 안됩니다.
동일한 매개 변수를 구축하는 HTML 및 SGML이 걱정하지 않는 이유는 웹 브라우저가 실제 SGML 파서를 사용하여 HTML을 구문 분석하지 않기 때문에 처리를 위해 SGML로 가장 무모한 것으로 생각합니다. 어쨌든, 당신이 아직 그것을 믿지 않는다면,이 문제 comp.text.sgml에 관한 W. Eliot Kimber의 기사를 읽으십시오.
다음 표에서, 기발 패턴, 표준 패턴 및 준 기준은 각각 Q, S 및 A로 표시됩니다. 브라우저에 두 가지 모드 만 있으면 표준 모드는 테이블 셀의 행 높이가 모질라의 표준 모드 성능과 일치하는 경우 표준 모드가 표시되고 표준 모드는 테이블 셀의 행 높이가 모질라의 표준 모드 성능과 일치하는 경우 A로 표시됩니다.
XHTML XHTML XML 컨텐츠 모델을 사용하는 것은 XML 모드로 렌더링됩니다.
이 테이블의 목적은 테이블의 모든 문서가 새 페이지를 만들기위한 합리적인 선택이라고 말하는 것은 아닙니다. 이 표의 목적은 내 권장 사항을 기반으로하는 데이터 종류를 보여주는 것입니다.
다음 약어 기호는 열 제목에 사용됩니다.
| Doctype | NS6 | 오래된 모즈 | Moz & Safari & Opera10 & Html5 | Opera9.0 | IE8 & OPERA9.5 | IE7 & OPERA7.10 | IE6 & OPERA7.0 | Mac IE5 | KONQ3.2 |
|---|---|---|---|---|---|---|---|---|---|
| 없음 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 |
| <! doctype HTML public- // w3c // dtd html 3.2 Final // en> | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 |
| <! doctype html public- // w3c // dtd html 4.0 // en> | 에스 | 에스 | 에스 | 에스 | 에스 | 에이 | 에이 | 에이 | 에이 |
| <! doctype html public- // w3c // dtd html 4.01 // en> | 에스 | 에스 | 에스 | 에스 | 에스 | 에이 | 에이 | 큐 | 에이 |
| <! doctype html public- // w3c // dtd html 4.0 // en http://www.w3.org/tr/html4/strict.dtd> | 에스 | 에스 | 에스 | 에스 | 에스 | 에이 | 에이 | 에이 | 에이 |
| <! doctype html public- // w3c // dtd html 4.01 // en http://www.w3.org/tr/html4/strict.dtd> | 에스 | 에스 | 에스 | 에스 | 에스 | 에이 | 에이 | 에이 | 에이 |
| <! doctype html public- // w3c // dtd html 4.0 Transitional // en> | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 |
| <! doctype HTML public- // w3c // dtd html 4.01 Transitional // en> | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 |
| <! doctype HTML public- // w3c // dtd html 4.01 Transitional // en http://www.w3.org/tr/html4/loose.dtd> | 에스 | 에스 | 에이 | 에이 | 에이 | 에이 | 에이 | 에이 | 큐 |
| <! doctype HTML public- // w3c // dtd html 4.01 Transitional // en http://www.w3.org/tr/1999/rec-html401-19991224/loose.dtd> | 큐 | 에스 | 에이 | 에이 | 에이 | 에이 | 에이 | 에이 | 큐 |
| <! doctype html public- // w3c // dtd html 4.0 Transitional // en http://www.w3.org/tr/html4/loose.dtd> | 큐 | 큐 | 큐 | 큐 | 에이 | 에이 | 에이 | 에이 | 큐 |
| <! doctype html public- // w3c // dtd xhtml 1.1 // en http://www.w3.org/tr/xhtml11/dtd/xhtml11.dtd> | 에스 | 에스 | 에스 | 에스 | 에스 | 에이 | 에이 | 에이 | 에이 |
| <! doctype html public- // w3c // dtd xhtml 기본 1.0 // en http://www.w3.org/tr/xhtml-basic/xhtml-basic10.dtd> | 에스 | 에스 | 에스 | 에스 | 에스 | 에이 | 에이 | 에이 | 에이 |
| <! doctype html public- // w3c // dtd xhtml 1.0 엄격한 // en http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd> | 에스 | 에스 | 에스 | 에스 | 에스 | 에이 | 에이 | 에이 | 에이 |
| <! doctype html public- // w3c // dtd xhtml 1.0 전환 // en http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd> | 에스 | 에스 | 에이 | 에이 | 에이 | 에이 | 에이 | 에이 | 큐 |
| <? XML 버전 = 1.0 인코딩 = UTF -8?> <! docType html public- // w3c // dtd xhtml 1.1 // en http://www.w3.org/t/xhtml11/dtd/xhtml11.dtd> | 에스 | 에스 | 에스 | 에스 | 에스 | 에이 | 큐 | 에이 | 큐 |
| <? xml 버전 = 1.0 인코딩 = UTF-8?> <! docType html public- // w3c // dtd xhtml 기본 1.0 // en http://www.w3.org/tr/xhtml-basic/xhtml-basic10.dtd> | 에스 | 에스 | 에스 | 에스 | 에스 | 에이 | 큐 | 에이 | 큐 |
| <? xml 버전 = 1.0 인코딩 = utf -8?> <! doctype html public- // w3c // dtd xhtml 1.0 strict // en http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd> | 에스 | 에스 | 에스 | 에스 | 에스 | 에이 | 큐 | 에이 | 큐 |
| <? xml 버전 = 1.0 인코딩 = UTF -8?> <! DocType HTML public- // w3c // dtd xhtml 1.0 Transitional // en http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd> | 에스 | 에스 | 에이 | 에이 | 에이 | 에이 | 큐 | 에이 | 큐 |
| <! doctype HTML Public ISO/IEC 15445 : 2000 // dtd html // en> | 큐 | 에스 | 에스 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 |
| <! doctype HTML Public ISO/IEC 15445 : 2000 // DTD 하이퍼 텍스트 마크 업 언어 // en> | 큐 | 에스 | 에스 | 에스 | 에스 | 에이 | 에이 | 에이 | 큐 |
| <! doctype HTML Public ISO/IEC 15445 : 1999 // dtd html // en> | 에스 | 에스 | 에스 | 큐 | 큐 | 큐 | 큐 | 큐 | 큐 |
| <! doctype HTML Public ISO/IEC 15445 : 1999 // DTD 하이퍼 텍스트 마크 업 언어 // en> | 에스 | 에스 | 에스 | 에스 | 에스 | 에이 | 에이 | 에이 | 큐 |
| <! doctype html> | 큐 | 에스 | 에스 | 에스 | 에스 | 에이 | 에이 | 에이 |
Moziila의 Doctype 스니핑 코드는 2000 년 10 월, 2001 년 9 월 및 2002 년 6 월에 크게 수정되었습니다.이 문서에 설명 된 Mozilla (및 Netscape 6.x)가 설립 한 상태는 2000.10.19 이후 ftp.mozilla.org에서 볼 수 있습니다. 이 문서는 Mozilla M18 (및 Netscape 6.0 PR3)에서 DocType 스니핑의 작동 방식을 다루지 않습니다. Safari의 DocType 스니핑 코드도 첫 번째 공개 베타 이후 크게 수정되었습니다. 이 문서에는 0.9라고도 불리는 버전 v73보다 이전의 동작이 포함되지 않습니다.
Konqueror3.5 이전의 DocType 스니핑 코드는 초기 버전의 Safari에서 나온 것 같습니다. Konqueror는 이제 Safari와 일치하며 DocType 스니핑 코드는 Mozilla에서 나옵니다.
테이블에서 볼 수 있듯이 Opera9.5와 9.6이 뒤로 향하는 길에 있지만 Opera의 Doctype 스니핑은 일반 IE와 유사한 것에서 모질라와 같은 것으로 바뀌고 있습니다. 한편, 오페라 퀴크 모드의 레이아웃 동작은 IE6의 퀴크 모드를 모질라의 퀴크 모드로 모방하는 것에서 전환되었습니다.
이 단계는 PDF 및 PNG 형식의 흐름도를 통해 볼 수 있습니다.
Simon Pieters, Simon Pieters 및 Anne Van Kesteren 덕분에 패턴 테이블과 다양한 오페라 버전에 대한 의견을 수정하도록 도와주었습니다. 또 다른 IE8 흐름도를 만드는 Simon Pieters에게 감사합니다.