Files
advertising-system/styles.css
Snowz 9e8a88274d perf(页面加载): 优化价格显示性能并添加加载状态处理
- 改用DOMContentLoaded事件提前初始化页面
- 实现渐进式价格显示:基础价格→加载中→实时价格
- 为fetchVisitData添加超时和重试机制
- 新增价格状态视觉区分样式
- 从2分钟等待优化为立即显示基础价格,后台异步更新
2025-08-17 14:49:06 +08:00

508 lines
8.3 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.

/* 全局样式 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif;
line-height: 1.6;
color: #333;
background-color: #f5f5f5;
}
/* 头部样式 */
header {
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
color: white;
padding: 2rem;
text-align: center;
}
.logo {
font-size: 2rem;
font-weight: bold;
margin-bottom: 1rem;
}
h1 {
font-size: 2.5rem;
margin-bottom: 0.5rem;
}
.subtitle {
font-size: 1.2rem;
opacity: 0.9;
}
/* 主要内容区域 */
main {
max-width: 1200px;
margin: 0 auto;
padding: 2rem;
}
/* 广告位卡片样式 */
.ad-positions {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 2rem;
}
/* 价格状态样式 */
.base-price {
color: #666 !important;
font-style: italic;
position: relative;
}
.base-price::after {
content: " (基础价格)";
font-size: 0.8em;
color: #999;
font-weight: normal;
}
.loading-price {
color: #007bff !important;
animation: pulse 1.5s ease-in-out infinite;
font-weight: 500;
}
@keyframes pulse {
0% { opacity: 1; }
50% { opacity: 0.6; }
100% { opacity: 1; }
}
.real-time-price {
color: #28a745 !important;
font-weight: bold;
position: relative;
}
.real-time-price::after {
content: " (实时价格)";
font-size: 0.8em;
color: #28a745;
font-weight: normal;
opacity: 0.8;
margin-bottom: 3rem;
}
.ad-card {
background: white;
border-radius: 10px;
padding: 1.5rem;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease;
}
.ad-card:hover {
transform: translateY(-5px);
}
/* 广告预览图片样式 */
.ad-preview {
position: relative;
margin: 1rem 0;
background: #f0f0f0;
height: 150px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 5px;
overflow: hidden;
cursor: pointer;
transition: transform 0.3s ease;
}
.ad-preview:hover {
transform: scale(1.02);
}
.ad-preview a {
display: block;
width: 100%;
height: 100%;
text-decoration: none;
}
.ad-preview img {
max-width: 100%;
max-height: 100%;
object-fit: contain;
}
.preview-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.3s ease;
}
.ad-preview:hover .preview-overlay {
opacity: 1;
}
.preview-hint {
color: white;
font-size: 1.2em;
margin-bottom: 10px;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
}
.ad-dimensions {
color: white;
font-size: 0.9em;
background: rgba(0, 0, 0, 0.6);
padding: 4px 8px;
border-radius: 4px;
}
/* 预览模态框样式 */
.preview-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.9);
z-index: 1000;
opacity: 0;
transition: opacity 0.3s ease;
display: none;
align-items: center;
justify-content: center;
}
.preview-modal.show {
opacity: 1;
}
.preview-modal-content {
position: relative;
max-width: 90%;
max-height: 90vh;
display: flex;
flex-direction: column;
align-items: center;
background: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
}
.preview-modal-img {
max-width: 100%;
max-height: 80vh;
object-fit: contain;
border-radius: 8px;
}
.preview-modal-info {
margin-top: 20px;
color: #333;
text-align: center;
}
.preview-modal-title {
font-size: 1.2em;
font-weight: bold;
margin-bottom: 8px;
}
.preview-modal-dimensions {
font-size: 0.9em;
color: #666;
}
.preview-close {
position: absolute;
top: -40px;
right: 0;
color: white;
font-size: 35px;
font-weight: bold;
cursor: pointer;
transition: color 0.3s ease;
}
.preview-close:hover {
color: #ff4444;
}
/* 响应式调整 */
@media (max-width: 768px) {
.preview-modal-content {
max-width: 95%;
padding: 10px;
}
.preview-modal-img {
max-height: 70vh;
}
.preview-hint {
font-size: 1em;
}
.ad-dimensions {
font-size: 0.8em;
}
}
.ad-stats {
margin: 1rem 0;
}
.ad-stats p {
margin: 0.5rem 0;
font-size: 1.1rem;
}
.note {
color: #666;
font-size: 0.9rem;
font-style: italic;
}
.booking-options {
display: flex;
gap: 1rem;
margin-top: 1rem;
}
.booking-options .book-btn {
flex: 1;
}
.book-btn {
background: #1e3c72;
color: white;
border: none;
padding: 0.8rem 1.5rem;
border-radius: 5px;
cursor: pointer;
font-size: 1.1rem;
transition: background 0.3s ease;
}
.book-btn:hover {
background: #2a5298;
}
/* 广告效果数据区域 */
.ad-stats {
background: white;
padding: 2rem;
border-radius: 10px;
margin-bottom: 3rem;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 2rem;
margin-top: 1.5rem;
}
.stat-item {
text-align: center;
padding: 1.5rem;
background: #f8f9fa;
border-radius: 8px;
}
.stat-item h3 {
color: #666;
margin-bottom: 0.5rem;
}
.stat-item p {
font-size: 1.5rem;
font-weight: bold;
color: #1e3c72;
}
/* 联系方式区域 */
.contact {
background: white;
padding: 2rem;
border-radius: 10px;
text-align: center;
}
.contact-info {
margin: 1.5rem 0;
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
}
.wechat-contact {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
padding: 1.5rem;
background: #f8f9fa;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
transition: transform 0.3s ease;
}
.wechat-contact:hover {
transform: translateY(-2px);
}
.wechat-qrcode {
width: 100px;
height: 100px;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.wechat-qrcode img {
width: 100%;
height: 100%;
object-fit: cover;
}
.wechat-id {
font-size: 1.1rem;
color: #333;
font-weight: 500;
margin: 0;
padding: 0.5rem 1rem;
background: #fff;
border-radius: 4px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
/* 响应式设计 */
@media (max-width: 768px) {
.contact {
padding: 1.5rem;
}
.wechat-contact {
padding: 1rem;
}
.wechat-qrcode {
width: 90px;
height: 90px;
}
.wechat-id {
font-size: 1rem;
}
}
/* 页脚样式 */
footer {
text-align: center;
padding: 2rem;
background: #1e3c72;
color: white;
margin-top: 3rem;
}
/* 响应式设计 */
@media (max-width: 768px) {
.ad-positions {
grid-template-columns: 1fr;
}
.stats-grid {
grid-template-columns: 1fr;
}
.contact-info {
grid-template-columns: 1fr;
}
.booking-options {
flex-direction: column;
}
}
/* 广告限制说明样式 */
.ad-restrictions {
background-color: #fff8f8;
border: 1px solid #ffd6d6;
border-radius: 8px;
padding: 20px;
margin: 20px auto;
max-width: 800px;
}
.ad-restrictions h2 {
color: #d32f2f;
margin-top: 0;
font-size: 1.5em;
}
.ad-restrictions ul {
list-style-type: none;
padding-left: 20px;
}
.ad-restrictions li {
position: relative;
padding-left: 25px;
margin-bottom: 8px;
}
.ad-restrictions li:before {
content: "×";
color: #d32f2f;
position: absolute;
left: 0;
font-weight: bold;
}
.restriction-note {
color: #666;
font-style: italic;
margin-top: 15px;
font-size: 0.9em;
}
/* 广告位状态样式 */
.ad-status {
margin: 10px 0;
padding: 8px 12px;
border-radius: 4px;
text-align: center;
font-weight: bold;
}
.status-available {
color: #4caf50;
background-color: #e8f5e9;
}
.status-booked {
color: #f44336;
background-color: #ffebee;
}
.status-booked .end-date {
display: block;
font-size: 0.9em;
font-weight: normal;
margin-top: 4px;
}