è§å£æ¦å¿µ
è¿ç¯æç« éè¿°äºè§å£ï¼viewportï¼çæ¦å¿µï¼å¯¹å¯è§è§å£ï¼visual viewportï¼åå¸å±è§å£ï¼layout viewportï¼è¿è¡åºåï¼å¹¶è®©ä½ äºè§£è§å£çæä¹æ¯ä»ä¹ï¼ä»¥åå®å¨ CSSãSVG åç§»å¨è®¾å¤æ¹é¢çå½±åã
ä»ä¹æ¯è§å£ï¼
è§å£ä»£è¡¨å½åå¯è§çè®¡ç®æºå¾å½¢åºåãå¨ Web æµè§å¨æ¯è¯ä¸ï¼é叏䏿µè§å¨çªå£ç¸åï¼ä½ä¸å æ¬æµè§å¨ç UIï¼èåæ çââå³æä½ æ£å¨æµè§çææ¡£çé£ä¸é¨åã
ææ¡£ï¼æ¯å¦è¿ç¯æç« ï¼å¯è½ä¼é常é¿ãä½ çè§å£å°±æ¯ä½ ç°å¨æè½è§å°çææäºç©ãå¼å¾æ³¨æçæ¯âä»ä¹æ¯è§å£åºåâè¿ä¸ªé®é¢ï¼é¡µé¢ä¸çä¸äºå¯¼èªèåä¹å æ¬å¨å ¶ä¸ãè§å£ç大å°åå³äºå±å¹ç大å°ï¼æ 论æµè§å¨æ¯å¦å¤äºå ¨å±æ¨¡å¼ï¼æ¯å¦è¢«ç¨æ·ç¼©æ¾äºãè§å£å¤çåºåï¼æ¯å¦è¿ä¸ªææ¡£çåè§é¨åï¼å¯è½éè¦æ»å¨å°å ¶æå¨çåºåæä¼åºç°å¨å±å¹ä¸ã
- å¨å°ºå¯¸è¾å¤§ç设å¤ä¸ï¼å¨è¿äºè®¾å¤ä¸ï¼åºç¨æ¾ç¤ºåºåä¸ä¸å®æ¯å ¨å±çï¼è§å£æ¯æµè§å¨çªå£ç大å°ã
- å¨å¤§å¤æ°ç§»å¨è®¾å¤ä¸ï¼æµè§å¨æ¯å ¨å±çï¼è§å£æ¯æ´ä¸ªå±å¹ç大å°ã
- å¨å ¨å±æ¨¡å¼ä¸ï¼è§å£æ¯è®¾å¤å±å¹çèå´ï¼çªå£æ¯æµè§å¨çªå£ï¼æµè§å¨çªå£å¤§å°å°äºæçäºè§å£ç大å°ï¼å¹¶ä¸ææ¡£æ¯è¿ä¸ªç½ç«ï¼ææ¡£ç大å°å¯æ¯è§å£é¿æå®½ã
æ¦æ¬å°è¯´ï¼è§å£åºæ¬ä¸æ¯å½åææ¡£çå¯è§é¨åã
è§å£å¤§å°æ¯å¯åç
è§å£çå®½åº¦å¹¶ä¸æ»æ¯çªå£ç宽度ãå¦æä½ æµè¯ Chrome æ Firefox æµè§å¨ä¸ window å document ç宽度åé«åº¦ï¼ä½ ä¼å¾å°å¦ä¸å¼ï¼
document.documentElement.clientWidth; /* 1200 */
window.innerWidth; /* 1200 */
window.outerWidth; /* 1200 */
document.documentElement.clientHeight; /* 800 */
window.innerHeight; /* 800 */
window.outerHeight; /* 900 */
ä¸é¢æ¯ä¸äºå¸®å©ä½ æ¥è¯¢è§å£å¤§å°åå ¶ä»ç±»ä¼¼çé¿åº¦å±æ§ç DOM 屿§ï¼
- ææ¡£ç
Element.clientWidthæ¯æä¸ä¸ªææ¡£ä½¿ç¨ CSS åç´ åä½è¡¨ç¤ºçå é¨å®½åº¦ï¼å æ¬å ¶å è¾¹è·ï¼ä¸å æ¬è¾¹æ¡ãå¤è¾¹è·ååç´æ»å¨æ¡ï¼ãè¿å°±æ¯è§å£ç宽度ã Window.innerWidthæ¯ç¨ CSS åç´ åä½è¡¨ç¤ºçæµè§å¨çªå£çè§å£å®½åº¦ï¼å æ¬åç´æ»å¨æ¡ãWindow.outerWidthæ¯æå æ¬äºæµè§å¨å¤è¾¹æ¡ççªå£å®½åº¦ã
å¨å®æµä¸ï¼innerWidth å outerWidth æ¯ç¸åçï¼ä½æ¯ outerHeight æ¯ innerHeight é« 100pxãè¿æ¯å 为 outerHeight çæµéå
æ¬æµè§å¨æ¡æ¶å¨å
ï¼å
æ¬äºå°åæ åä¹¦ç¾æ æ»å
± 100px çé«åº¦ï¼èæµè§å¨æ²¡æå·¦å³è¾¹æ¡ã
innerHeight å innerWidth æç»æçåºåé常被认为æ¯å¸å±è§å£ï¼layout viewportï¼ãæµè§å¨çæ¡æ¶ä¸è¢«è®¤ä¸ºæ¯è§å£çä¸é¨åã
å½ç¼©æ¾æ¶ï¼Firefox å Chrome 对 innerWidth å clientWidth ç»åºäºæ°ç CSS åç´ å¤§å°ãæµè§å¨å¯¹ outerWidth å outerHeight çè¿å弿差å¼ãFirefox è¿åäºç¼©æ¾åç CSS åç´ å¼ï¼Chrome è¿åäºé»è®¤çåç´ å¼ï¼
document.documentElement.clientWidth; /* 800 */
window.innerWidth; /* 800 */
window.outerWidth; /* 800 in Firefox, 1200 in chrome */
document.documentElement.clientHeight; /* 533 */
window.innerHeight; /* 533 */
window.outerHeight; /* 596 in Firefox, 900 in chrome */
åå§çè§å£å¤§å°æ¯ 1200 x 800 åç´ ã缩æ¾ååæäº 800 x 533ãè¿æ¯å¸å±è§å£ã该ç½é¡µæåºå®ç头é¨åå°¾é¨ï¼å¸¦æä¸åæ ·å¼ï¼å®ä»¬å°ä¼åºå®å¨ç¸å¯¹å¸å±è§å£çé¡¶é¨ååºé¨ã
body > header {
position: fixed;
top: 0;
}
body > footer {
position: fixed;
bottom: 0;
}
缩æ¾åï¼æä»¬å¾å°äº 800 x 533 çæµéå¼ã头é¨åå°¾é¨ä»ç¶åºå®å¨çªå£çé¡¶é¨ååºé¨ã使¯å½ä½¿ç¨è§¦å±åæç¼©æ¾æè å½é®ç卿æºä¸å¼¹åºçæ¶åå¢ï¼
Web æµè§å¨å å«ä¸¤ä¸ªè§å£ï¼å¸å±è§å£åå¯è§è§å£ãå¯è§è§å£æå½åæµè§å¨ä¸å¯è§çé¨åï¼å¹¶ä¸å¯ä»¥ååãå½ä½¿ç¨åæç¼©æ¾ï¼æé®ç卿æºä¸å¼¹åºçæ¶åï¼æè ä¹åéèçå°åæ åå¾å¯è§çæ¶åï¼å¯è§è§å£ç¼©å°äºï¼ä½æ¯å¸å±è§å£å´ä¿æä¸åã
æä»¬ä¸é¢è¯´å°çåºå®ç头é¨åå°¾é¨ï¼åºå®å¨å¸å±è§å£çåºé¨åé¡¶é¨ï¼æä»¥å½æä»¬å¯¹å¯è§è§å£ä½¿ç¨é®çæ¾å¤§çæ¶åï¼å¤´é¨åå°¾é¨ä»ä¿çå¨è§éä¸ãå½ä½ 缩æ¾é¡µé¢æ¶ï¼å¸å±è§å£å¯è½ä¸è½è¢«å ¨é¨çå°ãå¦æä½ æ¾å¤§å¸å±è§å£çä¸é´é¨åï¼å 容å°å¨å个æ¹å䏿©å±ãå¦æä½ æä¸ä¸ªåºå®ç头é¨ååºé¨ï¼å®ä»¬ä¾ç¶åºå®å¨å¸å±è§å£çé¡¶é¨ååºé¨ï¼å æ¤å®ä»¬å¯è½ä¼å¨è®¾å¤å±å¹çåºé¨åé¡¶é¨ä¸å¯è§ââå¯è§è§å£ãå¯è§è§å£æ¯å¸å±è§å£å½åçå¯è§é¨åãå¦æä½ å䏿»å¨ï¼å¯è§è§å£çå 容就伿¹åï¼å¹¶å¸å±è§å£çåºé¨å°±ä¼æ»å¨å°å¯è§åºåã
å¯è§è§å£æ¯å±å¹çå¯è§é¨åï¼ä¸å æ¬å±å¹é®çï¼ç¼©æ¾å¤çåºåãå¯è§è§å£è¦ä¹è·å¸å±è§å£ç¸åï¼è¦ä¹æ´å°ã
对äºä¸ä¸ªå 嫿¡æ¶ï¼å¯¹è±¡æå¤é¨ svg ç页é¢ï¼ä¸¤è 齿å®ä»¬èªå·±ç window 对象ï¼åªææå¤å±ç window çå¯è§è§å£ä¸åäºå¸å±è§å£ã对äºå å«çææ¡£ï¼å¯è§è§å£ä¸å¸å±è§å£æ¯ç¸åçã
CSS
å¨ä¸é¢æè¿°çå¸å±è§å£åå¯è§è§å£ä¸æ¯ä½ å°éå°çå¯ä¸è§å£ãå¨å¸å±è§å£ä¸å®å ¨æé¨åæ¾ç¤ºçä»»ä½åè§å£é½è¢«è§ä¸ºå¯è§è§å£ã
æä»¬é常认为宽度åé«åº¦çåªä½æ¥è¯¢æ¯ç¸å¯¹äºæµè§å¨çªå£ç宽度åé«åº¦èè¨çãå®ä»¬å®é 䏿¯ç¸å¯¹äºè§å£çï¼å³ä¸»ææ¡£ï¼documentï¼ä¸ççªå£ï¼window 对象ï¼ï¼ä½å®ä¹æ¯åµå¥æµè§ä¸ä¸æï¼å¦å¯¹è±¡ï¼iframe å SVGï¼ä¸å ç´ ç¶çº§çæ¬èº«ç大å°ãå¨ CSS ä¸ï¼æä»¬ä¹æåºäºè§å£å¤§å°çé¿åº¦åä½ã1vh å使¯ 1% å¸å±è§å£çé«åº¦ï¼vw åä½ä¸æ¤ç±»ä¼¼ã
<iframe>
对äºä¸ä¸ª iframe æ¥è¯´ï¼å¯è§è§å£æ¯å
¶å
é¨é«åº¦å宽度ç大å°è䏿¯å
¶ç¶ææ¡£ç大å°ãä½ å¯ä»¥ä¸ºå
¶é«åº¦åå®½åº¦è®¾ç½®ä»»ææ°å¼ï¼ä½è¿å¤§çå¼å¯è½ä¼ä½¿ iframe é¨åå
容è¶
åºè§å£å¯¼è´è¶
åºé¨åä¸å¯è§ã
å¨ CSS ä¸ï¼å¯ä»¥ä½¿ç¨ç¸å¯¹äºè§å£çé¿åº¦åä½ vh å vwã1vh æå³çå¼ä¸ºè§å£é«åº¦ç 1%ï¼åç 1vw å³å¼ä¸ºè§å£å®½åº¦ç 1%ã
éè¦æ³¨æçæ¯ï¼å½ä½ å¨ CSS ä¸ä½¿ç¨ vw å vh 设置 iframe çæ ·å¼æ¶ï¼1vh è¡¨ç¤ºçæ¯ iframe é«åº¦ç 1%ï¼ä½ 1vw 表示ç忝 document 宽度ç 1%ã
iframe {
width: 50vw;
}
å¨ä¸é¢çä¾åä¸ï¼ä¸ä¸ª iframe 宽度被设置为 50vwï¼åè®¾ç¶ææ¡£å®½åº¦ä¸º 1200pxï¼æç
§ä¸é¢çè§åï¼å®çå®é
宽度å°ä¼æ¯ç¶ææ¡£å®½åº¦ç 50%ï¼å³ 600pxãå¨è¿ä¸ªä¾åä¸ï¼æ¯ 1vw å°æç® 6pxã妿å 为缩æ¾ï¼ç¶ææ¡£å®½åº¦å为 800pxï¼å 1vw å°ä»£è¡¨ 4pxï¼iframe ç宽度å°ä¼æ¯ 400pxã
æ¤å¤ï¼ä¸ä¸ªå¨ iframe ææ¡£å
åºäºå®½åº¦çåªä½æ¥è¯¢å°ä¼ä½¿ç¨ iframe çè§å£å®½åº¦è¿è¡åç
§ã
@media screen and (min-width: 500px) {
p {
color: red;
}
}
妿ä¸è¿° CSS 代ç åå
å«äºä¸ä¸ª iframe ææåçä¸ä¸ªææ¡£å¤´é¨ï¼é£ä¹å½ç¨æ·æ¾å¤§è¯¥ææ¡£æ¶ï¼p æ ç¾é¢è²å°å红ï¼å½ç¨æ·ä¸ä½¿ç¨ç¼©æ¾æ¶ï¼è¯¥æ ·å¼åä¸ä¼è¢«åºç¨ã
SVG
å¨ SVG ææ¡£ä¸ï¼è§å£å³ SVG å¾ççå¯è§åºåãåæ ·ï¼ä½ ä¹å¯ä»¥ä¸º SVG 设置任ä½é«åº¦å宽度ï¼ä½ä¸æ°å½ç大å°å¯è½æ æ³æ¾ç¤ºæ´ä¸ª SVG å¾çãå¨ SVG ä¸çå¯è§é¨å被称为è¿ä¸ª SVG çè§å£ãä½ å¯ä»¥ä½¿ç¨ <svg> ä¸ç width å height 屿§æ¥ä¿®æ¹ SVG çè§å£å¤§å°ã
<svg height="300" width="400"></svg>
å¨è¿ä¸ªç¤ºä¾ä¸ï¼è¿ä¸ª SVG çè§å£é¿å®½æ¯è¢«è®¾ç½®ä¸ºäº 3:4ï¼é»è®¤æ åµä¸å®½ä¸º 400 åç´ ï¼é«ä¸º 300 åç´ ã
SVG åç § viewbox 屿§ï¼å ç½®äºä¸ä¸ªä¸è§å£æ å ³çåæ ç³»ã
å¦æä½ å¨ä½ ç HTML ææ¡£ä¸ä½¿ç¨äº SVGï¼è¿ä¸ª SVG çè§å£é»è®¤ä¸ºå
å«å®çåçº§å®¹å¨æè
SVG 容å¨ä¸æè®¾ç½®ç宽度åé«åº¦å¤§å°ãå½ä½ ä½¿ç¨ @media æ¥å¯¹ SVG è¿è¡åªä½æ¥è¯¢æ¶ï¼å
¶åç
§çé«åº¦å宽度åå³äºå
裹ç SVG ç容å¨ï¼è䏿¯æ´ä¸ªæµè§å¨è§å£ã
@media screen and (min-width: 400px) and (max-width: 500px) {
/* css goes here */
}
å¦æä½ å¨å ¶ä»å ç´ ä¸ä½¿ç¨ä¸é¢è¿ä¸ªç¤ºä¾çåªä½æ¥è¯¢ï¼å½è§å£ï¼é常为æµè§å¨çè§å£ï¼æ»¡è¶³æ¡ä»¶ï¼å®½åº¦ä¸º 400px è³ 500px çèå´å æ¶ï¼åªä½æ¥è¯¢å ç CSS æ ·å¼å°ä¼èªå¨åºç¨ãä½å¯¹äº SVG æ¥è¯´ï¼å ¶åªä½æ¥è¯¢åºäºå 裹çå®çå ç´ ã
å¦ä½¿ç¨ <img> ï¼éè¿è®¾ç½® src æå SVG æä»¶æ¶ï¼SVG çå¤é¨å®¹å¨ï¼æè
说å
裹ç SVG çå
ç´ å°±æ¯è¿ä¸ª imgã妿å¨è¿ä¸ªå¤é¨å®¹å¨ä¸åºç¨äº width 屿§ï¼å对åºçè§å£å°±æ¯è¿ä¸ªå±æ§çå¼ï¼è䏿¯æ´ä¸ªææ¡£çè§å£å®½åº¦ã
妿æä¸é¢ç CSS åªä½æ¥è¯¢æ ·å¼æ·»å å° SVG æä»¶ä¸å»ï¼å½ SVG 容å¨çå®½åº¦å¨ 400 - 500 px æ¶ï¼å°åºç¨è¯¥ CSS æ ·å¼ã
JavaScript
VisualViewport æ¥å£æä¾äºæ¥è¯¢åä¿®æ¹å¯è§è§å£çæ¥å£ã
ç§»å¨è®¾å¤çè§å£
对äºåç§ä¸åå½¢ç¶ï¼ä¸å设å¤åç´ æ¯ç§»å¨è®¾å¤ï¼å ¶æµè§å¨çè§å£ï¼çªå£ä¸æ¾ç¤ºç½é¡µä¿¡æ¯çåºåï¼ä¸ä¸å®ä¸æ¸²æé¡µé¢å¤§å°ç¸åãç§»å¨è®¾å¤çè§å£çé»è®¤å¼ä¸º 980pxï¼ä¸è¬æ åµä¸é½è¦æ¯è¿äºè®¾å¤çå±å¹å°ºå¯¸è¦å¤§ã
为äºè®©é¡µé¢è½å¤å ¨é¨å±ç¤ºï¼è¿äºæµè§å¨å¨æ¸²ææ¶ä¼å¯¹é¡µé¢è¿è¡ç¼©æ¾ãæ¯å¦å¨ä¸ä¸ªå®½ 320px çç§»å¨è®¾å¤æ¾ç¤ºä¸ä¸ªå¯è§è§å£å®½ä¸º 980px ç页é¢ï¼ç§»å¨è®¾å¤æµè§å¨ä¼å¯¹è¿ä¸ªé¡µé¢è¿è¡ç¼©æ¾ç´è³å ¶å¯è§è§å£å®½åº¦ä¸º 320pxï¼å ·ä½åå³äºæµè§å¨å®ç°ï¼ãä½ç´æ¥ç¼©æ¾é¡µé¢ä¼å¯¼è´é¡µé¢åä½åå°ï¼ä½¿å¾ç¼©æ¾åç页颿¾ç¤ºææé½ä¸ä¼å¾çæ³ã
妿å¼åè æ³è®©ç§»å¨ç«¯æµè§å¨ä½¿ç¨å±å¹å®½åº¦ä½ä¸ºè§å£æ¿æ¢é»è®¤ç 980px 宽度è§å£ï¼åå¯ä»¥å¨ HTML ç头鍿·»å 以䏿 ç¾ï¼
<meta name="viewport" content="width=device-width" />
è¿é width 屿§æçæ¯è§å£å®½åº¦ï¼ç°å¨è§å£ç宽度被设置为äºè®¾å¤çå±å¹å®½åº¦ï¼å³ææ¡£è§å£å®½åº¦å¤§å°ä¸è®¾å¤å®½åº¦å¤§å° 100% 对åºï¼è½¬æ¢ä¸º CSS åç´ å¼ç¸åï¼ãé¤äº width 屿§å¤ï¼è¿æ initial-scaleãmaximum-scaleãminimum-scaleï¼ä»¥å user-scalable 屿§å¯ä¾è®¾ç½®ãè¿äºå±æ§åå«è®¾ç½®äºææ¡£çåå§ç¼©æ¾æ¯ä¾ãæå¤§ç¼©æ¾æ¯ä¾ãæå°ç¼©æ¾æ¯ä¾ä»¥åæ¯å¦å
è®¸ç¨æ·è¿è¡ç¼©æ¾æä½ãä½è¿äºå±æ§çé»è®¤å¼å·²ç»å¾å¥½äºï¼å¼åæ¶å¯ä»¥å¿½ç¥æè¿äºå±æ§ã
åè§
- CSSOM è§å¾ API
<meta>ï¼ç¹å«æ¯<meta name="viewport">- CSS è§å£æ¨¡å
- CSSOM è§å¾æ¨¡å