matrix3d()
åºçº¿
广æ³å¯ç¨
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
matrix3d() CSS 彿°ä»¥ 4x4 齿¬¡ç©éµçå½¢å¼å®ä¹ä¸ä¸ª 3D 忢ãå
¶ç»ææ¯ä¸ä¸ª <transform-function> æ°æ®ç±»åã
å°è¯ä¸ä¸
transform: matrix3d(
-0.6,
1.34788,
0,
0,
-2.34788,
-0.6,
0,
0,
0,
0,
1,
0,
0,
0,
10,
1
);
transform: matrix3d(
0.5,
0,
-0.866025,
0,
0.595877,
1.2,
-1.03209,
0,
0.866025,
0,
0.5,
0,
25.9808,
0,
15,
1
);
<section id="default-example">
<img
class="transition-all"
id="example-element"
src="/shared-assets/images/examples/firefox-logo.svg"
width="200" />
</section>
è¯æ³
matrix3d() 彿°ç± 16 ä¸ªå¼æå®ï¼è¿äºå¼ä»¥åä¼å
顺åºè¿è¡æè¿°ã
css
matrix3d(a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, c3, d3, a4, b4, c4, d4)
å¼
- a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3
-
æè¿°çº¿æ§åæ¢ç
<number>å¼ã - a4 b4 c4 d4
-
æè¿°è¦åºç¨ç平移ç
<number>å¼ã
| â^2 ä¸çç¬å¡å°åæ | ââ^2 ä¸ç齿¬¡åæ | â^3 ä¸çç¬å¡å°åæ | ââ^3 ä¸ç齿¬¡åæ |
|---|---|---|---|
| æ¤åæ¢éç¨äº 3D 空é´ï¼æ æ³å¨å¹³é¢ä¸è¡¨ç¤ºã | éç¨ç 3D 仿å°åæ¢æ æ³ä½¿ç¨ç¬å¡å°åæ ç©éµè¡¨ç¤ºï¼å ä¸ºå¹³ç§»ä¸æ¯çº¿æ§åæ¢ã |
|
|
å½¢å¼è¯æ³
<matrix3d()> =
matrix3d( <number>#{16} )
示ä¾
>ç«æ¹ä½å缩示ä¾
以ä¸ç¤ºä¾å±ç¤ºäºä¸ä¸ªç± DOM å
ç´ å忢å建ç 3D ç«æ¹ä½ï¼å¯ä»¥éè¿æ¬åæèç¦æ¥åºç¨ matrix3d() 忢ã
HTML
html
<section id="example-element" tabindex="0">
<div class="face front">1</div>
<div class="face back">2</div>
<div class="face right">3</div>
<div class="face left">4</div>
<div class="face top">5</div>
<div class="face bottom">6</div>
</section>
CSS
css
#example-element {
width: 100px;
height: 100px;
transform-style: preserve-3d;
transition: transform 1.5s;
transform: rotate3d(1, 1, 1, 30deg);
margin: 50px auto;
}
#example-element:hover,
#example-element:focus {
transform: rotate3d(1, 1, 1, 30deg)
matrix3d(1, 0, 0, 0, 0, 1, 6, 0, 0, 0, 1, 0, 50, 100, 0, 1.1);
}
.face {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
position: absolute;
backface-visibility: inherit;
font-size: 60px;
color: #fff;
}
.front {
background: rgb(90 90 90 / 70%);
transform: translateZ(50px);
}
.back {
background: rgb(0 210 0 / 70%);
transform: rotateY(180deg) translateZ(50px);
}
.right {
background: rgb(210 0 0 / 70%);
transform: rotateY(90deg) translateZ(50px);
}
.left {
background: rgb(0 0 210 / 70%);
transform: rotateY(-90deg) translateZ(50px);
}
.top {
background: rgb(210 210 0 / 70%);
transform: rotateX(90deg) translateZ(50px);
}
.bottom {
background: rgb(210 0 210 / 70%);
transform: rotateX(-90deg) translateZ(50px);
}
ç»æ
ç©éµå¹³ç§»å缩æ¾ç¤ºä¾
å¦ä¸ä¸ª transform3d() 示ä¾ï¼æ¼ç¤ºäºç»å平移å缩æ¾çå¨ç»ææã
HTML
html
<div class="foo">
飿¶åä»è®¤ä¸ºå¿
éä¸éè¦çæ¯æ¥è§¦å¤§èªç¶ï¼æ¥è§¦æ¾ç»çæ´»è¿ãææ³è¿ãæ¥è§¦è¿çå人ï¼å¦æ¥è§¦å²å¦ãè¯æï¼ï¼ç°å¨è®¤ä¸ºå¿
éãä¸éè¦çæ¯äººä¸ºçè§ç« å¶åº¦ï¼ä¸è·åäºä»¬äº¤å¾ãââå夫·æå°æ¯æ³°ã夿´»ã
</div>
CSS
css
html {
width: 100%;
}
body {
height: 100vh;
/* å
容å±
ä¸ */
display: flex;
flex-flow: row wrap;
justify-content: center;
align-content: center;
}
.foo {
width: 50%;
padding: 1em;
color: white;
background: #ff8c66;
border: 2px dashed black;
text-align: center;
font-family: system-ui, sans-serif;
font-size: 14px;
/* 设置å¨ç»ä»¥ä¾¿æ´å¥½å°æ¼ç¤º */
animation: MotionScale 2s alternate linear infinite;
}
@keyframes MotionScale {
from {
/*
è¿é使ç¨äºåä½ç©éµä½ä¸ºåºç¡ã
ä¸åç©éµæè¿°äºä»¥ä¸åæ¢ï¼
å°æ¯ä¸ª X åæ å¹³ç§» -50px
å°æ¯ä¸ª Y åæ å¹³ç§» -100px
å°æ¯ä¸ª Z åæ å¹³ç§» 0
å°æ¯ä¸ªåæ ç¼©å° 10%
*/
transform: matrix3d(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
-50, -100, 0, 1.1
);
}
50% {
transform: matrix3d(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0.9
);
}
to {
transform: matrix3d(
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
50, 100, 0, 1.1
)
}
}
ç»æ
è§è
| è§è |
|---|
| CSS Transforms Module Level 2 > # funcdef-matrix3d > |
æµè§å¨å ¼å®¹æ§
åè§
transform- åç¬ç忢屿§ï¼
<transform-function>