1+ /* 版面 */
2+ * { box-sizing : border-box; }
3+ html , body { height : 100% ; }
4+ body {
5+ margin : 0 ;
6+ background : # 0f0f10 ;
7+ display : grid;
8+ place-items : center;
9+ font-family : system-ui, -apple-system, "Segoe UI" , Roboto, "Noto Sans" , sans-serif;
10+ }
11+
12+ .stage {
13+ position : relative;
14+ width : 520px ;
15+ height : 520px ;
16+ isolation : isolate;
17+ }
18+
19+ /* 藍色中空圓(更粗、縮放更明顯) */
20+ .ring {
21+ position : absolute;
22+ inset : 50% auto auto 50% ;
23+ width : 300px ;
24+ height : 300px ;
25+ border : 18px solid # 1e90ff ;
26+ border-radius : 50% ;
27+ transform : translate (-50% , -50% ) scale (1 );
28+ animation : ringPulse 3.2s ease-in-out infinite;
29+ filter : drop-shadow (0 0 10px rgba (30 , 144 , 255 , .35 ));
30+ }
31+
32+ /* 籃球容器:負責路徑位移(會進出藍圈) */
33+ .basketball {
34+ position : absolute;
35+ left : 50% ;
36+ top : 50% ;
37+ width : 120px ; /* 放大球體 */
38+ height : 120px ;
39+ transform : translate (-50% , -50% );
40+ animation : moveBall 8s linear infinite;
41+ will-change : transform;
42+ }
43+
44+ /* 籃球皮層:外觀+旋轉 */
45+ .skin {
46+ position : absolute;
47+ inset : 0 ;
48+ border-radius : 50% ;
49+ /* 橘色皮革+立體高光陰影 */
50+ background :
51+ radial-gradient (circle at 35% 30% , # ffbe6a 0% , # ff9a35 35% , # ff7f11 70% , # e06300 100% );
52+ box-shadow :
53+ inset 0 0 0 4px # 0e0e0e, /* 外框黑線(真實感) */
54+ inset 20px -20px 40px rgba (0 , 0 , 0 , .35 ), /* 暗部陰影 */
55+ inset -10px 10px 15px rgba (255 , 255 , 255 , .15 ); /* 高光過渡 */
56+ overflow : visible;
57+ transform : rotate (0deg );
58+ transform-origin : 50% 50% ;
59+ animation : spin 1.6s linear infinite; /* 籃球自轉 */
60+ }
61+
62+ /* 真實球紋(SVG) */
63+ .lacing {
64+ position : absolute;
65+ inset : 0 ;
66+ border-radius : 50% ;
67+ pointer-events : none;
68+ }
69+
70+ /* 球在「完全進入藍圈中央」時的黃色描邊(與 moveBall 時序同步) */
71+ .basketball ::after {
72+ content : "" ;
73+ position : absolute;
74+ inset : -7px ;
75+ border-radius : 50% ;
76+ border : 7px solid rgba (255 , 215 , 0 , 0.95 ); /* 金黃 */
77+ box-shadow : 0 0 18px rgba (255 , 215 , 0 , 0.7 ), 0 0 32px rgba (255 , 215 , 0 , 0.35 );
78+ opacity : 0 ;
79+ animation : highlight 8s linear infinite;
80+ }
81+
82+ /* ---- 動畫定義 ---- */
83+
84+ /* 藍圈縮放:更大幅度 */
85+ @keyframes ringPulse {
86+ 0% , 100% { transform : translate (-50% , -50% ) scale (1.05 ); }
87+ 50% { transform : translate (-50% , -50% ) scale (1.7 ); }
88+ }
89+
90+ /* 籃球自轉(持續) */
91+ @keyframes spin {
92+ to { transform : rotate (360deg ); }
93+ }
94+
95+ /* 籃球路徑(會進出藍圈;在 12.5%、37.5%、62.5%、87.5% 時回到中心) */
96+ @keyframes moveBall {
97+ /* 以舞台中心為原點,先到上方外圈,再依序右、下、左,期間多次「回中心」 */
98+ 0% { transform : translate (-50% , -50% ) translate (0 , -190px ); } /* 外:上 */
99+ 12 .5% { transform : translate (-50% , -50% ) translate (0 , 0 ); } /* 中:進圈 */
100+ 25% { transform : translate (-50% , -50% ) translate (190px , 0 ); } /* 外:右 */
101+ 37 .5% { transform : translate (-50% , -50% ) translate (0 , 0 ); } /* 中:進圈 */
102+ 50% { transform : translate (-50% , -50% ) translate (0 , 190px ); } /* 外:下 */
103+ 62 .5% { transform : translate (-50% , -50% ) translate (0 , 0 ); } /* 中:進圈 */
104+ 75% { transform : translate (-50% , -50% ) translate (-190px , 0 ); } /* 外:左 */
105+ 87 .5% { transform : translate (-50% , -50% ) translate (0 , 0 ); } /* 中:進圈 */
106+ 100% { transform : translate (-50% , -50% ) translate (0 , -190px ); } /* 回到外:上 */
107+ }
108+
109+ /* 與 moveBall 關鍵影格對齊:回中心時亮起黃色描邊 */
110+ @keyframes highlight {
111+ 0% , 20% , 45% , 70% , 95% , 100% { opacity : 0 ; }
112+ 12 .5%, 37.5%, 62.5%, 87.5% { opacity : 1 ; }
113+ }
0 commit comments