Files
teach_sys_Demo/src/pages/CalendarPage/index.css
KQL 561d5c286d feat: 实现日历课程点击跳转到直播间功能
- 添加日历课程详情弹窗的点击跳转功能
- 公共课直播间和课程直播间支持URL参数自动选中课程
- 优化岗位详情页面样式,复用简洁卡片样式
- 为岗位详情标题添加图标
- 调整不同类型课程的跳转逻辑

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 14:14:45 +08:00

931 lines
16 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* CSS变量定义 */
:root {
--primary-color: #3b82f6;
--border-color: #e5e6eb;
--text-color: #1d2129;
--text-muted: #86909c;
--bg-hover: #f2f3f5;
}
/* 日历页面样式 */
.calendar-page {
width: 100%;
height: 100%;
padding: 20px;
.calendar-page-wrapper {
width: 1120px;
height: 862px;
display: flex;
padding: 20px;
background-color: #fff;
flex-direction: column;
}
}
/* 日历头部控制栏 */
.calendar-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 0;
margin-bottom: 24px;
border-bottom: 1px solid var(--border-color);
}
.calendar-nav {
display: flex;
align-items: center;
gap: 16px;
}
.nav-button {
width: 32px;
height: 32px;
border: 1px solid var(--border-color);
background: white;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.15s ease;
color: var(--text-secondary);
}
.nav-button:hover {
background: #f3f4f6;
border-color: var(--primary-color);
color: var(--primary-color);
}
.nav-button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.calendar-title {
font-size: 20px;
font-weight: 600;
color: var(--text-primary);
margin: 0 8px;
}
.view-switcher {
display: flex;
background: #f3f4f6;
border-radius: 6px;
padding: 2px;
}
.view-button {
padding: 6px 16px;
border: none;
background: none;
border-radius: 4px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.15s ease;
color: var(--text-secondary);
}
.view-button.active {
background: var(--text-primary);
color: white;
}
.view-button:hover:not(.active) {
background: #e5e7eb;
}
/* 日历主体容器 */
.calendar-container {
flex: 1;
background: white;
border-radius: 8px;
box-shadow: var(--shadow);
border: 1px solid var(--border-color);
overflow: hidden;
}
/* 月视图样式 */
.month-view {
height: 100%;
display: flex;
flex-direction: column;
}
.month-header {
display: grid;
grid-template-columns: repeat(7, 1fr);
background: #f8fafc;
border-bottom: 1px solid var(--border-color);
}
.weekday-header {
padding: 12px 8px;
text-align: center;
font-size: 13px;
font-weight: 600;
color: var(--text-secondary);
border-right: 1px solid #e5e7eb;
}
.weekday-header:last-child {
border-right: none;
}
.month-grid {
flex: 1;
display: grid;
grid-template-columns: repeat(7, 1fr);
grid-template-rows: repeat(6, 1fr);
gap: 1px;
background: #e5e7eb;
padding: 1px;
}
.day-cell {
background: white;
padding: 10px;
display: flex;
flex-direction: column;
cursor: pointer;
transition: all 0.3s ease;
min-height: 100px;
max-height: 100px;
height: 100px;
position: relative;
border-radius: 10px;
border: 1px solid #e8e8f0;
margin: 3px;
overflow: hidden;
}
.day-cell:hover {
background: linear-gradient(135deg, #fafbff 0%, #f5f7ff 100%);
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.08);
transform: translateY(-2px);
border-color: #d4deff;
}
.day-cell.other-month {
background: #fafbfc;
color: #b8bcc8;
opacity: 0.5;
}
.day-cell.today {
background: linear-gradient(135deg, #e8f4ff 0%, #f0f9ff 100%) !important;
border: 2px solid #3b82f6;
box-shadow: 0 6px 16px rgba(59, 130, 246, 0.12);
}
.day-cell.selected {
background: linear-gradient(135deg, #dbeafe 0%, #e6f2ff 100%) !important;
border: 2px solid #2563eb;
box-shadow: 0 4px 12px rgba(37, 99, 235, 0.15);
}
/* 删除no-events样式限制允许所有日期都可点击 */
.day-number {
font-size: 14px;
font-weight: 500;
margin-bottom: 4px;
align-self: flex-start;
}
.day-cell.today .day-number {
background: #3b82f6;
color: white;
width: 24px;
height: 24px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
}
.event-list {
flex: 1;
display: flex;
flex-direction: column;
gap: 2px;
overflow: hidden;
}
.event-item {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
font-size: 11px;
padding: 3px 6px;
border-radius: 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
transition: all 0.3s ease;
margin: 1px 0;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
font-weight: 500;
max-width: 100%;
display: block;
}
.event-item:hover {
transform: translateX(2px);
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15);
}
/* 复合技能课 */
.event-item.compound-skill {
background: #5AC6FF;
}
/* 垂直技能课 */
.event-item.vertical-skill {
background: #CB78E0;
}
/* 企业高管公开课 */
.event-item.public-course {
background: #D0A474;
}
/* AI课程 */
.event-item.ai-course {
background: #F7A133;
}
/* 营销课 */
.event-item.marketing-course {
background: #FF4277;
}
/* 1v1规划 */
.event-item.one-on-one {
background: #FFCC3F;
}
/* 线下面试模拟 */
.event-item.interview {
background: #0743DA;
}
.event-more {
font-size: 9px;
color: var(--text-muted);
margin-top: 2px;
}
/* 周视图样式 */
.week-view {
height: 100%;
display: flex;
flex-direction: column;
}
.week-header {
display: grid;
grid-template-columns: 60px repeat(7, 1fr);
background: #f8fafc;
border-bottom: 1px solid var(--border-color);
position: sticky;
top: 0;
z-index: var(--z-header); /* 使用全局header层级确保不干扰弹窗 */
}
.time-header {
padding: 12px 8px;
font-size: 12px;
font-weight: 600;
color: var(--text-secondary);
border-right: 1px solid #e5e7eb;
display: flex;
align-items: center;
justify-content: center;
}
.day-header {
padding: 12px 8px;
text-align: center;
border-right: 1px solid #e5e7eb;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
}
.day-header:last-child {
border-right: none;
}
.day-name {
font-size: 12px;
font-weight: 500;
color: var(--text-secondary);
}
.day-date {
font-size: 16px;
font-weight: 600;
color: var(--text-primary);
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
}
.day-header.today .day-date {
background: var(--primary-color);
color: white;
}
.week-grid {
flex: 1;
display: grid;
grid-template-columns: 60px repeat(7, 1fr);
overflow-y: auto;
position: relative;
}
.time-column {
border-right: 1px solid #e5e7eb;
background: #fafbfc;
display: flex;
flex-direction: column;
}
.time-slot {
height: 60px;
border-bottom: 1px solid #f3f4f6;
display: flex;
align-items: flex-start;
padding: 4px 8px;
font-size: 11px;
color: var(--text-muted);
position: relative;
}
.time-slot:nth-child(odd) {
background: #fbfcfd;
}
.day-column {
border-right: 1px solid #f3f4f6;
position: relative;
display: flex;
flex-direction: column;
}
.day-column:last-child {
border-right: none;
}
.hour-slot {
height: 60px;
border-bottom: 1px solid #f3f4f6;
position: relative;
}
.hour-slot:nth-child(odd) {
background: #fbfcfd;
}
.event-block {
position: absolute;
left: 4px;
right: 4px;
background: var(--primary-color);
color: white;
border-radius: 4px;
padding: 4px 6px;
font-size: 11px;
z-index: 5;
cursor: pointer;
transition: all 0.15s ease;
overflow: hidden;
display: flex;
flex-direction: column;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.event-block:hover {
transform: translateY(-1px);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
}
.event-block.class {
background: #3b82f6;
}
.event-block.meeting {
background: #10b981;
}
.event-block.lab {
background: #f59e0b;
}
.event-block.exam {
background: #ef4444;
}
.event-title {
font-weight: 600;
margin-bottom: 2px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.event-time {
font-size: 10px;
opacity: 0.9;
}
/* 当前时间线 - 使用合理的层级 */
.current-time-line {
position: absolute;
left: 60px;
right: 0;
height: 2px;
background: #ef4444;
z-index: var(--z-content); /* 使用内容层级,不需要很高 */
pointer-events: none;
}
.current-time-line::before {
content: "";
position: absolute;
left: -6px;
top: -4px;
width: 10px;
height: 10px;
background: #ef4444;
border-radius: 50%;
}
/* 空状态 */
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 200px;
color: var(--text-muted);
}
.empty-state-icon {
font-size: 48px;
margin-bottom: 16px;
opacity: 0.5;
}
.empty-state-text {
font-size: 16px;
margin-bottom: 8px;
}
.empty-state-description {
font-size: 14px;
opacity: 0.7;
}
/* 事件详情提示 - 使用全局z-index系统 */
.event-tooltip {
position: absolute;
background: var(--text-primary);
color: white;
padding: 8px 12px;
border-radius: 6px;
font-size: 12px;
z-index: var(--z-tooltip); /* 使用全局tooltip层级 */
max-width: 200px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
pointer-events: none;
}
.event-tooltip::after {
content: "";
position: absolute;
bottom: -6px;
left: 50%;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-top: 6px solid var(--text-primary);
}
/* 事件详情模态框样式 - 新设计 */
/* 模态框遮罩层 */
.event-detail-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.45);
z-index: var(--z-modal);
display: flex;
align-items: center;
justify-content: center;
animation: overlayFadeIn 200ms ease-out;
backdrop-filter: blur(4px);
}
@keyframes overlayFadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* 新模态框主体 */
.event-detail-modal-new {
background: #ffffff;
border-radius: 12px;
box-shadow: 0 24px 48px rgba(0, 0, 0, 0.12), 0 8px 16px rgba(0, 0, 0, 0.08);
width: 520px;
max-width: 90vw;
max-height: 75vh;
display: flex;
flex-direction: column;
animation: modalSlideIn 250ms cubic-bezier(0.4, 0, 0.2, 1);
}
@keyframes modalSlideIn {
from {
opacity: 0;
transform: scale(0.96) translateY(-20px);
}
to {
opacity: 1;
transform: scale(1) translateY(0);
}
}
/* 新模态框头部 */
.event-detail-header-new {
padding: 20px 24px;
border-bottom: 1px solid #e5e7eb;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
}
/* 新标题样式 */
.event-detail-title-new {
font-size: 18px;
font-weight: 600;
color: #1f2937;
margin: 0;
letter-spacing: -0.01em;
}
/* 新关闭按钮 */
.event-detail-close-new {
width: 36px;
height: 36px;
border: none;
background: transparent;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: #6b7280;
transition: all 150ms ease;
}
.event-detail-close-new:hover {
background: #f3f4f6;
color: #374151;
}
.event-detail-close-new:active {
background: #e5e7eb;
}
/* 日期头部(多事件模式) */
.event-detail-date-header {
padding: 16px 24px;
background: linear-gradient(to right, #f0f9ff, #e0f2fe);
border-bottom: 1px solid #e0e7ff;
display: flex;
align-items: center;
gap: 12px;
font-size: 15px;
font-weight: 500;
color: #1e40af;
flex-shrink: 0;
}
/* 新内容区域 */
.event-detail-content-new {
flex: 1;
overflow-y: auto;
padding: 20px 24px;
}
/* 事件列表容器 */
.event-list-container {
display: flex;
flex-direction: column;
gap: 16px;
}
/* 新事件卡片 */
.event-card-new {
background: #fafbfc;
border: 1px solid #e5e7eb;
border-radius: 10px;
padding: 16px;
transition: all 150ms ease;
}
.event-card-new:hover {
background: #f9fafb;
border-color: #d1d5db;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
/* 可点击的课程卡片样式 */
.event-card-new.clickable-course {
cursor: pointer;
transition: all 0.2s ease;
}
.event-card-new.clickable-course:hover {
background: #f3f4f6;
border-color: #4080ff;
box-shadow: 0 4px 12px rgba(64, 128, 255, 0.15);
transform: translateY(-2px);
}
/* 事件卡片头部 */
.event-card-header {
display: flex;
gap: 12px;
margin-bottom: 12px;
}
/* 事件类型指示器 */
.event-type-indicator {
width: 4px;
border-radius: 2px;
flex-shrink: 0;
}
/* 事件卡片标题区 */
.event-card-title {
flex: 1;
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 12px;
}
.event-card-title h4 {
margin: 0;
font-size: 16px;
font-weight: 600;
color: #111827;
line-height: 1.4;
}
/* 事件类型标签 */
.event-type-tag {
padding: 4px 10px;
border-radius: 6px;
font-size: 12px;
font-weight: 500;
white-space: nowrap;
flex-shrink: 0;
}
/* 事件卡片内容 */
.event-card-body {
padding-left: 16px;
display: flex;
flex-direction: column;
gap: 10px;
}
/* 事件信息行 */
.event-info-row {
display: flex;
align-items: center;
gap: 8px;
}
/* 事件时间 */
.event-time {
font-size: 14px;
color: #6b7280;
font-family: "SF Mono", "Monaco", "Cascadia Code", monospace;
}
/* 事件状态 */
.event-status {
display: flex;
align-items: center;
gap: 6px;
font-size: 13px;
font-weight: 500;
}
/* 事件描述 */
.event-description {
font-size: 14px;
color: #4b5563;
line-height: 1.5;
padding: 12px;
background: white;
border-radius: 6px;
border-left: 3px solid #e5e7eb;
margin-top: 4px;
}
/* 更多事件指示器 */
.event-more {
font-size: 11px;
color: #6b7280;
background: #f3f4f6;
padding: 2px 6px;
border-radius: 4px;
text-align: center;
cursor: pointer;
transition: all 150ms ease;
}
.event-more:hover {
background: #e5e7eb;
color: #374151;
}
/* 无事项状态 */
.event-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
text-align: center;
}
/* 响应式设计 */
@media (max-width: 1024px) {
.calendar-header {
flex-direction: column;
gap: 16px;
align-items: stretch;
}
.calendar-nav {
justify-content: center;
}
.view-switcher {
align-self: center;
}
.day-cell {
min-height: 60px;
padding: 4px;
}
.event-item {
font-size: 9px;
padding: 1px 2px;
}
}
@media (max-width: 768px) {
.calendar-title {
font-size: 18px;
}
.nav-button {
width: 28px;
height: 28px;
}
.view-button {
padding: 4px 12px;
font-size: 13px;
}
.week-grid {
grid-template-columns: 50px repeat(7, 1fr);
}
.time-header,
.time-column {
width: 50px;
}
.time-slot {
padding: 2px 4px;
font-size: 10px;
}
.day-cell {
min-height: 50px;
padding: 2px;
}
.day-number {
font-size: 12px;
}
.event-item {
font-size: 8px;
padding: 1px;
}
}
/* 加载状态 */
.calendar-loading {
display: flex;
align-items: center;
justify-content: center;
height: 200px;
color: var(--text-muted);
}
.loading-spinner {
width: 32px;
height: 32px;
border: 3px solid #f3f4f6;
border-top: 3px solid var(--primary-color);
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
/* 响应式设计 - 移动端适配 */
@media (max-width: 640px) {
.event-detail-modal-new {
width: 95vw;
max-height: 85vh;
margin: 16px;
}
.event-detail-header-new,
.event-detail-content-new {
padding: 16px;
}
.event-detail-date-header {
padding: 12px 16px;
font-size: 14px;
}
.event-card-new {
padding: 12px;
}
.event-card-title h4 {
font-size: 15px;
}
.event-type-tag {
font-size: 11px;
padding: 3px 8px;
}
.event-time {
font-size: 13px;
}
.event-status {
font-size: 12px;
}
.event-description {
font-size: 13px;
padding: 10px;
}
}