ì¬ì©ì ìì´ì í¸ë¥¼ ì¬ì©í ë¸ë¼ì°ì ê°ì§
ë¸ë¼ì°ì ë³ë¡ ë¤ë¥¸ ì¹ íì´ì§ ëë ìë¹ì¤ë¥¼ ì ê³µíë ê²ì ì¼ë°ì ì¼ë¡ ì¢ì§ ìì ìê°ì ëë¤. ì¹ì ì¬ì©íë ë¸ë¼ì°ì ë ì¥ì¹ì ê´ê³ìì´ ëª¨ë ì¬ëì´ ì ê·¼í ì ìëë¡ ë§ë¤ì´ì¡ìµëë¤. í¹ì ë¸ë¼ì°ì 를 ëìì¼ë¡ í기보ë¤ë 기ë¥ì ê°ì©ì±ì 기ë°ì¼ë¡ ì¹ì¬ì´í¸ë¥¼ ì ì§ì ì¼ë¡ ê°ì íëë¡ ì¹ì¬ì´í¸ë¥¼ ê°ë°íë ë°©ë²ì´ ììµëë¤.
ê·¸ë¬ë ë¸ë¼ì°ì ì íì¤ì ìë²½íì§ ìì¼ë©° ë¸ë¼ì°ì ê°ì§ê° íìí ì¼ë¶ ê·¹ë¨ì ì¸ ê²½ì°ê° ì¬ì í ììµëë¤. ì¬ì©ì ìì´ì í¸ë¥¼ ì¬ì©íì¬ ë¸ë¼ì°ì 를 ê°ì§íë ê²ì ê°ë¨í´ ë³´ì´ì§ë§, ì´ë¥¼ ì ìííë ê²ì ì¬ì¤ ë§¤ì° ì´ë ¤ì´ 문ì ì ëë¤. ì´ ë¬¸ìë ì´ ìì ì ê°ë¥í í ì ííê² ìííëë¡ ìë´í©ëë¤.
ì°¸ê³ : ë¤ì ë°ë³µí ê°ì¹ê° ììµëë¤. ì¬ì©ì ìì´ì í¸ íì§ë¥¼ ì¬ì©íë ê²ì ê±°ì ì¢ì ìê°ì´ ìëëë¤. 문ì 를 í´ê²°í기 ìí´ ê±°ì íì ë ì¢ê³ ë ê´ë²ìíê² í¸íëë ë°©ë²ì ì°¾ì ì ììµëë¤!
ë¸ë¼ì°ì ê°ì§ë¥¼ ì¬ì©í기 ì ê³ ë ¤ ì¬í
ì´ë¤ ë¸ë¼ì°ì ê° ì¬ì©ëê³ ìëì§ ê°ì§í기 ìí´ ì¬ì©ì ìì´ì í¸ ë¬¸ìì´ ì¬ì©ì ê³ ë ¤í ë, 첫 ë²ì§¸ ë¨ê³ë ê°ë¥íë©´ ì´ ë°©ë²ì í¼íë ê²ì ëë¤. ê·¸ ìì ì íê³ ì¶ì ì´ì 를 íì íë ê²ë¶í° ììíì¸ì.
- ì¼ë¶ ë¸ë¼ì°ì ë²ì ì í¹ì ë²ê·¸ë¥¼ í´ê²°íë ¤ê³ íìëì?
-
ì 문 í¬ë¼ìì ë³´ê±°ë ì§ë¬¸íì¸ì. ë¹ì ì´ ì´ ë¬¸ì ì ì²ìì¼ë¡ ì§ë©´í ê°ë¥ì±ì ê±°ì ììµëë¤. ëí, ì 문ê°ë ë¤ë¥¸ ê´ì ì ê°ì§ ì¬ëë¤ì´ ë²ê·¸ í´ê²°ì ìí ìì´ëì´ë¥¼ ì ê³µí ì ììµëë¤. 문ì ê° ííì§ ìì ê² ê°ë¤ë©´, ì´ ë²ê·¸ê° ë²ê·¸ ì¶ì ìì¤í ì íµí´ ë¸ë¼ì°ì ê³µê¸ì ì²´ì ë³´ê³ ëìëì§ íì¸íë ê²ì´ ì¢ìµëë¤(Mozilla; WebKit; Blink; Opera). ë¸ë¼ì°ì ì ì¡°ì ì²´ë ë²ê·¸ ë³´ê³ ìì 주ì를 기ì¸ì´ê³ ìì¼ë©°, ë¶ìì íµí´ ë²ê·¸ì ëí ë¤ë¥¸ í´ê²° ë°©ë²ì ëí íí¸ë¥¼ ì»ì ì ììµëë¤.
- í¹ì 기ë¥ì´ ìëì§ íì¸íë ¤ê³ íìëì?
-
ë¹ì ì ì¬ì´í¸ë ì¼ë¶ ë¸ë¼ì°ì ê° ìì§ ì§ìíì§ ìë í¹ì ì¹ ê¸°ë¥ì ì¬ì©í´ì¼ íë©°, í´ë¹ ì¬ì©ì를 기ë¥ì ì ì§ë§ ìëí ê²ì¼ë¡ ìê³ ìë ì´ì ì¹ ì¬ì´í¸ë¡ ë³´ë´ê³ ì¶ìµëë¤. ì´ë ê²°êµ ë¤ë¥¸ 모ë ë¸ë¼ì°ì ê° ë°ë¼ì¡ì ê°ë¥ì±ì´ ë기 ë문ì ì¬ì©ì ìì´ì í¸ ê°ì§ë¥¼ ì¬ì©íë ìµì ì ì´ì ì ëë¤. ëí, ë ë리 ì¬ì©ëë ë¸ë¼ì°ì 를 모ë í ì¤í¸íê³ í´ë¹ ì¹ ê¸°ë¥ì í ì¤í¸íë ê²ì ì¤ì©ì ì´ì§ ììµëë¤. ì¬ì©ì ìì´ì í¸ ì¤ëíì ì ë ìíí´ìë ì ë©ëë¤. ëì ê¸°ë¥ ê°ì§ë¥¼ ìííë ëìì´ íì ììµëë¤.
- ì´ë¤ ë¸ë¼ì°ì 를 ì¬ì©íëì§ì ë°ë¼ ë¤ë¥¸ HTMLì ì ê³µíê³ ì¶ì¼ì ê°ì?
-
ì´ë ì¼ë°ì ì¼ë¡ ëì ìµê´ì´ì§ë§, ì¼ë¶ ê²½ì°ìë ì´ê²ì´ íìí©ëë¤. ì´ë° ê²½ì°ìë, 먼ì ìí©ì ë¶ìíì¬ ì ë§ íìíì§ íì¸í´ì¼ í©ëë¤. ìë¯¸ê° ìë
<div>ëë<span>ìì를 ì¶ê°í´ ì´ë¥¼ ìë°©í ì ìëì? ì¬ì©ì ìì´ì í¸ ê°ì§ë¥¼ ì±ê³µì ì¼ë¡ ì¬ì©í기ì ì´ë ¤ìì´ ìë ë¶ë¶ì HTMLì ììì±ì ìë°°í ì ììµëë¤. ëí, ëìì¸ì ë¤ì ìê°í´ë³´ì¸ì. ì ì§ì ì¸ í¥ìì´ë ì ëì ì¸ ë ì´ììì ì¬ì©íì¬ ì´ë¬í ìì ì ìíí íìì±ì ì ê±°í ì ìëì?
ì¬ì©ì ìì´ì í¸ ê°ì§ ë°©ì§
ì¬ì©ì ìì´ì í¸ ê°ì§ë¥¼ ì¬ì©íì§ ìì¼ë ¤ë©´, ìµì ì´ ììµëë¤!
- ê¸°ë¥ ê°ì§
-
ê¸°ë¥ ê°ì§ë ì´ë¤ ë¸ë¼ì°ì ê° íì´ì§ë¥¼ ë ëë§íëì§ ììë´ë ¤ë ê²ì´ ìëë¼, íìí í¹ì 기ë¥ì ì¬ì©í ì ìëì§ íì¸íë ê²ì ëë¤. ê·¸ë ì§ ìì ê²½ì°, ëì²´ ë°©ë²ì ì¬ì©í©ëë¤. ë¸ë¼ì°ì ë§ë¤ ëìì´ ë¤ë¥¸ ë문 ê²½ì°ìë ì¬ì©ì ìì´ì í¸ ë¬¸ìì´ì íì¸íë ëì , ë¸ë¼ì°ì ê° API를 구ííë ë°©ë²ì ê°ì§íê³ ì´ë¥¼ ì¬ì©íë ë°©ë²ì ê²°ì íë í ì¤í¸ë¥¼ 구íí´ì¼ í©ëë¤. ê¸°ë¥ ê°ì§ì ìì ë ë¤ìê³¼ ê°ìµëë¤. 2017ë ì, Chrome ì ê·ììì íëê·¸ê° ì§ì ëì§ ìì ì¤íì ë¤ëì보기 ì§ì, íì§ë§ ë¤ë¥¸ ë¸ë¼ì°ì ë ì´ë¥¼ ì§ìíì§ ìììµëë¤. ë°ë¼ì ë¤ìê³¼ ê°ì´ ìê°íì ìë ììµëë¤.
// ì´ ì½ë ì¡°ê°ì 문ìì´ì í¹ì í기ë²ì¼ë¡ ë¶í í©ëë¤.
let splitUpString;
if (navigator.userAgent.includes("Chrome")) {
// ëµ! ì¬ì©ìê° Look-Behind ì ê· ííìì ì§ìíë ê²ì¼ë¡ ìì¬ë©ëë¤.
// /(?<=[A-Z])/를 ì¬ì©íì§ ë§ì¸ì.
// look-behind ííìì ì§ìíì§ ìë ë¸ë¼ì°ì ììë 구문 ì¤ë¥ê° ë°ìí©ëë¤.
// 모ë ë¸ë¼ì°ì ë ì¤íëì§ ìì ì½ë ì¹ì
ì í¬í¨íì¬ ì ì²´ ì¤í¬ë¦½í¸ë¥¼ 구문 ë¶ìí기 ë문ì
ëë¤.
const camelCaseExpression = new RegExp("(?<=[A-Z])");
splitUpString = (str) => String(str).split(camelCaseExpression);
} else {
// ì´ ëì²´ ì½ëë ì±ë¥ì´ í¨ì¬ ë¨ì´ì§ì§ë§ ìëí©ëë¤.
splitUpString = (str) =>
String(str)
.split(/(.*?[A-Z])/)
.filter(Boolean);
}
console.log(splitUpString("fooBar")); // ["fooB", "ar"]
console.log(splitUpString("jQWhy")); // ["jQ", "W", "hy"]
ìì ì½ëë ëª ê°ì§ ì못ë ê°ì ì íì ê²ì ëë¤. 먼ì , íì 문ìì´ 'Chrome'ì í¬í¨íë 모ë ì¬ì©ì ìì´ì í¸ ë¬¸ìì´ì´ Chromeì´ë¼ê³ ê°ì í©ëë¤. UA 문ìì´ì ì¤í´ì ìì§ê° ìë ê²ì¼ë¡ ì ëª ì´ ëìµëë¤. ê·¸ë° ë¤ì, ë¸ë¼ì°ì ê° Chromeì¸ ê²½ì° lookbehind 기ë¥ì íì ì¬ì©í ì ìë¤ê³ ê°ì íìµëë¤. ìì´ì í¸ë ì§ìì´ ì¶ê°ë기 ì ì ì´ì ë²ì ì Chromeì¼ ìë ìê³ , (ë¹ì 기ë¥ì´ ì¤íì ì´ì기 ë문ì) ì´ë¥¼ ì ê±°í ìµì ë²ì ì Chromeì¼ ìë ììµëë¤. ê°ì¥ ì¤ìí ì ì ë¤ë¥¸ ë¸ë¼ì°ì ê° ì´ ê¸°ë¥ì ì§ìíì§ ìì ê²ì´ë¼ê³ ê°ì íë¤ë ê²ì ëë¤. ì¸ì ë ì§ ë¤ë¥¸ ë¸ë¼ì°ì ì ì§ìì´ ì¶ê°ë ì ìì§ë§, ì´ ì½ëë ê³ìí´ì ì´ë±í ê²½ë¡ë¥¼ ì ííì ê²ì ëë¤.
ì´ì ê°ì 문ì ë ëì ê¸°ë¥ ìì²´ì ì§ìì í ì¤í¸íì¬ í¼í ì ììµëë¤.
let isLookBehindSupported = false;
try {
new RegExp("(?<=)");
isLookBehindSupported = true;
} catch (err) {
// ìì´ì í¸ê° look behinds를 ì§ìíì§ ìë ê²½ì°, í´ë¹ 구문ì ì¬ì©íì¬ RegExp ê°ì²´ë¥¼ ë§ë¤ë ¤ê³ íë©´
// isLookBehindSupportedê° falseë¡ ì ì§ë©ëë¤.
}
const splitUpString = isLookBehindSupported
? (str) => String(str).split(new RegExp("(?<=[A-Z])"))
: (str) =>
String(str)
.split(/(.*?[A-Z])/)
.filter(Boolean);
console.log(splitUpString("fooBar")); // ["fooB", "ar"]
console.log(splitUpString("jQWhy")); // ["jQ", "W", "hy"]
ì ì½ëìì ì ì ìë¯ì´, ì¬ì©ì ìì´ì í¸ ì¤ëí ìì´ ë¸ë¼ì°ì ì§ìì íì í ì¤í¸íë ë°©ë²ì´ ììµëë¤. ì´ì ëí´, ì¬ì©ì ìì´ì í¸ ë¬¸ìì´ì íì¸í ì´ì ê° ì ë ììµëë¤.
ë§ì§ë§ì¼ë¡, ìì ì½ë ì¡°ê°ì íì ê³ ë ¤í´ì¼ íë í¬ë¡ì¤ ë¸ë¼ì°ì ì½ë©ê³¼ ê´ë ¨ë ì¤ìí 문ì 를 ê°ì ¸ìµëë¤. ì§ìëì§ ìë ë¸ë¼ì°ì ìì í ì¤í¸ ì¤ì¸ API를 ì¤ìë¡ ì¬ì©íì§ ë§ì¸ì. ì´ë ëª ë°±íê³ ë¨ìíê² ë¤ë¦´ ìë ìì§ë§, ëë¡ë ê·¸ë ì§ ììµëë¤. ì를 ë¤ì´, ìì ì½ë ì¡°ê°ìì ì§§ì ì ê·ì í기ë²(ì: /reg/igm)ì¼ë¡ lookbehind를 ì¬ì©íë©´ ì§ìëì§ ìë ë¸ë¼ì°ì ìì 구문 ë¶ì ì¤ë¥ê° ë°ìí©ëë¤. ê·¸ë¬ë¯ë¡, ìì ììììë, ì½ëì lookbehind ì§ì ì¹ì ììë ëì ì /(?<=look_behind_stuff)/ ëì new RegExp("(?<=look_behind_stuff)"); 를 ì¬ì©í©ëë¤.
- ì ì§ì ì¸ í¥ì
-
ì´ ëìì¸ ê¸°ì ìë ìí¥ì ì ê·¼ ë°©ìì ì¬ì©íì¬ 'ë ì´ì´'ìì ì¹ ì¬ì´í¸ë¥¼ ê°ë°íê³ , ë¨ìí ë ì´ì´ìì ììíì¬ ê°ê° ë ë§ì 기ë¥ì ì¬ì©íë ì°ìì ì¸ ë ì´ì´ìì ì¬ì´í¸ 기ë¥ì í¥ììí¤ë ìì ì´ í¬í¨ë©ëë¤.
- ì°ìí ì í
-
ì´ë ìíë 모ë 기ë¥ì ì¬ì©íì¬ ìµìì ì¬ì´í¸ë¥¼ 구ì¶íë íí¥ì ì ê·¼ ë°©ìì ëë¤, ê·¸ë° ë¤ì ì´ì ë¸ë¼ì°ì ìì ìëíëë¡ ì¡°ì íì¸ì. ì´ë ì ì§ì ì¸ í¥ìë³´ë¤ ìíí기 ì´ë µê³ ë í¨ê³¼ì ì¼ ì ìì§ë§, ì´ë¤ ê²½ì°ìë ì ì©í ì ììµëë¤.
- 모ë°ì¼ ì¥ì¹ ê°ì§
-
ì¬ì©ì ìì´ì í¸ ì¤ëíì ê°ì¥ ì¼ë°ì ì¸ ì¬ì© ë° ì¤ì©ì ì¥ì¹ê° 모ë°ì¼ ì¥ì¹ì¸ì§ ê°ì§íë ê²ì ëë¤. ê·¸ë¬ë, ì¬ëë¤ì ìì ì´ ì¤ì ë¡ ì¶êµ¬íë ê²ì´ 무ìì¸ì§ ë무 ì주 ê°ê³¼í©ëë¤. ì¬ëë¤ì ì¬ì©ì ìì´ì í¸ ì¤ëíì ì¬ì©íì¬ ì¬ì©ìì ì¥ì¹ê° í°ì¹ì ì í©íê³ íë©´ì´ ììì§ ê°ì§íì¬, ì´ì ë°ë¼ ì¹ì¬ì´í¸ë¥¼ ìµì íí ì ììµëë¤. ì¬ì©ì ìì´ì í¸ ì¤ëíì´ ëëë¡ ì´ë¥¼ ê°ì§í ì ìì§ë§, 모ë ì¥ì¹ê° ëì¼í ê²ì ìëëë¤. ì¼ë¶ 모ë°ì¼ ì¥ì¹ë íë©´ í¬ê¸°ê° í¬ê³ , ì¼ë¶ ë°ì¤í¬íìë ìì í°ì¹ì¤í¬ë¦°ì´ ìê³ , ì¼ë¶ ì¬ëë¤ì ì í ë¤ë¥¸ ì¤ë§í¸ TV를 ì¬ì©íë©°, ì¼ë¶ ì¬ëë¤ì íë¸ë¦¿ì ìì¼ë¡ ë¤ì§ì´ íë©´ì ëë¹ì ëì´ë¥¼ ëì ì¼ë¡ ë³ê²½í ì ììµëë¤! ë°ë¼ì, ì¬ì©ì ìì´ì í¸ ì¤ëíì íì¤í ì¢ì ë°©ë²ì´ ìëëë¤. ë¤íì´ë, í¨ì¬ ë ëì ëìì´ ììµëë¤. Navigator.maxTouchPoints를 ì¬ì©íì¬ ì¬ì©ì 기기ì í°ì¹ì¤í¬ë¦°ì´ ìëì§ íì¸íì¸ì. ê·¸ë° ë¤ì, 기본ì ì¼ë¡ (!("maxTouchPoints" in navigator)) { /*ì½ëë ì¬ê¸°ì ììµëë¤*/}ì¸ ê²½ì°ìë§ ì¬ì©ì ìì´ì í¸ íë©´ë§ íì¸íë ê²ì¼ë¡ ë¤ì ëìê°ëë¤. 기기ì í°ì¹ì¤í¬ë¦°ì´ ìëì§ ì¬ë¶ì ëí ì 보를 ì¬ì©íì¬, í°ì¹ 기기ì ëí´ìë§ ì¹ì¬ì´í¸ì ì ì²´ ë ì´ììì ë³ê²½íì§ ë§ì¸ì. ë¹ì ì ìì ì ìí´ ë ë§ì ìì ê³¼ ì ì§ ê´ë¦¬ë¥¼ ìì±íê² ë ê²ì ëë¤. ì¤íë ¤, ë í¬ê³ ì½ê² í´ë¦í ì ìë ë²í¼(CSS를 ì¬ì©íë©´ ê¸ê¼´ í¬ê¸°ë¥¼ ë릴 ì ìì)ê³¼ ê°ì í°ì¹ í¸ìì±ì ì¶ê°íì¸ì. ë¤ìì 모ë°ì¼ ì¥ì¹ìì #exampleButtonì í¨ë©ì 1emì¼ë¡ ë리ë ì½ëì ìì ëë¤.
let hasTouchScreen = false;
if ("maxTouchPoints" in navigator) {
hasTouchScreen = navigator.maxTouchPoints > 0;
} else if ("msMaxTouchPoints" in navigator) {
hasTouchScreen = navigator.msMaxTouchPoints > 0;
} else {
const mQ = matchMedia?.("(pointer:coarse)");
if (mQ?.media === "(pointer:coarse)") {
hasTouchScreen = !!mQ.matches;
} else if ("orientation" in window) {
hasTouchScreen = true; // deprecated, but good fallback
} else {
// Only as a last resort, fall back to user agent sniffing
const UA = navigator.userAgent;
hasTouchScreen =
/\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
/\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA);
}
}
if (hasTouchScreen) {
document.getElementById("exampleButton").style.padding = "1em";
}
íë©´ í¬ê¸°ë, 'window.innerWidth' ë° window.addEventListener("resize", () => { /*íë©´ í¬ê¸°ì ë°ë¼ ìë¡ê³ 침*/ })ì ì¬ì©íì¸ì. íë©´ í¬ê¸°ì ëí´ ìíë ê²ì ìì íë©´ì ì 보를 ìë¼ë´ë ê²ì´ ìëëë¤. ë°ì¤í¬í± ë²ì ì ì¬ì©íëë¡ ê°ìí기 ë문ì, ì¬ëë¤ì ì§ì¦ëê² í ë¿ì ëë¤. ì¤íë ¤, ìì íë©´ììë 긴 íì´ì§ì ë ì ì ìì ì ë³´ ì´ì ëê³ , í° íë©´ììë ë ì§§ì íì´ì§ì ë ë§ì ì´ì ëë ê²ì´ ì¢ìµëë¤. ì´ í¨ê³¼ë CSS flexbox를 ì¬ì©íì¬ ì½ê² ì»ì ì ììµëë¤, ëë¡ë í¨ê» ë¶ë¶ ëì²´ë¡ì floatsë ì¬ì©í©ëë¤.
ëí, ê´ë ¨ì±ì´ ë®ê±°ë ì¤ìí ì 보를 ìë쪽ì¼ë¡ ì®ê¸°ê³ íì´ì§ ì½í ì¸ ë¥¼ ì미 ìê² ê·¸ë£¹ííì¸ì. 주ì ìì ë²ì´ë ë´ì©ì´ì§ë§, ë¤ìì ìì¸í ìë ì¬ì©ì ìì´ì í¸ ì¤ëíì ì¤ë¨íëë¡ ì¤ëíë íµì°°ë ¥ê³¼ ìì´ëì´ë¥¼ ì ê³µí ì ììµëë¤. ì ë³´ ììë¡ êµ¬ì±ë íì´ì§ë¥¼ ììí´ ë´ ìë¤. ê° ììë ë¤ë¥¸ ê³ ìì´ íì¢ ëë ê° íì¢ ì ê´í ê²ì ëë¤. ê° ìììë ì´ë¯¸ì§, ê°ì ë° ìì¬ì ì¼ë¡ ì¬ë¯¸ìë ì¬ì¤ì´ í¬í¨ëì´ ììµëë¤. ì¬ì§ì ëí íë©´ììë ìµëí ì ë¹í í¬ê¸°ë¡ ì ì§ë©ëë¤. ì½í ì¸ ë¥¼ ì미ìê² ê·¸ë£¹íí기 ìí´, ê³ ìì´ ììì ê° ììê° ìë¡ ìì´ì§ ìëë¡ ëª¨ë ê³ ìì´ ììì ê° ìì를 ë¶ë¦¬í©ëë¤. í° íë©´ììë, ì¬ë¬ ê°ì ì´ì ë°°ì¹íì¬ ì¬ì§ì ì¼ìª½ê³¼ ì¤ë¥¸ìª½ì ëë¹ëë ê³µê°ì ì¤ì¬, ê³µê°ì ì ì½í©ëë¤. ììë ë ê°ì§ ê· ì¼í ê³µì í ë°©ë²ì íµí´ ì¬ë¬ ì´ë¡ ë¶ë¦¬ë ì ììµëë¤. ì´ ìì ë¶í° ì°ë¦¬ë 모ë ê°ìì§ ììê° ìì¤ ì½ëì ìë¨ì ìê³ , 모ë ê³ ìì´ ììê° ìì¤ ì½ëì íë¨ì ìì¼ë©°, ì´ ëª¨ë ììê° ëì¼í ë¶ëª¨ ìì를 ê°ì§ê³ ìë¤ê³ ê°ì í´ë´ ìë¤. ë¬¼ë¡ ê³ ìì´ ìì ë°ë¡ ìì ê°ìì§ ììê° íë ììµëë¤. 첫 ë²ì§¸ ë°©ë²ì ìí Flexbox를 ì¬ì©íì¬ íì´ì§ê° ìµì¢ ì¬ì©ììê² íìë ë 모ë ê°ìì§ ììê° ìë¨ì ì¤ëë¡ ì½í ì¸ ë¥¼ 그룹íí©ëë¤. íì´ì§ì 모ë ê³ ìì´ ììë íì´ì§ ìë쪽ì ììµëë¤. ë ë²ì§¸ ë°©ë²ì Column ë ì´ììì ì¬ì©íê³ ëª¨ë ê°ìì§ë ì¼ìª½ì¼ë¡, 모ë ê³ ìì´ë ì¤ë¥¸ìª½ì¼ë¡ ë³´ë ëë¤. ì´ í¹ì ìë리ì¤ììë§ flexbox/ë¤ì¤ ì´ì ëí ëì²´ ëìì ì ê³µíì§ ìë ê²ì´ ì ì íë¯ë¡ ì´ì ë¸ë¼ì°ì ììë ë§¤ì° ëì ììì ë¨ì¼ ì´ì´ ìì±ë©ëë¤. ëí ë¤ì ìí©ì ê³ ë ¤íì¸ì. ë ë§ì ì¬ëë¤ì´ ê³ ìì´ë¥¼ 보기 ìí´ ì¹íì´ì§ë¥¼ 방문íë¤ë©´, ìì¤ ì½ëìì ê°ë³´ë¤ ê³ ìì´ë¥¼ 모ë ììì ë°°ì¹íì¬ ë ë§ì ì¬ëë¤ì´ ì½í ì¸ ê° í ì´ ìëë¡ ì¶ìëë ìì íë©´ìì ìíë ê²ì ë 빨리 ì°¾ì ì ìëë¡ íë ê² ì¢ìµëë¤.
ë¤ìì¼ë¡, íì ì½ë를 ëì ì¼ë¡ ë§ë¤ì´ì£¼ì¸ì.
ì¬ì©ìë 모ë°ì¼ ì¥ì¹ë¥¼ ìì¼ë¡ ë¤ì§ì´ íì´ì§ì ëë¹ì ëì´ë¥¼ ë³ê²½í ì ììµëë¤.
ëë, ëì¤ì ë¤ì§ì´ì íë©´ì íì¥íë ì´ìí íë¦½í° ê°ì ì¥ì¹ê° ìì ìë ììµëë¤.
íë¦½í° ê°ì ì¥ì¹ë¥¼ ì´ë»ê² ì²ë¦¬í ì§ ê³ ë¯¼íë ê°ë°ìê° ëì§ ë§ì¸ì.
ì¹íì´ì§ê° ë¶ëë½ê³ , ì ì°íë©°, ëì ì¼ë¡ í¬ê¸°ê° ì¡°ì ëë ëì ê°ë° ë구 측면 í¨ëì ì´ê³ íë©´ í¬ê¸°ë¥¼ ì¡°ì í ì ìì ëê¹ì§ ì¹íì´ì§ì ë§ì¡±íì§ ë§ì¸ì.
í ì ìë ê°ì¥ ê°ë¨í ë°©ë²ì íë©´ í¬ê¸°ì ë°ë¼ ì½í
ì¸ ë¥¼ ì´ëíë 모ë ì½ë를 íì´ì§ê° ë¡ëë ëì ê·¸ íì ê° resize ì´ë²¤í¸ìì í¸ì¶ëë ë¨ì¼ í¨ìë¡ ë¶ë¦¬íë ê²ì
ëë¤. íì´ì§ì ì ë ì´ììì ê²°ì í기 ì ì ì´ ë ì´ìì í¨ìë¡ ê³ì°ë ìì´ ë§ì ê²½ì° ì´ë²¤í¸ 리ì¤ëê° ì주 í¸ì¶ëì§ ìëë¡ ëë°ì´ì±ì ê³ ë¯¼í´ë³´ì¸ì.
ëí 미ëì´ ì¿¼ë¦¬ (max-width: 25em), not all and (min-width: 25em) ë° (max-width: 24.99em) ì¬ì´ìë í° ì°¨ì´ê° ììµëë¤. (max-width: 25em)ë (max-width: 25em)ì ì ì¸íë ë°ë©´, not all and (min-width: 25em)ë (max-width: 25em)를 í¬í¨í©ëë¤.
(max-width: 24.99em)ë not all and (min-width: 25em)ì ì¢ì§ ìì ë²ì ì
ëë¤. (max-width: 24.99em)를 ì¬ì©íì§ ë§ì¸ì. í¥í ì´ê³ íì§ ê¸°ê¸°ìì ë§¤ì° í° ê¸ê¼´ í¬ê¸°ë¡ ì¸í´ ë ì´ììì´ 'ê¹¨ì§ ì' ì기 ë문ì
ëë¤.
ì¬ë°ë¥¸ 미ëì´ ì¿¼ë¦¬ë¥¼ ì ííê³ í´ë¹ JavaScriptìì ì¬ë°ë¥¸ >=, <=, >, ëë <를 ì ííë ë° ìì´ íì 주ì를 기ì¸ì´ì¸ì. ì´ë¬í íëª©ì´ í¼ëì 주기 ì½ê³ , ë ì´ììì´ ë³ê²½ëë íë©´ í¬ê¸°ì ë°ë¼ ì¹ ì¬ì´í¸ê° ì´ìíê² ë³´ì¼ ì ì기 ë문ì
ëë¤.
ë°ë¼ì, ë ì´ìì ë³ê²½ì´ ë°ìíë ì íí ëë¹/ëì´ìì ì¹ì¬ì´í¸ë¥¼ ì² ì íê² í
ì¤í¸íì¬ ë ì´ìì ë³ê²½ì´ ì ëë¡ ë°ìíëì§ íì¸íì¸ì.
ì¬ì©ì ìì´ì í¸ ì¤ëíì ìµëí íì©í기
ìì ì¬ì©ì ìì´ì í¸ ì¤ëíì ëí ë ëì ëìì 모ë ê²í í íìë, ì¬ì©ì ìì´ì í¸ ì¤ëíì´ ì ì íê³ ì ë¹í ì ì¬ì ì¸ ê²½ì°ê° ì¬ì í ììµëë¤.
ê·¸ë¬í ì¬ë¡ ì¤ íëë ì¥ì¹ì í°ì¹ ì¤í¬ë¦°ì´ ìëì§ ê°ì§í ë ëì²´ ìë¨ì¼ë¡ ì¬ì©ì ìì´ì í¸ ì¤ëíì ì¬ì©íë ê²ì ëë¤. ìì¸í ë´ì©ì 모ë°ì¼ ì¥ì¹ ê°ì§ ì¹ì ì 참조íì¸ì.
ë ë¤ë¥¸ ì¬ë¡ë ìëì¼ë¡ ì ë°ì´í¸ëì§ ìë ë¸ë¼ì°ì ì ë²ê·¸ë¥¼ ìì íë ê²ì ëë¤. Webkit(iOS)ì´ ìë²½í ììë¡ ë¤ ì ììµëë¤. Appleì IOSì 모ë ë¸ë¼ì°ì ê° ë´ë¶ì ì¼ë¡ Webkitì ì¬ì©íëë¡ ê°ì íë¯ë¡, ì¬ì©ìë ì´ì ì¥ì¹ìì ë ëì ì ë°ì´í¸ë ë¸ë¼ì°ì 를 ì»ì ì ììµëë¤. ëë¶ë¶ì ë²ê·¸ë ê°ì§í ì ìì§ë§ ì¼ë¶ ë²ê·¸ë ë¤ë¥¸ ë²ê·¸ë³´ë¤ ê°ì§íë ë° ë ë§ì ë ¸ë ¥ì´ íìí©ëë¤. ì´ë¬í ê²½ì° ì±ë¥ì ì ì½í기 ìí´, ì¬ì©ì ìì´ì í¸ ì¤ëíì ì¬ì©íë ê²ì´ ëìì´ ë ì ììµëë¤. ì를 ë¤ì´, Webkit 6ìë ì¥ì¹ ë°©í¥ì´ ë³ê²½ë ë ë¸ë¼ì°ì ê° MediaQueryList 리ì¤ë를 ì¤íí´ì¼ í ë ì¤ííì§ ìì ì ìë ë²ê·¸ê° ììµëë¤. ì´ ë²ê·¸ë¥¼ 극복íë ¤ë©´ ìë ì½ë를 íì¸í´ì£¼ì¸ì.
const UA = navigator.userAgent;
const isWebkit =
/\b(iPad|iPhone|iPod)\b/.test(UA) &&
/WebKit/.test(UA) &&
!/Edge/.test(UA) &&
!window.MSStream;
let mediaQueryUpdated = true;
const mqL = [];
function whenMediaChanges() {
mediaQueryUpdated = true;
}
const listenToMediaQuery = isWebkit
? (mQ, f) => {
if (/height|width/.test(mQ.media)) {
mqL.push([mQ, f]);
}
mQ.addListener(f);
mQ.addListener(whenMediaChanges);
}
: () => {};
const destroyMediaQuery = isWebkit
? (mQ) => {
for (let i = 0; i < mqL.length; i++) {
if (mqL[i][0] === mQ) {
mqL.splice(i, 1);
}
}
mQ.removeListener(whenMediaChanges);
}
: listenToMediaQuery;
let orientationChanged = false;
addEventListener(
"orientationchange",
() => {
orientationChanged = true;
},
PASSIVE_LISTENER_OPTION,
);
addEventListener("resize", () =>
setTimeout(() => {
if (orientationChanged && !mediaQueryUpdated) {
for (let i = 0; i < mqL.length; i++) {
mqL[i][1](mqL[i][0]);
}
}
mediaQueryUpdated = orientationChanged = false;
}, 0),
);
ì¬ì©ì ìì´ì í¸ì ì´ë ë¶ë¶ì ì°¾ê³ ìë ì ë³´ê° í¬í¨ëì´ ìëì?
ì¬ì©ì ìì´ì í¸ ë¬¸ìì´ì ë¤ë¥¸ ë¶ë¶ììë ê· ì¼ì±ì´ ì기 ë문ì, ì´ê²ì´ ê¹ë¤ë¡ì´ ë¶ë¶ì ëë¤.
ë¸ë¼ì°ì ì´ë¦ ë° ë²ì
ì¬ëë¤ì´ "ë¸ë¼ì°ì ê°ì§"를 ìíë¤ê³ íë©´, ì¤ì ë¡ë "ë ëë§ ìì§ ê°ì§"를 ìíë ê²½ì°ê° ë§ìµëë¤. ì¤ì ë¡ SeaMonkeyê° ìë Firefox를 ê°ì§íê³ ì¶ê±°ë Chromiumì´ ìë Chromeì ê°ì§íê³ ì¶ëì? ìëë©´ ë¸ë¼ì°ì ê° Gecko ëë WebKit ë ëë§ ìì§ì ì¬ì©íê³ ìëì§ ì¤ì ë¡ íì¸íê³ ì¶ëì? íìíë©´ íì´ì§ ìë를 참조íì¸ì.
ëë¶ë¶ì ë¸ë¼ì°ì ë 'BrowserName/VersionNumber' íìì¼ë¡ ì´ë¦ê³¼ ë²ì ì ì¤ì í©ëë¤. ê·¸ë¬ë ì´ë¦ì í´ë¹ íìì ì¬ì©ì ìì´ì í¸ ë¬¸ìì´ì ìë ì ì¼í ì ë³´ê° ìë기 ë문ì, ë¸ë¼ì°ì ì´ë¦ì ì°¾ì ì ìê³ , ì°¾ê³ ìë ì´ë¦ì´ ë§ëì§ë§ íì¸í ì ììµëë¤. ê·¸ë¬ë ì¼ë¶ ë¸ë¼ì°ì ë ê±°ì§ë§ì íê³ ììµëë¤. ì를 ë¤ì´, Chromeì Chromeê³¼ Safari 모ë ë³´ê³ í©ëë¤. ë°ë¼ì Safari를 ê°ì§íë ¤ë©´ Safari 문ìì´ê³¼ Chrome 문ìì´ì´ ìëì§ íì¸í´ì¼ í©ëë¤. Chromiumì ì¢ ì¢ ìì ì Chromeì¼ë¡ ë³´ê³ íê±°ë Seamonkeyë ëëë¡ ìì ì Firefoxë¡ ë³´ê³ í©ëë¤.
ëí, BrowserNameì ê°ë¨í ì ê·ìì ì¬ì©íì§ ìëë¡ ì£¼ìíì¸ì. ì¬ì©ì ìì´ì í¸ìë í¤ìë/ê° êµ¬ë¬¸ ì¸ë¶ì 문ìì´ë í¬í¨ëì´ ììµëë¤. ì를 ë¤ì´, Safariì Chromeìë 'like Gecko'ë¼ë 문ìì´ì´ í¬í¨ëì´ ììµëë¤.
| ìì§ | ë°ëì í¬í¨í´ì¼ í¨ | ë¤ìì í¬í¨íë©´ ì ë¨ |
|---|---|---|
| Firefox | Firefox/xyz |
Seamonkey/xyz |
| Seamonkey | Seamonkey/xyz |
|
| Chrome | Chrome/xyz |
Chromium/xyz or Edg.*/xyz |
| Chromium | Chromium/xyz |
|
| Safari | Safari/xyz |
Chrome/xyz or Chromium/xyz |
| Opera 15+ (Blink ê¸°ë° ìì§) | OPR/xyz |
|
| Opera 12- (Presto ê¸°ë° ìì§) | Opera/xyz |
[1] Safarië ë ê°ì§ ë²ì ë²í¸ë¥¼ ì ê³µí©ëë¤. íëë 기ì ì ì¸ Safari/xyz í í°ì´ê³ , ë¤ë¥¸ íëë ì¬ì©ì ì¹íì ì¸ Version/xyz í í°ì
ëë¤.
ë¬¼ë¡ , ë¤ë¥¸ ë¸ë¼ì°ì ê° ì´ë¬í ê¸°ë¥ ì¤ ì¼ë¶ë¥¼ ê°ë¡ì±ì§ ìì ê²ì´ë¼ë ë³´ì¥ì ì í ììµëë¤(과거 Chromeì´ Safari 문ìì´ì ê°ë¡ì± ê²ì²ë¼). ê·¸ë 기 ë문ì ì¬ì©ì ìì´ì í¸ ë¬¸ìì´ì ì¬ì©í ë¸ë¼ì°ì ê°ì§ë ì 뢰í ì ìì¼ë©°, ë²ì ë²í¸ë¥¼ íì¸í íìë§ ìíí´ì¼ í©ëë¤(ì´ì ë²ì ì ê°ë¡ì± ê°ë¥ì±ì´ ì ì).
ë ëë§ ìì§
ìì ì´í´ë³¸ ê²ì²ë¼, ëë¶ë¶ì ê²½ì°, ë ëë§ ìì§ì ì°¾ë ê²ì´ ë ëì ë°©ë²ì ëë¤. ì´ë ë ìë ¤ì§ ë¸ë¼ì°ì 를 ì ì¸íì§ ìë ë° ëìì´ ë©ëë¤. ê³µíµ ë ëë§ ìì§ì ê³µì íë ë¸ë¼ì°ì ë ëì¼í ë°©ìì¼ë¡ íì´ì§ë¥¼ íìí©ëë¤. ì¦, í íì´ì§ìì ìëíë ê²ì´ ë¤ë¥¸ ë¸ë¼ì°ì ììë ìëí ê²ì´ë¼ë ê³µì í ê°ì ì¸ ê²½ì°ê° ë§ìµëë¤.
Blink, Gecko ë° WebKitì ì¸ ê°ì§ íì± ì£¼ì ë ëë§ ìì§ì´ ììµëë¤. ë ëë§ ìì§ ì´ë¦ì ì¤ëííë ê²ì´ ì¼ë°ì ì´ê¸° ë문ì, ë§ì ì¬ì©ì ìì´ì í¸ê° ê°ì§ë¥¼ í¸ë¦¬ê±°í기 ìí´ ë¤ë¥¸ ë ëë§ ì´ë¦ì ì¶ê°íìµëë¤. ë°ë¼ì ë ëë§ ìì§ì ê°ì§í ë ê±°ì§ ê¸ì ì ì ë°íì§ ìëë¡ ì£¼ìíë ê²ì´ ì¤ìí©ëë¤.
| ìì§ | ë°ëì í¬í¨í´ì¼ í¨ | ì¤ëª |
|---|---|---|
| Blink | Chrome/xyz |
|
| Gecko | Gecko/xyz |
|
| WebKit | AppleWebKit/xyz |
주ìíì¸ì, WebKit ë¸ë¼ì°ì ë ê°ì§ê° ë¶ì£¼ìí ê²½ì° Geckoì ëí ì¤íì§ë¥¼ ì ë°í ì ìë 'like Gecko' 문ìì´ì ì¶ê°í©ëë¤. |
| Presto | Opera/xyz |
ì°¸ê³ : Prestoë ë ì´ì Opera ë¸ë¼ì°ì ë¹ë ë²ì 15 ì´íìì ì¬ì©ëì§ ììµëë¤('Blink' 참조) |
| EdgeHTML | Edge/xyz |
Chromiumì´ ìë Edgeë ì í리ì¼ì´ì ë²ì ì´ ìë 'Edge/' í í° ë¤ì ì°ì§ ë²ì ì ë°°ì¹í©ëë¤. ì°¸ê³ : EdgeHTMLì Edge ë¸ë¼ì°ì ë¹ë ë²ì 79 ì´íìì ë ì´ì ì¬ì©ëì§ ììµëë¤ ('Blink' 참조). |
ìì§ ë²ì ë ëë§
ëë¶ë¶ì ë ëë§ ìì§ì Gecko를 ì ì¸íê³ 'RenderingEngine/VersionNumber' í í°ì ë²ì ë²í¸ë¥¼ ë£ìµëë¤. Geckoë rv: 문ìì´ ë¤ì ì¬ì©ì ìì´ì í¸ ì£¼ì ë¶ë¶ì Gecko ë²ì ë²í¸ë¥¼ ë£ìµëë¤. 모ë°ì¼ ë²ì ì© Gecko 14ì ë°ì¤í¬í± ë²ì ì© Gecko 17ììë ì´ ê°ì 'Gecko/version' í í°ìë ë£ìµëë¤(ì´ì ë²ì ììë ë¹ë ë ì§ë¥¼ ë£ì ë¤ì GeckoTrailì´ë¼ë ê³ ì ë ì§ë¥¼ ë£ììµëë¤)
ì´ìì²´ì
ì´ì ì²´ì ë ëë¶ë¶ì ì¬ì©ì ìì´ì í¸ ë¬¸ìì´ì ì ê³µëì§ë§(Firefox OSì ê°ì ì¹ ì¤ì¬ íë«í¼ì ìë) íìì´ ë§ì´ ë¤ë¦ ëë¤. ì¬ì©ì ìì´ì í¸ì 주ì ë¶ë¶ì ìë ë ê°ì ì¸ë¯¸ì½ë¡ ì¬ì´ì ìë ê³ ì 문ìì´ì ëë¤. ì´ë¬í 문ìì´ì ê° ë¸ë¼ì°ì ë§ë¤ ë¤ë¦ ëë¤. ì´ë OSë¿ë§ ìëë¼ í´ë¹ ë²ì ê³¼ ê´ë ¨ íëì¨ì´(32ë¹í¸ ëë 64ë¹í¸ ëë Macì© Intel/PPC)ì ëí ì ë³´ë ëíë ëë¤.
모ë ê²½ì°ì ë§ì°¬ê°ì§ë¡, ì´ë¬í 문ìì´ì í¥í ë³ê²½ë ì ìì¼ë¯ë¡, ì´ë¯¸ ì¶ìë ë¸ë¼ì°ì 를 ê°ì§íë ê²½ì°ìë§ ì¬ì©í´ì¼ í©ëë¤. ì ë¸ë¼ì°ì ë²ì ì´ ì¶ìëë©´ ì¤í¬ë¦½í¸ë¥¼ ì¡°ì í기 ìí 기ì ì¡°ì¬ê° ì´ë£¨ì´ì ¸ì¼ í©ëë¤.
모ë°ì¼, íë¸ë¦¿ ëë ë°ì¤í¬í±
ì¬ì©ì ìì´ì í¸ ì¤ëíì ìííë ê°ì¥ ì¼ë°ì ì¸ ì´ì ë ë¸ë¼ì°ì ê° ì¤íëë ì¥ì¹ íì ì íì¸íë ê²ì ëë¤. 목íë ë¤ìí ì¥ì¹ íì ì ë¤ìí HTMLì ì ê³µíë ê²ì ëë¤.
- ë¸ë¼ì°ì ë ë ëë§ ìì§ì´ í ê°ì§ íì ì ì¥ì¹ììë§ ì¤íëë¤ê³ ê°ì íì§ ë§ì¸ì. í¹í ë¸ë¼ì°ì ë ë ëë§ ìì§ë§ë¤ 기본ê°ì ë¤ë¥´ê² ì¤ì íì§ ë§ì¸ì.
- ë¸ë¼ì°ì ê° ëª¨ë°ì¼, íë¸ë¦¿ ëë ë°ì¤í¬í±ì ìëì§ ì ìí기 ìí´ OS í í°ì ì¬ì©íì§ ë§ì¸ì. OSë ë ê°ì§ ì´ìì íì ìì ì¤íë ì ììµëë¤(ì, Androidë í´ëí°ë¿ë§ ìëë¼ íë¸ë¦¿ììë ì¤íë¨)
ë¤ì íìë ì¼ë° ë¸ë¼ì°ì ê³µê¸ì ì²´ê° í´ë¹ ë¸ë¼ì°ì ê° ëª¨ë°ì¼ ì¥ì¹ìì ì¤íëê³ ììì ëíë´ë ë°©ìì´ ìì½ëì´ ììµëë¤.
| ë¸ë¼ì°ì | ê·ì¹ | ìì |
|---|---|---|
| Mozilla (Gecko, Firefox) | ì¤ëª
ìì Mobile ëë Tablet. |
Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0 |
| WebKit ê¸°ë° (Android, Safari) | ì¤ëª
ì¸ë¶ì Mobile Safari í í°. |
Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 |
| Blink ê¸°ë° (Chromium, Google Chrome, Opera 15+, Edge on Android) | ì¤ëª
ì¸ë¶ìMobile Safari í í° |
Mozilla/5.0 (Linux; Android 4.4.2); Nexus 5 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Mobile Safari/537.36 OPR/20.0.1396.72047 |
| Presto ê¸°ë° (Opera 12-) | ì¤ëª
ë´ë¶ì Opera Mobi/xyz í í° |
Opera/9.80 (Android 2.3.3; Linux; Opera Mobi/ADR-1111101157; U; es-ES) Presto/2.9.201 Version/11.50 |
| Edge on Windows 10 Mobile | ì¤ëª
ì¸ë¶ì Mobile/xyz ë° Edge/ í í° |
Mozilla/5.0 (Windows Phone 10.0; Android 6.0.1; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36 Edge/16.16299 |
ìì½íìë©´, 모ë°ì¼ ì¥ì¹ë¥¼ ê°ì§íë ¤ë©´ ì¬ì©ì ìì´ì í¸ ì´ëììë Mobi 문ìì´ì ì°¾ë ê²ì´ ì¢ìµëë¤.
ì°¸ê³ :
ì¥ì¹ê° Mobië¡ íìëì§ ìì ë§í¼ ì¶©ë¶í í° ê²½ì°, ë°ì¤í¬í± ì¬ì´í¸ë¥¼ ì ê³µí´ì¼ í©ëë¤ (ë ë§ì ë°ì¤í¬í± ì»´í¨í°ê° í°ì¹ ì¤í¬ë¦°ì ì¬ì©íë¯ë¡ ì´ì¨ë í°ì¹ ì
ë ¥ì ì§ìíë ê²ì´ ê°ì¥ ì¢ìµëë¤).