<basic-shape>
åºçº¿
广æ³å¯ç¨
*
èª 2020å¹´1æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
<basic-shape> CSS æ°æ®ç±»å表示ä¸ç§ç¨äº clip-pathãshape-outside å offset-path 屿§çå½¢ç¶ã
å°è¯ä¸ä¸
clip-path: inset(22% 12% 15px 35px);
clip-path: circle(6rem at 12rem 8rem);
clip-path: ellipse(115px 55px at 50% 40%);
clip-path: polygon(
50% 2.4%,
34.5% 33.8%,
0% 38.8%,
25% 63.1%,
19.1% 97.6%,
50% 81.3%,
80.9% 97.6%,
75% 63.1%,
100% 38.8%,
65.5% 33.8%
);
clip-path: path("M 50,245 A 160,160 0,0,1 360,120 z");
<section class="default-example" id="default-example">
<div class="transition-all" id="example-element"></div>
</section>
#default-example {
background: #fe9;
}
#example-element {
background: linear-gradient(to bottom right, #f52, #05f);
width: 100%;
height: 100%;
}
è¯æ³
<basic-shape> æ°æ®ç±»åç¨äºåå»ºåºæ¬å½¢ç¶ï¼å
æ¬éè¿å®¹å¨ insetãéè¿åæ è·ç¦»ï¼æéè¿è®¾å®å°ºå¯¸ãåå½¢ãæ¤åå½¢ãå¤è¾¹å½¢ãè·¯å¾ä»¥åä½è
å建çå½¢ç¶ãè¿äºåºæ¬å½¢ç¶æ¯ä½¿ç¨ä¸ä¸ª <basic_shape> CSS 彿°æ¥å®ä¹çï¼æ¯ä¸ªå¼é½éè¦ä¸ä¸ªç¬¦å该形ç¶å½æ°ç¹å®è¯æ³çåæ°ã
å ¬å ±åæ°
ä¸äºåºæ¬å½¢ç¶å½æ°çè¯æ³ä¸å ¬å ±çåæ°å æ¬ï¼
round <'border-radius'>-
为éè¿å®¹å¨ inset å®ä¹çç©å½¢ãéè¿è·ç¦»å®ä¹çç©å½¢ä»¥åå ·æå°ºå¯¸çç©å½¢å®ä¹åè§ï¼ä½¿ç¨ä¸ CSS
border-radius缩å屿§ç¸åçè¯æ³ã <shape-radius>-
å®ä¹åå½¢ææ¤åå½¢çåå¾ãææå¼å æ¬
<length>ã<percentage>ãclosest-sideï¼é»è®¤å¼ï¼åfarthest-sideãè´å¼æ æãclosest-sideå ³é®åå¼ä½¿ç¨ä»å½¢ç¶ä¸å¿å°åèçåæè¿è¾¹çé¿åº¦æ¥å建åå¾é¿åº¦ãfarthest-sideå ³é®åå¼ä½¿ç¨ä»å½¢ç¶ä¸å¿å°åèçåæè¿è¾¹çé¿åº¦ã <position>-
å®ä¹åå½¢ææ¤åå½¢çä¸å¿
<position>ã妿çç¥ï¼åé»è®¤ä¸ºcenterã <fill-rule>-
设置
fill-ruleç¨äºç¡®å®ç±åºæ¬å½¢ç¶å¤è¾¹å½¢ãè·¯å¾åå½¢ç¶å®ä¹çå½¢ç¶å é¨åºå¦ä½å¡«å ãå¯è½çå¼ä¸ºnonzeroï¼é»è®¤å¼ï¼åevenoddã夿³¨ï¼å¨
offset-pathä¸ä¸æ¯æ<fill-rule>ï¼ä½¿ç¨å®ä¼ä½¿å±æ§æ æã
éè¿å®¹å¨ inset å®ä¹ç©å½¢çè¯æ³
inset() 彿°å建ä¸ä¸ªå
åµç©å½¢ï¼å
¶å¤§å°ç±å®¹å¨åè¾¹åå
åç§»çè·ç¦»å®ä¹ï¼å¹¶ä¸å¯ä»¥éæ©æ¯å¦å¸¦æåè§ã
inset( <length-percentage>{1,4} [ round <`border-radius`> ]? )
彿ä¾å
¨é¨åä¸ªåæ°æ¶ï¼å®ä»¬åå«ä»£è¡¨ä»åèçååå
åç§»çé¡¶é¨ãå³ä¾§ãåºé¨å左侧è·ç¦»ï¼è¿äºè·ç¦»å®ä¹äºå
åµç©å½¢çè¾¹ç¼ä½ç½®ãè¿äºåæ°éµå¾ª margin 缩åè¯æ³çè§åï¼å
è®¸ä½ ä½¿ç¨ä¸ä¸ªã两个ãä¸ä¸ªæåä¸ªå¼æ¥è®¾ç½®ææå个 insetã
妿æä¸ªå°ºå¯¸ç两个 inset ä¹åè¶
è¿äºè¯¥å°ºå¯¸ç 100%ï¼åè¿ä¸¤ä¸ªå¼ä¼ææ¯ä¾åå°ï¼ä½¿å®ä»¬çåçäº 100%ãä¾å¦ï¼å¼ inset(90% 10% 60% 10%) ä¸ï¼é¡¶é¨ inset 为 90%ï¼åºé¨ inset 为 60%ãè¿äºå¼ä¼ææ¯ä¾åå°ä¸º inset(60% 10% 40% 10%)ãåè¿æ ·çå½¢ç¶ï¼å¦æä¸å
å´ä»»ä½åºå并䏿²¡æ shape-marginï¼åä¸ä¼å½±åæ¢è¡ã
éè¿è·ç¦»å®ä¹ç©å½¢çè¯æ³
rect() 彿°ä½¿ç¨è·åèçåé¡¶é¨å左侧边ç¼çæå®è·ç¦»æ¥å®ä¹ä¸ä¸ªç©å½¢ï¼åæ¶å¯éæ©æ¯å¦å¸¦æåè§ã
rect( [ <length-percentage> | auto ]{4} [ round <`border-radius`> ]? )
å¨ä½¿ç¨ rect() 彿°æ¶ï¼ä½ æ éå®ä¹ç©å½¢ç宽度åé«åº¦ãç¸åï¼ä½ éè¿æå®åä¸ªå¼æ¥å建ç©å½¢ï¼å
¶å°ºå¯¸ç±åèçåç大å°åè¿å个åç§»å¼å
±åå³å®ãæ¯ä¸ªå¼å¯ä»¥æ¯ <length>ã<percentage> æå
³é®å autoã对äºé¡¶é¨å左侧çå¼ï¼auto å
³é®å被解é为 0%ï¼å¯¹äºåºé¨åå³ä¾§çå¼ï¼auto 被解é为 100%ã
å ·æå°ºå¯¸çç©å½¢è¯æ³
xywh() 彿°å®ä¹äºä¸ä¸ªç©å½¢ï¼è¯¥ç©å½¢ä½äºè·åèçå左边ç¼ï¼xï¼åä¸è¾¹ç¼ï¼yï¼çæå®è·ç¦»å¤ï¼å¹¶æç
§æå®çç©å½¢å®½åº¦ï¼wï¼åé«åº¦ï¼hï¼è¿è¡å°ºå¯¸è®¾ç½®ï¼é¡ºåºä¾æ¤æåï¼åæ¶å¯éæ©æ¯å¦å¸¦æåè§ã
xywh( <length-percentage>{2} <length-percentage [0,â]>{2} [ round <`border-radius`> ]? )
åå½¢è¯æ³
circle() 彿°ä½¿ç¨ä¸ä¸ªåå¾åä¸ä¸ªä½ç½®å®ä¹ä¸ä¸ªåå½¢ã
circle( <shape-radius>? [ at <position> ]? )
åæ° <shape-radius> 代表åçåå¾ï¼å®ä¹ä¸º <length> æ <percentage>ãè¿éçç¾åæ¯å¼æ¯æ ¹æ®åèçåç宽度åé«åº¦è®¡ç®å¾åºçï¼å³ sqrt(width^2+height^2)/sqrt(2)ã妿çç¥ï¼ååå¾ç± closest-side å®ä¹ã
æ¤åå½¢è¯æ³
ellipse() 彿°ä½¿ç¨ä¸¤ä¸ªåå¾åä¸ä¸ªä½ç½®å®ä¹ä¸ä¸ªæ¤åå½¢ã
ellipse( [ <shape-radius>{2} ]? [ at <position> ]? )
<shape-radius> 忰便¬¡ä»£è¡¨æ¤åç x è½´åå¾ rx å y è½´åå¾ ryãè¿äºå¼å¯ä»¥æå®ä¸º <length> æ <percentage>ãæ¤å¤çç¾åæ¯å¼æ¯æ ¹æ®åèçåç使ç¨å®½åº¦ï¼å¯¹äº rx å¼ï¼å使ç¨é«åº¦ï¼å¯¹äº ry å¼ï¼æ¥ç¡®å®çãå¦æåªæä¾äºä¸ä¸ªåå¾å¼ï¼å ellipse() å½¢ç¶å½æ°æ¯æ æçãå¦ææ²¡ææä¾ä»»ä½å¼ï¼åé»è®¤ä½¿ç¨ 50% 50%ã
å¤è¾¹å½¢è¯æ³
polygon() 彿°ä½¿ç¨ SVG ç fill-rule åä¸ç»åæ æ¥å®ä¹ä¸ä¸ªå¤è¾¹å½¢ã
polygon( <`fill-rule`>?, [ <length-percentage> <length-percentage> ]# )
è¯¥å½æ°æ¥åä¸ä¸ªç±éå·åéçåæ å¯¹åè¡¨ï¼æ¯ä¸ªåæ 对ç±ä¸¤ä¸ªç©ºæ ¼åéç <length-percentage> å¼ç»æï¼åå«ä½ä¸º xi å yi 对ãè¿äºå¼è¡¨ç¤ºå¤è¾¹å½¢å¨ä½ç½® iï¼å³ä¸¤æ¡çº¿ç¸äº¤çé¡¶ç¹ï¼å¤ç x è½´å y è½´åæ ã
è·¯å¾è¯æ³
path() 彿°ä½¿ç¨ SVG ç fill-rule å SVG è·¯å¾å®ä¹æ¥å®ä¹ä¸ä¸ªå½¢ç¶ã
path( <`fill-rule`>?, ]? <string> )
å¿
éç <string> æ¯ä¸ä¸ªä½ä¸ºå¼ç¨å符串ç SVG è·¯å¾ãpath() 彿°ä¸æ¯ææç shape-outside 屿§å¼ã
å½¢ç¶è¯æ³
shape() 彿°ä½¿ç¨ä¸ä¸ªåå§èµ·ç¹åä¸ç³»åå½¢ç¶å½ä»¤æ¥å®ä¹ä¸ä¸ªå½¢ç¶ã
shape( <fill-rule>? from <coordinate-pair>, <shape-command># )
from <coordinate-pair> åæ°è¡¨ç¤ºç¬¬ä¸ä¸ªå½¢ç¶å½ä»¤çèµ·ç¹ï¼è <shape-command> åå®ä¹äºä¸ä¸ªæå¤ä¸ªå½¢ç¶å½ä»¤ï¼è¿äºå½ä»¤ç±»ä¼¼äº SVG è·¯å¾å½ä»¤ãshape() 彿°ä¸æ¯ææç shape-outside 屿§å¼ã
æè¿°
å¨åå»ºå½¢ç¶æ¶ï¼åèçåç±ä½¿ç¨ <basic-shape> å¼ç屿§å®ä¹ãå½¢ç¶çåæ ç³»é»è®¤ä»¥å
ç´ çå¤è¾¹è·æ¡çå·¦ä¸è§ä¸ºåç¹ï¼x è½´åå³å»¶ä¼¸ï¼y è½´åä¸å»¶ä¼¸ãææä»¥ç¾åæ¯è¡¨ç¤ºçé¿åº¦é½æ¯æ ¹æ®åèçåç尺寸æ¥ç¡®å®çã
é»è®¤çåèç忝 margin-boxï¼å¦ä¸å¾æç¤ºã该å¾å±ç¤ºäºä¸ä¸ªä½¿ç¨ shape-outside: circle(50%) å建çåå½¢ï¼å¨æµè§å¨å¼åè
å·¥å
·ä¸é«äº®å¯è§ççæ¨¡åçä¸åé¨åãæ¤å¤çå½¢ç¶æ¯ç¸å¯¹äºå¤è¾¹è·æ¡æ¥å®ä¹çã

åºç¡å½¢ç¶ç计ç®å¼
å¨ <basic-shape> 彿°ä¸ç弿ç
§æå®æ¹å¼è®¡ç®ï¼èè以ä¸éå å ç´ ï¼
- 对äºä»»ä½çç¥å¼ï¼å°ä½¿ç¨å ¶é»è®¤å¼ã
circle()æellipse()ä¸ç<position>å¼è®¡ç®ä¸ºä»åèçåå·¦ä¸è§å¼å§çä¸å¯¹åç§»éï¼ç¬¬ä¸ä¸ªåç§»éæ¯æ°´å¹³æ¹åçï¼ç¬¬äºä¸ªåç§»éæ¯åç´æ¹åçãæ¯ä¸ªåç§»éé½è¢«æå®ä¸º<length-percentage>å¼ãinset()ä¸ç<border-radius>å¼è¢«æ©å±ä¸ºä¸ä¸ªå å«å «ä¸ªå¼çåè¡¨ï¼æ¯ä¸ªå¼è¦ä¹æ¯<length>ï¼è¦ä¹æ¯<percentage>ãinset()ãrect()åxywh()彿°è®¡ç®ä¸ºçæçinset()彿°ã
åºæ¬å½¢ç¶çæå¼
å¨ä¸¤ä¸ª <basic-shape> 彿°ä¹é´è¿è¡å¨ç»å¤çæ¶ï¼éµå¾ªä»¥ä¸æå¼è§åãæ¯ä¸ª <basic-shape> 彿°ç忰弿æä¸ä¸ªå表ã为äºå¨ä¸¤ä¸ªå½¢ç¶ä¹é´è¿è¡æå¼ï¼è¿ä¸¤ä¸ªå½¢ç¶å¿
须使ç¨ç¸åçåèçåï¼å¹¶ä¸ä¸¤ä¸ª <basic-shape> å表ä¸çå¼çæ°éåç±»åå¿
é¡»å¹é
ã
å¨ä¸¤ä¸ª <basic-shape> 彿°çå表ä¸ï¼æ¯ä¸ªå¼é½å°½å¯è½çåºäºå
¶è®¡ç®å¼è¿è¡æå¼ï¼è®¡ç®å¼æ¯ <number>ã<length>ã<percentage>ã<angle> æ calc()ã妿å¼ä¸æ¯è¿äºæ°æ®ç±»åä¹ä¸ï¼ä½å¨ä¸¤ä¸ªè¿è¡æå¼çåºæ¬å½¢ç¶å½æ°ä¸ç¸åï¼ä¾å¦ nonzeroï¼åä»ç¶å¯ä»¥è¿è¡æå¼ã
-
两个形ç¶å为
ellipse()ç±»åæcircle()ç±»åï¼å¦æå®ä»¬çå徿å®ä¸º<length>æ<percentage>ï¼è䏿¯closest-sideæfarthest-sideçå ³é®åï¼ï¼å对æ¯ä¸ªç¸åºçå¼åºç¨æå¼ã -
两个形ç¶å为
inset()ç±»åï¼å¯¹æ¯ä¸ªç¸åºçå¼åºç¨æå¼ã -
两个形ç¶å为
polygon()ç±»åï¼å¦æå®ä»¬ä½¿ç¨ç¸åç<fill-rule>å¹¶ä¸å ·æç¸åæ°éçéå·åéçåæ å¯¹ï¼å对æ¯ä¸ªç¸åºçå¼åºç¨æå¼ã -
两个形ç¶å为
path()ç±»åï¼å¦æä¸¤ä¸ªå½¢ç¶ä¸çè·¯å¾å符串å¹é è·¯å¾æ°æ®å½ä»¤çæ°éãç±»åå顺åºï¼åå°æ¯ä¸ªåæ°ä½ä¸º<number>åºç¨æå¼ã -
两个形ç¶å为
shape()ç±»åï¼å¦æå®ä»¬å ·æç¸åçå½ä»¤å ³é®åå¹¶ä¸ä½¿ç¨ç¸åç<by-to>å ³é®åï¼å对æ¯ä¸ªç¸åºçå¼åºç¨æå¼ã妿shape()ç¨äºclip-path屿§ï¼åå½å®ä»¬è¿å ·æç¸åç<fill-rule>æ¶ï¼å¯¹è¿ä¸¤ä¸ªå½¢ç¶è¿è¡æå¼ã- 妿å®ä»¬ä½¿ç¨
<curve-command>æ<smooth-command>ï¼åæ§å¶ç¹çæ°éå¿ é¡»å¹é æè½è¿è¡æå¼ã - 妿å®ä»¬ä½¿ç¨ä¸å
<arc-sweep>æ¹åç<arc-command>ï¼åæå¼ç»ææé¡ºæ¶éæ¹åï¼cwï¼è¿è¡ã妿å®ä»¬ä½¿ç¨ä¸åç<arc-size>å ³é®åï¼å使ç¨largeå¼å¯¹å¤§å°è¿è¡æå¼ã
- 妿å®ä»¬ä½¿ç¨
-
ä¸ä¸ªå½¢ç¶ä¸º
path()ç±»åï¼å¦ä¸ä¸ªä¸ºshape()ç±»åï¼å¦æè·¯å¾æ°æ®å½ä»¤çåè¡¨å¨æ°éå顺åºä¸ç¸åï¼å对æ¯ä¸ªç¸åºçå¼åºç¨æå¼ãæå¼åçå½¢ç¶æ¯ä¸ä¸ªshape()彿°ï¼ä¿æç¸åçè·¯å¾æ°æ®å½ä»¤å表ã
å¨å ¶ä»æææ åµä¸ï¼ä¸è¿è¡æå¼ï¼å¨ç»æ¯ç¦»æ£çã
示ä¾
>å¨ç»å¤è¾¹å½¢
å¨è¿ä¸ªç¤ºä¾ä¸ï¼æä»¬ä½¿ç¨äº @keyframes at è§å为两个å¤è¾¹å½¢ä¹é´çè£åªè·¯å¾å建å¨ç»ææã请注æï¼è¿ä¸¤ä¸ªå¤è¾¹å½¢å¿ é¡»å ·æç¸åæ°éçé¡¶ç¹ï¼è¿æ¯æ¤ç±»å¨ç»è½å¤æ£å¸¸å·¥ä½çå¿ è¦æ¡ä»¶ã
HTML
<div></div>
CSS
div {
width: 300px;
height: 300px;
background: repeating-linear-gradient(red, orange 50px);
clip-path: polygon(
50% 0%,
60% 40%,
100% 50%,
60% 60%,
50% 100%,
40% 60%,
0% 50%,
40% 40%
);
animation: 4s poly infinite alternate ease-in-out;
margin: 10px auto;
}
@keyframes poly {
from {
clip-path: polygon(
50% 0%,
60% 40%,
100% 50%,
60% 60%,
50% 100%,
40% 60%,
0% 50%,
40% 40%
);
}
to {
clip-path: polygon(
50% 30%,
100% 0%,
70% 50%,
100% 100%,
50% 70%,
0% 100%,
30% 50%,
0% 0%
);
}
}
ç»æ
è§è
| è§è |
|---|
| CSS Shapes Module Level 1> # basic-shape-functions> |
æµè§å¨å ¼å®¹æ§
åè§
- ä½¿ç¨æ¤æ°æ®ç±»åç屿§ï¼
clip-pathãoffset-pathãshape-outsideã - CSS å½¢ç¶æ¨¡å
- CSS å½¢ç¶æ¦è§
- CSS é®ç½©ä»ç»
- CSS é®ç½©æ¨¡å
- å¨ CSS ä¸ç¼è¾å½¢ç¶è·¯å¾ââFirefox å¼åè å·¥å ·