Files
2026-04-02 00:59:42 +08:00

999 lines
21 KiB
CSS

/* 主样式文件 - 个人作品展示网站 */
/* 重置和基础样式 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
font-size: 16px;
}
body {
font-family: var(--font-body);
font-size: var(--font-size-base);
line-height: var(--line-height-normal);
color: var(--color-text-primary);
background-color: var(--color-bg-primary);
overflow-x: hidden;
}
/* 容器 */
.container {
width: 100%;
max-width: var(--container-xl);
margin: 0 auto;
padding: 0 var(--spacing-6);
}
/* 通用样式 */
.section__title {
font-family: var(--font-heading);
font-size: var(--font-size-4xl);
font-weight: 700;
text-align: center;
margin-bottom: var(--spacing-4);
color: var(--color-text-primary);
position: relative;
}
.section__title::after {
content: '';
position: absolute;
bottom: -8px;
left: 50%;
transform: translateX(-50%);
width: 60px;
height: 4px;
background-color: var(--color-highlight);
border-radius: var(--radius-full);
}
.section__subtitle {
font-size: var(--font-size-lg);
color: var(--color-text-secondary);
text-align: center;
margin-bottom: var(--spacing-12);
max-width: 600px;
margin-left: auto;
margin-right: auto;
}
/* 按钮样式 */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: var(--spacing-4) var(--spacing-8);
font-family: var(--font-heading);
font-size: var(--font-size-base);
font-weight: 600;
text-decoration: none;
border-radius: var(--radius-md);
border: 2px solid transparent;
cursor: pointer;
transition: all var(--transition-normal);
gap: var(--spacing-3);
}
.btn--primary {
background-color: var(--color-highlight);
color: var(--color-text-primary);
}
.btn--primary:hover {
background-color: #d43c55;
transform: translateY(-2px);
box-shadow: var(--shadow-md);
}
.btn--outline {
background-color: transparent;
color: var(--color-text-primary);
border-color: var(--color-highlight);
}
.btn--outline:hover {
background-color: var(--color-highlight);
transform: translateY(-2px);
box-shadow: var(--shadow-md);
}
/* 导航栏 */
.navbar {
position: fixed;
top: 0;
left: 0;
width: 100%;
background-color: rgba(26, 26, 46, 0.95);
backdrop-filter: blur(10px);
z-index: var(--z-fixed);
padding: var(--spacing-4) 0;
transition: all var(--transition-normal);
}
.navbar.scrolled {
padding: var(--spacing-3) 0;
box-shadow: var(--shadow-md);
}
.navbar .container {
display: flex;
justify-content: space-between;
align-items: center;
}
.navbar__logo {
display: flex;
flex-direction: column;
text-decoration: none;
color: var(--color-text-primary);
}
.navbar__logo-text {
font-family: var(--font-heading);
font-size: var(--font-size-xl);
font-weight: 700;
}
.navbar__logo-subtitle {
font-size: var(--font-size-xs);
color: var(--color-text-secondary);
margin-top: 2px;
}
.navbar__toggle {
display: none;
background: none;
border: none;
cursor: pointer;
padding: var(--spacing-2);
flex-direction: column;
gap: 4px;
}
.navbar__toggle-icon {
display: block;
width: 24px;
height: 2px;
background-color: var(--color-text-primary);
transition: all var(--transition-normal);
}
.navbar__menu {
display: flex;
list-style: none;
gap: var(--spacing-8);
}
.navbar__link {
font-family: var(--font-heading);
font-size: var(--font-size-base);
font-weight: 500;
color: var(--color-text-secondary);
text-decoration: none;
padding: var(--spacing-2) var(--spacing-4);
border-radius: var(--radius-md);
transition: all var(--transition-normal);
position: relative;
}
.navbar__link:hover,
.navbar__link.active {
color: var(--color-text-primary);
}
.navbar__link.active::after {
content: '';
position: absolute;
bottom: -4px;
left: 50%;
transform: translateX(-50%);
width: 20px;
height: 2px;
background-color: var(--color-highlight);
border-radius: var(--radius-full);
}
/* Hero 模块 */
.hero {
min-height: 100vh;
display: flex;
align-items: center;
background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%);
padding-top: 80px;
position: relative;
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: radial-gradient(circle at 30% 50%, rgba(233, 69, 96, 0.1) 0%, transparent 50%);
}
.hero .container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--spacing-16);
align-items: center;
position: relative;
z-index: 1;
}
.hero__content {
max-width: 600px;
}
.hero__title {
font-family: var(--font-heading);
font-size: var(--font-size-5xl);
font-weight: 700;
line-height: var(--line-height-tight);
margin-bottom: var(--spacing-6);
}
.hero__highlight {
color: var(--color-highlight);
}
.hero__subtitle {
font-size: var(--font-size-2xl);
color: var(--color-text-secondary);
margin-bottom: var(--spacing-6);
}
.hero__description {
font-size: var(--font-size-lg);
line-height: var(--line-height-relaxed);
margin-bottom: var(--spacing-8);
color: var(--color-text-secondary);
}
.hero__actions {
display: flex;
gap: var(--spacing-6);
}
.hero__image {
display: flex;
justify-content: center;
align-items: center;
}
.hero__image-placeholder {
width: 300px;
height: 300px;
border-radius: 50%;
background: linear-gradient(135deg, var(--color-accent) 0%, var(--color-highlight) 100%);
display: flex;
align-items: center;
justify-content: center;
animation: float 6s ease-in-out infinite;
}
.hero__icon {
font-size: 8rem;
color: rgba(255, 255, 255, 0.9);
}
.hero__scroll-indicator {
position: absolute;
bottom: var(--spacing-8);
left: 50%;
transform: translateX(-50%);
animation: bounce 2s infinite;
}
.hero__scroll-indicator a {
color: var(--color-text-secondary);
font-size: var(--font-size-2xl);
text-decoration: none;
display: block;
}
/* 关于模块 */
.about {
padding: var(--spacing-32) 0;
background-color: var(--color-bg-secondary);
}
.about__content {
display: grid;
grid-template-columns: 1fr 2fr;
gap: var(--spacing-16);
align-items: start;
}
.about__image {
display: flex;
justify-content: center;
}
.about__avatar {
width: 250px;
height: 250px;
border-radius: 50%;
background: linear-gradient(135deg, var(--color-accent) 0%, var(--color-highlight) 100%);
display: flex;
align-items: center;
justify-content: center;
border: 8px solid var(--color-bg-card);
box-shadow: var(--shadow-lg);
}
.about__avatar-icon {
font-size: 6rem;
color: rgba(255, 255, 255, 0.9);
}
.about__text {
max-width: 800px;
}
.about__name {
font-family: var(--font-heading);
font-size: var(--font-size-3xl);
font-weight: 700;
margin-bottom: var(--spacing-2);
}
.about__position {
font-size: var(--font-size-xl);
color: var(--color-highlight);
margin-bottom: var(--spacing-8);
}
.about__bio {
margin-bottom: var(--spacing-12);
}
.about__bio p {
margin-bottom: var(--spacing-4);
line-height: var(--line-height-relaxed);
color: var(--color-text-secondary);
}
.about__timeline {
position: relative;
padding-left: var(--spacing-8);
}
.about__timeline::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 2px;
background-color: var(--color-highlight);
}
.timeline__item {
position: relative;
margin-bottom: var(--spacing-8);
}
.timeline__item::before {
content: '';
position: absolute;
left: calc(-1 * var(--spacing-8) - 5px);
top: 0;
width: 12px;
height: 12px;
border-radius: 50%;
background-color: var(--color-highlight);
border: 2px solid var(--color-bg-secondary);
}
.timeline__year {
font-family: var(--font-heading);
font-weight: 600;
color: var(--color-highlight);
margin-bottom: var(--spacing-2);
}
.timeline__title {
font-family: var(--font-heading);
font-size: var(--font-size-lg);
font-weight: 600;
margin-bottom: var(--spacing-1);
}
.timeline__company {
font-size: var(--font-size-base);
color: var(--color-text-secondary);
margin-bottom: var(--spacing-2);
}
.timeline__description {
font-size: var(--font-size-sm);
color: var(--color-text-muted);
line-height: var(--line-height-normal);
}
/* 技能模块 */
.skills {
padding: var(--spacing-32) 0;
background-color: var(--color-bg-primary);
}
.skills__categories {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: var(--spacing-12);
}
.skills__category {
background-color: var(--color-bg-card);
border-radius: var(--radius-lg);
padding: var(--spacing-8);
box-shadow: var(--shadow-md);
transition: transform var(--transition-normal);
}
.skills__category:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-lg);
}
.skills__category-title {
font-family: var(--font-heading);
font-size: var(--font-size-xl);
font-weight: 600;
margin-bottom: var(--spacing-6);
display: flex;
align-items: center;
gap: var(--spacing-3);
color: var(--color-text-primary);
}
.skills__category-icon {
color: var(--color-highlight);
}
.skills__list {
display: flex;
flex-direction: column;
gap: var(--spacing-6);
}
.skill__item {
display: flex;
flex-direction: column;
gap: var(--spacing-2);
}
.skill__info {
display: flex;
justify-content: space-between;
align-items: center;
}
.skill__name {
font-weight: 500;
color: var(--color-text-primary);
}
.skill__level {
font-size: var(--font-size-sm);
color: var(--color-text-secondary);
}
.skill__bar {
height: 8px;
background-color: var(--color-border);
border-radius: var(--radius-full);
overflow: hidden;
}
.skill__progress {
height: 100%;
background: linear-gradient(90deg, var(--color-highlight) 0%, var(--color-accent) 100%);
border-radius: var(--radius-full);
transition: width 1s ease-out;
}
.skills__tags {
display: flex;
flex-wrap: wrap;
gap: var(--spacing-3);
}
.skill__tag {
display: inline-block;
padding: var(--spacing-2) var(--spacing-4);
background-color: var(--color-accent);
color: var(--color-text-primary);
border-radius: var(--radius-full);
font-size: var(--font-size-sm);
font-weight: 500;
transition: all var(--transition-normal);
}
.skill__tag:hover {
background-color: var(--color-highlight);
transform: translateY(-2px);
}
/* 项目模块 */
.projects {
padding: var(--spacing-32) 0;
background-color: var(--color-bg-secondary);
}
.projects__grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: var(--spacing-8);
}
.project__card {
background-color: var(--color-bg-card);
border-radius: var(--radius-lg);
overflow: hidden;
box-shadow: var(--shadow-md);
transition: all var(--transition-normal);
display: flex;
flex-direction: column;
}
.project__card:hover {
transform: translateY(-8px);
box-shadow: var(--shadow-lg);
}
.project__image {
height: 200px;
background-color: var(--color-accent);
display: flex;
align-items: center;
justify-content: center;
}
.project__image-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, var(--color-accent) 0%, var(--color-highlight) 100%);
}
.project__icon {
font-size: 4rem;
color: rgba(255, 255, 255, 0.9);
}
.project__content {
padding: var(--spacing-8);
flex: 1;
display: flex;
flex-direction: column;
}
.project__title {
font-family: var(--font-heading);
font-size: var(--font-size-xl);
font-weight: 600;
margin-bottom: var(--spacing-4);
color: var(--color-text-primary);
}
.project__description {
font-size: var(--font-size-base);
line-height: var(--line-height-relaxed);
color: var(--color-text-secondary);
margin-bottom: var(--spacing-6);
flex: 1;
}
.project__tech {
display: flex;
flex-wrap: wrap;
gap: var(--spacing-2);
margin-bottom: var(--spacing-6);
}
.project__tech-tag {
display: inline-block;
padding: var(--spacing-1) var(--spacing-3);
background-color: var(--color-primary);
color: var(--color-text-secondary);
border-radius: var(--radius-sm);
font-size: var(--font-size-xs);
font-weight: 500;
border: 1px solid var(--color-border);
}
.project__links {
display: flex;
gap: var(--spacing-4);
}
.project__link {
display: inline-flex;
align-items: center;
gap: var(--spacing-2);
padding: var(--spacing-2) var(--spacing-4);
background-color: var(--color-accent);
color: var(--color-text-primary);
text-decoration: none;
border-radius: var(--radius-md);
font-size: var(--font-size-sm);
font-weight: 500;
transition: all var(--transition-normal);
}
.project__link:hover {
background-color: var(--color-highlight);
transform: translateY(-2px);
}
/* 联系模块 */
.contact {
padding: var(--spacing-32) 0;
background-color: var(--color-bg-primary);
}
.contact__content {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--spacing-16);
max-width: 1000px;
margin: 0 auto;
}
.contact__info-title {
font-family: var(--font-heading);
font-size: var(--font-size-2xl);
font-weight: 600;
margin-bottom: var(--spacing-8);
color: var(--color-text-primary);
}
.contact__item {
display: flex;
align-items: flex-start;
gap: var(--spacing-4);
margin-bottom: var(--spacing-6);
}
.contact__icon {
font-size: var(--font-size-xl);
color: var(--color-highlight);
margin-top: 2px;
}
.contact__details {
flex: 1;
}
.contact__label {
font-family: var(--font-heading);
font-size: var(--font-size-sm);
font-weight: 600;
color: var(--color-text-secondary);
margin-bottom: var(--spacing-1);
text-transform: uppercase;
letter-spacing: 1px;
}
.contact__value {
font-size: var(--font-size-base);
color: var(--color-text-primary);
text-decoration: none;
transition: color var(--transition-normal);
}
.contact__value:hover {
color: var(--color-highlight);
}
.contact__social {
margin-top: var(--spacing-8);
}
.contact__social-title {
font-family: var(--font-heading);
font-size: var(--font-size-lg);
font-weight: 600;
margin-bottom: var(--spacing-4);
color: var(--color-text-primary);
}
.contact__social-links {
display: flex;
gap: var(--spacing-4);
}
.contact__social-link {
display: inline-flex;
align-items: center;
justify-content: center;
width: 44px;
height: 44px;
background-color: var(--color-bg-card);
color: var(--color-text-primary);
border-radius: var(--radius-md);
text-decoration: none;
font-size: var(--font-size-lg);
transition: all var(--transition-normal);
}
.contact__social-link:hover {
background-color: var(--color-highlight);
transform: translateY(-2px);
box-shadow: var(--shadow-md);
}
.contact__form {
background-color: var(--color-bg-card);
border-radius: var(--radius-lg);
padding: var(--spacing-8);
box-shadow: var(--shadow-md);
}
.form__group {
margin-bottom: var(--spacing-6);
}
.form__label {
display: block;
font-family: var(--font-heading);
font-size: var(--font-size-sm);
font-weight: 600;
color: var(--color-text-secondary);
margin-bottom: var(--spacing-2);
text-transform: uppercase;
letter-spacing: 1px;
}
.form__input,
.form__textarea {
width: 100%;
padding: var(--spacing-4);
background-color: var(--color-bg-secondary);
border: 2px solid var(--color-border);
border-radius: var(--radius-md);
font-family: var(--font-body);
font-size: var(--font-size-base);
color: var(--color-text-primary);
transition: all var(--transition-normal);
}
.form__input:focus,
.form__textarea:focus {
outline: none;
border-color: var(--color-highlight);
box-shadow: 0 0 0 3px rgba(233, 69, 96, 0.1);
}
.form__textarea {
min-height: 150px;
resize: vertical;
}
.form__button {
width: 100%;
padding: var(--spacing-4);
background-color: var(--color-highlight);
color: var(--color-text-primary);
border: none;
border-radius: var(--radius-md);
font-family: var(--font-heading);
font-size: var(--font-size-base);
font-weight: 600;
cursor: pointer;
transition: all var(--transition-normal);
}
.form__button:hover {
background-color: #d43c55;
transform: translateY(-2px);
box-shadow: var(--shadow-md);
}
.form__button:disabled {
opacity: 0.6;
cursor: not-allowed;
transform: none;
}
.form__message {
margin-top: var(--spacing-4);
padding: var(--spacing-4);
border-radius: var(--radius-md);
text-align: center;
font-weight: 500;
}
.form__message--success {
background-color: rgba(46, 204, 113, 0.1);
color: #2ecc71;
border: 1px solid rgba(46, 204, 113, 0.2);
}
.form__message--error {
background-color: rgba(231, 76, 60, 0.1);
color: #e74c3c;
border: 1px solid rgba(231, 76, 60, 0.2);
}
/* 页脚 */
.footer {
background-color: var(--color-primary);
padding: var(--spacing-12) 0;
border-top: 1px solid var(--color-border);
}
.footer .container {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--spacing-8);
}
.footer__content {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--spacing-6);
text-align: center;
}
.footer__logo {
font-family: var(--font-heading);
font-size: var(--font-size-2xl);
font-weight: 700;
color: var(--color-text-primary);
text-decoration: none;
}
.footer__nav {
display: flex;
gap: var(--spacing-6);
list-style: none;
}
.footer__nav-link {
font-family: var(--font-heading);
font-size: var(--font-size-sm);
color: var(--color-text-secondary);
text-decoration: none;
transition: color var(--transition-normal);
}
.footer__nav-link:hover {
color: var(--color-highlight);
}
.footer__social {
display: flex;
gap: var(--spacing-4);
}
.footer__social-link {
display: inline-flex;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
background-color: var(--color-bg-card);
color: var(--color-text-primary);
border-radius: var(--radius-md);
text-decoration: none;
font-size: var(--font-size-base);
transition: all var(--transition-normal);
}
.footer__social-link:hover {
background-color: var(--color-highlight);
transform: translateY(-2px);
}
.footer__copyright {
font-size: var(--font-size-sm);
color: var(--color-text-muted);
text-align: center;
}
.footer__back-to-top {
position: fixed;
bottom: var(--spacing-8);
right: var(--spacing-8);
width: 48px;
height: 48px;
background-color: var(--color-highlight);
color: var(--color-text-primary);
border-radius: var(--radius-full);
display: flex;
align-items: center;
justify-content: center;
text-decoration: none;
font-size: var(--font-size-lg);
box-shadow: var(--shadow-md);
opacity: 0;
visibility: hidden;
transition: all var(--transition-normal);
z-index: var(--z-fixed);
}
.footer__back-to-top.visible {
opacity: 1;
visibility: visible;
}
.footer__back-to-top:hover {
background-color: #d43c55;
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
}
/* 动画 */
@keyframes float {
0%, 100% {
transform: translateY(0);
}
50% {
transform: translateY(-20px);
}
}
@keyframes bounce {
0%, 20%, 50%, 80%, 100% {
transform: translateY(0) translateX(-50%);
}
40% {
transform: translateY(-10px) translateX(-50%);
}
60% {
transform: translateY(-5px) translateX(-50%);
}
}
/* 工具类 */
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.text-center {
text-align: center;
}
.mt-4 { margin-top: var(--spacing-4); }
.mt-8 { margin-top: var(--spacing-8); }
.mb-4 { margin-bottom: var(--spacing-4); }
.mb-8 { margin-bottom: var(--spacing-8); }
/* 加载状态 */
.loading {
display: inline-block;
width: 20px;
height: 20px;
border: 2px solid var(--color-text-secondary);
border-radius: 50%;
border-top-color: var(--color-highlight);
animation: spin 1s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}