Skip to content

Commit b88fe11

Browse files
yyyCodeclaude
andcommitted
feat(frontend): 首页新增"项目推荐"整屏模块(文章区下方)
- 文章区之后插入第 3 屏:首个项目做横跨整行的精选大卡,其余三列排开 - 样式个性化:顶部渐变点缀背景、封面压暗+序号角标、四色轮转技术栈标签、 胶囊形项目链接,与纯白卡片模块区分 - 数据取前 4 个已发布项目,点卡片进项目详情,头部"查看全部"跳 /projects Co-Authored-By: Claude Code <noreply@anthropic.com>
1 parent 73c997e commit b88fe11

2 files changed

Lines changed: 361 additions & 5 deletions

File tree

‎vue/src/assets/blog.css‎

Lines changed: 280 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ body {
400400
grid-template-columns: 1fr;
401401
}
402402

403-
/* ===== 首页:两屏全屏滚动(口号区 + 文章区) ===== */
403+
/* ===== 首页:多屏全屏滚动(口号区 + 文章区 + 项目推荐…) ===== */
404404
/* 进入首页时 HomeView 给 <html> 加此 class,开启滚动吸附;离开移除 */
405405
html.homepage-scroll-snap {
406406
scroll-snap-type: y proximity;
@@ -492,7 +492,284 @@ html.homepage-scroll-snap {
492492
}
493493
}
494494

495-
/* ===== 第 3 屏:网站时间线(横向交替,随全屏滚动吸附) ===== */
495+
/* ===== 第 3 屏:项目推荐(整屏,bento 网格 + 渐变点缀,区别于纯白卡片模块) ===== */
496+
.home-screen-projects {
497+
background:
498+
radial-gradient(1100px 460px at 50% -140px, rgba(51, 112, 255, 0.10), transparent 62%),
499+
var(--bg);
500+
display: flex;
501+
align-items: center;
502+
padding: 48px 24px;
503+
}
504+
505+
.home-projects {
506+
width: 100%;
507+
max-width: 1080px;
508+
margin: 0 auto;
509+
}
510+
511+
.home-projects-head {
512+
text-align: center;
513+
margin-bottom: 30px;
514+
}
515+
516+
.home-projects-badge {
517+
display: inline-flex;
518+
align-items: center;
519+
gap: 6px;
520+
padding: 4px 12px;
521+
border-radius: 999px;
522+
font-size: 12px;
523+
font-weight: 650;
524+
letter-spacing: 0.08em;
525+
color: var(--accent);
526+
background: rgba(51, 112, 255, 0.10);
527+
border: 1px solid rgba(51, 112, 255, 0.25);
528+
}
529+
[data-theme='dark'] .home-projects-badge {
530+
color: #7da2ff;
531+
background: rgba(74, 127, 255, 0.14);
532+
border-color: rgba(74, 127, 255, 0.35);
533+
}
534+
535+
.home-projects-title {
536+
margin: 12px 0 0;
537+
font-size: clamp(24px, 3.5vw, 34px);
538+
font-weight: 700;
539+
letter-spacing: 0.06em;
540+
color: var(--text);
541+
}
542+
543+
.home-projects-sub {
544+
margin: 10px 0 0;
545+
font-size: 15px;
546+
line-height: 1.7;
547+
color: var(--muted);
548+
}
549+
550+
/* bento 网格:首个项目横跨整行(大卡),其余三列排开 */
551+
.home-projects-grid {
552+
display: grid;
553+
grid-template-columns: repeat(3, 1fr);
554+
gap: 18px;
555+
}
556+
557+
.home-project-card {
558+
border-radius: 16px;
559+
background: var(--surface);
560+
border: 1px solid var(--border);
561+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
562+
cursor: pointer;
563+
overflow: hidden;
564+
display: flex;
565+
flex-direction: column;
566+
transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;
567+
}
568+
.home-project-card:hover {
569+
transform: translateY(-3px);
570+
border-color: rgba(51, 112, 255, 0.45);
571+
box-shadow: 0 12px 28px rgba(51, 112, 255, 0.14);
572+
}
573+
574+
.home-project-card--featured {
575+
grid-column: 1 / -1;
576+
flex-direction: row;
577+
}
578+
.home-project-card--featured .home-project-cover {
579+
width: 42%;
580+
flex: 0 0 42%;
581+
aspect-ratio: auto;
582+
align-self: stretch;
583+
}
584+
585+
.home-project-cover {
586+
position: relative;
587+
aspect-ratio: 16 / 9;
588+
overflow: hidden;
589+
background: var(--surface-soft);
590+
}
591+
.home-project-cover img {
592+
width: 100%;
593+
height: 100%;
594+
object-fit: cover;
595+
display: block;
596+
}
597+
/* 封面底部渐变压暗,让角标与"精选"标签更清晰 */
598+
.home-project-cover::after {
599+
content: '';
600+
position: absolute;
601+
inset: 0;
602+
background: linear-gradient(180deg, transparent 52%, rgba(15, 20, 30, 0.55));
603+
}
604+
.home-project-index {
605+
position: absolute;
606+
top: 10px;
607+
left: 10px;
608+
z-index: 1;
609+
min-width: 30px;
610+
padding: 3px 8px;
611+
border-radius: 8px;
612+
text-align: center;
613+
font-size: 13px;
614+
font-weight: 700;
615+
letter-spacing: 0.05em;
616+
color: #fff;
617+
background: rgba(15, 20, 30, 0.55);
618+
backdrop-filter: blur(4px);
619+
}
620+
.home-project-pick {
621+
position: absolute;
622+
top: 10px;
623+
right: 10px;
624+
z-index: 1;
625+
padding: 3px 10px;
626+
border-radius: 8px;
627+
font-size: 12px;
628+
font-weight: 700;
629+
letter-spacing: 0.06em;
630+
color: #fff;
631+
background: linear-gradient(135deg, #3370ff, #7a5cff);
632+
box-shadow: 0 2px 8px rgba(51, 112, 255, 0.4);
633+
}
634+
635+
.home-project-body {
636+
display: flex;
637+
flex-direction: column;
638+
flex: 1;
639+
gap: 8px;
640+
padding: 16px 18px 18px;
641+
}
642+
.home-project-card--featured .home-project-body {
643+
padding: 22px 26px;
644+
justify-content: center;
645+
}
646+
647+
.home-project-title {
648+
font-size: 18px;
649+
font-weight: 700;
650+
letter-spacing: -0.01em;
651+
color: var(--text);
652+
}
653+
.home-project-card--featured .home-project-title {
654+
font-size: 26px;
655+
}
656+
657+
.home-project-summary {
658+
font-size: 14px;
659+
line-height: 1.7;
660+
color: var(--muted);
661+
}
662+
.home-project-card--featured .home-project-summary {
663+
font-size: 15px;
664+
}
665+
666+
/* 技术栈标签:四色轮转,与全站统一的蓝色小标签区分开 */
667+
.home-project-tags {
668+
display: flex;
669+
flex-wrap: wrap;
670+
gap: 6px;
671+
margin-top: 2px;
672+
}
673+
.home-project-tag {
674+
padding: 3px 9px;
675+
border-radius: 999px;
676+
font-size: 11px;
677+
font-weight: 600;
678+
color: #3370ff;
679+
background: rgba(51, 112, 255, 0.10);
680+
}
681+
.home-project-tag:nth-child(4n + 2) {
682+
color: #16a34a;
683+
background: rgba(22, 163, 74, 0.12);
684+
}
685+
.home-project-tag:nth-child(4n + 3) {
686+
color: #d97706;
687+
background: rgba(217, 119, 6, 0.12);
688+
}
689+
.home-project-tag:nth-child(4n + 4) {
690+
color: #9333ea;
691+
background: rgba(147, 51, 234, 0.12);
692+
}
693+
[data-theme='dark'] .home-project-tag {
694+
color: #7da2ff;
695+
background: rgba(74, 127, 255, 0.16);
696+
}
697+
[data-theme='dark'] .home-project-tag:nth-child(4n + 2) {
698+
color: #4ade80;
699+
background: rgba(74, 222, 128, 0.14);
700+
}
701+
[data-theme='dark'] .home-project-tag:nth-child(4n + 3) {
702+
color: #fbbf24;
703+
background: rgba(251, 191, 36, 0.14);
704+
}
705+
[data-theme='dark'] .home-project-tag:nth-child(4n + 4) {
706+
color: #c084fc;
707+
background: rgba(192, 132, 252, 0.14);
708+
}
709+
710+
.home-project-links {
711+
margin-top: auto;
712+
padding-top: 6px;
713+
display: flex;
714+
flex-wrap: wrap;
715+
gap: 10px;
716+
}
717+
.home-project-links a {
718+
display: inline-flex;
719+
align-items: center;
720+
gap: 4px;
721+
padding: 5px 12px;
722+
border-radius: 999px;
723+
font-size: 12px;
724+
font-weight: 600;
725+
color: var(--accent);
726+
border: 1px solid rgba(51, 112, 255, 0.35);
727+
text-decoration: none;
728+
transition: background 0.15s ease;
729+
}
730+
.home-project-links a:hover {
731+
background: rgba(51, 112, 255, 0.10);
732+
text-decoration: none;
733+
}
734+
735+
.home-projects-more {
736+
display: block;
737+
margin-top: 26px;
738+
text-align: center;
739+
font-size: 14px;
740+
font-weight: 600;
741+
color: var(--accent);
742+
text-decoration: none;
743+
}
744+
.home-projects-more:hover {
745+
text-decoration: underline;
746+
}
747+
748+
@media (max-width: 900px) {
749+
.home-project-card--featured {
750+
flex-direction: column;
751+
}
752+
.home-project-card--featured .home-project-cover {
753+
width: 100%;
754+
flex: none;
755+
aspect-ratio: 16 / 9;
756+
align-self: auto;
757+
}
758+
.home-projects-grid {
759+
grid-template-columns: repeat(2, 1fr);
760+
}
761+
}
762+
763+
@media (max-width: 620px) {
764+
.home-screen-projects {
765+
padding: 40px 20px;
766+
}
767+
.home-projects-grid {
768+
grid-template-columns: 1fr;
769+
}
770+
}
771+
772+
/* ===== 第 4 屏:网站时间线(横向交替,随全屏滚动吸附) ===== */
496773
.home-screen-timeline {
497774
background: var(--bg);
498775
display: flex;
@@ -638,7 +915,7 @@ html.homepage-scroll-snap {
638915
}
639916
}
640917

641-
/* ===== 第 4 屏:Bug 案例入口(整屏,展示最新一篇 Bug 复盘) ===== */
918+
/* ===== 第 5 屏:Bug 案例入口(整屏,展示最新一篇 Bug 复盘) ===== */
642919
.home-screen-bugs {
643920
background: var(--bg);
644921
display: flex;

0 commit comments

Comments
 (0)