1308
1308
font-size : 0.9rem ;
1309
1309
font-weight : 500 ;
1310
1310
backdrop-filter : blur (10px );
1311
+ position : relative;
1312
+ overflow : hidden;
1313
+ }
1314
+
1315
+ /* 添加点击波纹效果 */
1316
+ .language-trigger ::before {
1317
+ content : "" ;
1318
+ position : absolute;
1319
+ top : 50% ;
1320
+ left : 50% ;
1321
+ width : 0 ;
1322
+ height : 0 ;
1323
+ background : rgba (59 , 130 , 246 , 0.3 );
1324
+ border-radius : 50% ;
1325
+ transform : translate (-50% , -50% );
1326
+ transition : width 0.6s , height 0.6s ;
1327
+ z-index : 0 ;
1328
+ }
1329
+
1330
+ .language-trigger .clicked ::before {
1331
+ width : 200px ;
1332
+ height : 200px ;
1311
1333
}
1312
1334
1313
1335
.language-trigger : hover {
1314
1336
background : rgba (255 , 255 , 255 , 0.1 );
1315
1337
border-color : rgba (59 , 130 , 246 , 0.3 );
1316
1338
color : var (--text-primary );
1339
+ transform : translateY (-1px );
1340
+ box-shadow : 0 4px 12px rgba (59 , 130 , 246 , 0.2 );
1317
1341
}
1318
1342
1319
1343
.language-trigger ::after {
1320
1344
content : "▼" ;
1321
1345
font-size : 0.8rem ;
1322
1346
transition : transform 0.3s ease;
1347
+ z-index : 1 ;
1348
+ position : relative;
1323
1349
}
1324
1350
1325
1351
.language-switcher .show .language-trigger ::after {
1340
1366
backdrop-filter : blur (20px );
1341
1367
opacity : 0 ;
1342
1368
visibility : hidden;
1343
- transform : translateY (-10px );
1369
+ transform : translateY (-10px ) scale ( 0.95 ) ;
1344
1370
transition : all 0.3s cubic-bezier (0.4 , 0 , 0.2 , 1 );
1345
1371
z-index : 1000 ;
1346
1372
}
1347
1373
1348
1374
.language-switcher .show .language-dropdown {
1349
1375
opacity : 1 ;
1350
1376
visibility : visible;
1351
- transform : translateY (0 );
1377
+ transform : translateY (0 ) scale ( 1 ) ;
1352
1378
}
1353
1379
1354
1380
.lang-btn {
1366
1392
font-size : 0.9rem ;
1367
1393
font-weight : 500 ;
1368
1394
text-align : left;
1395
+ position : relative;
1396
+ overflow : hidden;
1397
+ }
1398
+
1399
+ /* 语言按钮图标 */
1400
+ .lang-btn ::before {
1401
+ content : "" ;
1402
+ width : 20px ;
1403
+ height : 15px ;
1404
+ background-size : cover;
1405
+ background-position : center;
1406
+ border-radius : 2px ;
1407
+ flex-shrink : 0 ;
1408
+ }
1409
+
1410
+ .lang-btn [data-lang = "zh" ]::before {
1411
+ content : "🇨🇳" ;
1412
+ font-size : 16px ;
1413
+ width : auto;
1414
+ height : auto;
1415
+ }
1416
+
1417
+ .lang-btn [data-lang = "en" ]::before {
1418
+ content : "🇺🇸" ;
1419
+ font-size : 16px ;
1420
+ width : auto;
1421
+ height : auto;
1422
+ }
1423
+
1424
+ .lang-btn [data-lang = "ja" ]::before {
1425
+ content : "🇯🇵" ;
1426
+ font-size : 16px ;
1427
+ width : auto;
1428
+ height : auto;
1369
1429
}
1370
1430
1371
1431
.lang-btn : hover {
1372
1432
background : rgba (255 , 255 , 255 , 0.1 );
1373
1433
color : var (--text-primary );
1434
+ transform : translateX (4px );
1374
1435
}
1375
1436
1376
1437
.lang-btn .active {
1377
1438
background : rgba (59 , 130 , 246 , 0.2 );
1378
1439
color : # 60a5fa ;
1379
1440
font-weight : 600 ;
1441
+ transform : translateX (4px );
1380
1442
}
1381
1443
1382
- /* 隐藏非当前语言的内容 */
1444
+ /* 内容切换动画 */
1383
1445
.lang-content {
1384
1446
display : none;
1447
+ opacity : 0 ;
1448
+ transition : opacity 0.3s ease-in-out;
1385
1449
}
1386
1450
1387
1451
.lang-content .active {
1388
1452
display : block;
1453
+ animation : fadeInContent 0.5s ease-out forwards;
1389
1454
}
1390
1455
1391
1456
.lang-content .active .inline {
1399
1464
.lang-content .active .grid {
1400
1465
display : grid;
1401
1466
}
1467
+
1468
+ @keyframes fadeInContent {
1469
+ from {
1470
+ opacity : 0 ;
1471
+ transform : translateY (10px );
1472
+ }
1473
+ to {
1474
+ opacity : 1 ;
1475
+ transform : translateY (0 );
1476
+ }
1477
+ }
1478
+
1479
+ /* 语言切换成功提示 */
1480
+ .language-toast {
1481
+ position : fixed;
1482
+ top : 100px ;
1483
+ right : 20px ;
1484
+ background : rgba (59 , 130 , 246 , 0.9 );
1485
+ color : white;
1486
+ padding : 12px 20px ;
1487
+ border-radius : 8px ;
1488
+ font-size : 0.9rem ;
1489
+ font-weight : 500 ;
1490
+ box-shadow : 0 4px 20px rgba (0 , 0 , 0 , 0.3 );
1491
+ backdrop-filter : blur (10px );
1492
+ transform : translateX (100% );
1493
+ transition : transform 0.3s ease;
1494
+ z-index : 10000 ;
1495
+ }
1496
+
1497
+ .language-toast .show {
1498
+ transform : translateX (0 );
1499
+ }
1500
+
1501
+ /* 页面切换时的整体动画 */
1502
+ .page-transition {
1503
+ transition : all 0.3s ease;
1504
+ }
1505
+
1506
+ .page-transition .switching {
1507
+ opacity : 0.7 ;
1508
+ transform : scale (0.98 );
1509
+ }
1402
1510
</ style >
1403
1511
</ head >
1404
1512
@@ -2301,10 +2409,17 @@ <h3 class="contact-subtitle">
2301
2409
< script >
2302
2410
// 语言切换功能
2303
2411
let currentLang = "zh" ;
2412
+ let isTransitioning = false ;
2304
2413
2305
2414
// 切换语言切换器显示/隐藏
2306
2415
function toggleLanguageSwitcher ( ) {
2307
2416
const switcher = document . getElementById ( "languageSwitcher" ) ;
2417
+ const trigger = switcher . querySelector ( ".language-trigger" ) ;
2418
+
2419
+ // 添加点击效果
2420
+ trigger . classList . add ( "clicked" ) ;
2421
+ setTimeout ( ( ) => trigger . classList . remove ( "clicked" ) , 600 ) ;
2422
+
2308
2423
switcher . classList . toggle ( "show" ) ;
2309
2424
}
2310
2425
@@ -2313,58 +2428,104 @@ <h3 class="contact-subtitle">
2313
2428
document . getElementById ( "languageSwitcher" ) . classList . remove ( "show" ) ;
2314
2429
}
2315
2430
2431
+ // 显示切换成功提示
2432
+ function showLanguageToast ( langName ) {
2433
+ // 移除已存在的提示
2434
+ const existingToast = document . querySelector ( ".language-toast" ) ;
2435
+ if ( existingToast ) {
2436
+ existingToast . remove ( ) ;
2437
+ }
2438
+
2439
+ // 创建新提示
2440
+ const toast = document . createElement ( "div" ) ;
2441
+ toast . className = "language-toast" ;
2442
+ toast . textContent = `已切换到 ${ langName } ` ;
2443
+ document . body . appendChild ( toast ) ;
2444
+
2445
+ // 显示动画
2446
+ setTimeout ( ( ) => toast . classList . add ( "show" ) , 100 ) ;
2447
+
2448
+ // 3秒后自动隐藏
2449
+ setTimeout ( ( ) => {
2450
+ toast . classList . remove ( "show" ) ;
2451
+ setTimeout ( ( ) => toast . remove ( ) , 300 ) ;
2452
+ } , 3000 ) ;
2453
+ }
2454
+
2316
2455
// 修改现有的switchLanguage函数
2317
2456
function switchLanguage ( lang ) {
2457
+ if ( isTransitioning || currentLang === lang ) return ;
2458
+
2459
+ isTransitioning = true ;
2318
2460
currentLang = lang ;
2319
2461
2462
+ // 添加页面切换动画
2463
+ document . body . classList . add ( "page-transition" , "switching" ) ;
2464
+
2320
2465
// 更新触发按钮文本
2321
2466
const triggerBtn = document . querySelector ( ".language-trigger" ) ;
2322
2467
const langNames = {
2323
2468
zh : "中文" ,
2324
2469
en : "English" ,
2325
2470
ja : "日本語" ,
2326
2471
} ;
2327
- triggerBtn . textContent = langNames [ lang ] ;
2328
2472
2329
- // 更新下拉选项的激活状态
2330
- document . querySelectorAll ( ".lang-btn" ) . forEach ( ( btn ) => {
2331
- btn . classList . remove ( "active" ) ;
2332
- if ( btn . dataset . lang === lang ) {
2333
- btn . classList . add ( "active" ) ;
2334
- }
2335
- } ) ;
2473
+ setTimeout ( ( ) => {
2474
+ triggerBtn . textContent = langNames [ lang ] ;
2475
+
2476
+ // 更新下拉选项的激活状态
2477
+ document . querySelectorAll ( ".lang-btn" ) . forEach ( ( btn ) => {
2478
+ btn . classList . remove ( "active" ) ;
2479
+ if ( btn . dataset . lang === lang ) {
2480
+ btn . classList . add ( "active" ) ;
2481
+ }
2482
+ } ) ;
2336
2483
2337
- // 隐藏下拉菜单
2338
- hideLanguageSwitcher ( ) ;
2484
+ // 隐藏下拉菜单
2485
+ hideLanguageSwitcher ( ) ;
2339
2486
2340
- // 更新HTML lang属性
2341
- document . documentElement . lang =
2342
- lang === "zh" ? "zh-CN" : lang === "en" ? "en-US" : "ja-JP" ;
2487
+ // 更新HTML lang属性
2488
+ document . documentElement . lang =
2489
+ lang === "zh" ? "zh-CN" : lang === "en" ? "en-US" : "ja-JP" ;
2343
2490
2344
- // 更新页面标题
2345
- const titles = {
2346
- zh : "RushDB - 无限进步" ,
2347
- en : "RushDB - Unlimited Progress" ,
2348
- ja : "RushDB - 無限の進歩" ,
2349
- } ;
2350
- document . title = titles [ lang ] ;
2491
+ // 更新页面标题
2492
+ const titles = {
2493
+ zh : "RushDB - 无限进步" ,
2494
+ en : "RushDB - Unlimited Progress" ,
2495
+ ja : "RushDB - 無限の進歩" ,
2496
+ } ;
2497
+ document . title = titles [ lang ] ;
2351
2498
2352
- // 隐藏所有语言内容
2353
- document . querySelectorAll ( ".lang-content" ) . forEach ( ( el ) => {
2354
- el . classList . remove ( "active" ) ;
2355
- } ) ;
2499
+ // 隐藏所有语言内容
2500
+ document . querySelectorAll ( ".lang-content" ) . forEach ( ( el ) => {
2501
+ el . classList . remove ( "active" ) ;
2502
+ } ) ;
2356
2503
2357
- // 显示当前语言内容
2358
- document . querySelectorAll ( `.lang-${ lang } ` ) . forEach ( ( el ) => {
2359
- el . classList . add ( "active" ) ;
2360
- } ) ;
2504
+ // 显示当前语言内容
2505
+ document . querySelectorAll ( `.lang-${ lang } ` ) . forEach ( ( el ) => {
2506
+ el . classList . add ( "active" ) ;
2507
+ } ) ;
2508
+
2509
+ // 保存语言选择到localStorage
2510
+ localStorage . setItem ( "rushdb-language" , lang ) ;
2361
2511
2362
- // 保存语言选择到localStorage
2363
- localStorage . setItem ( "rushdb-language" , lang ) ;
2512
+ // 显示切换成功提示
2513
+ showLanguageToast ( langNames [ lang ] ) ;
2514
+
2515
+ // 移除切换动画
2516
+ document . body . classList . remove ( "switching" ) ;
2517
+ setTimeout ( ( ) => {
2518
+ document . body . classList . remove ( "page-transition" ) ;
2519
+ isTransitioning = false ;
2520
+ } , 300 ) ;
2521
+ } , 150 ) ;
2364
2522
}
2365
2523
2366
2524
// 初始化语言
2367
2525
document . addEventListener ( "DOMContentLoaded" , function ( ) {
2526
+ // 添加页面切换类
2527
+ document . body . classList . add ( "page-transition" ) ;
2528
+
2368
2529
const savedLang = localStorage . getItem ( "rushdb-language" ) || "zh" ;
2369
2530
switchLanguage ( savedLang ) ;
2370
2531
0 commit comments