|
|
@@ -101,14 +101,27 @@
|
|
|
<!-- 技术亮点 -->
|
|
|
<section class="technical-highlights">
|
|
|
<h2 class="section-title">技术亮点</h2>
|
|
|
- <div class="highlights-list">
|
|
|
+ <div class="horizontal-accordion-container">
|
|
|
<div
|
|
|
- v-for="(highlight, index) in currentProject.technicalHighlights"
|
|
|
- :key="index"
|
|
|
- class="highlight-item"
|
|
|
+ v-for="(item, index) in Object.values(currentProject.technicalHighlights)"
|
|
|
+ :key="index"
|
|
|
+ class="accordion-item"
|
|
|
+ :class="{ 'active': activeAccordion === index }"
|
|
|
+ @mouseenter="handleItemHover(index)"
|
|
|
>
|
|
|
- <el-icon><Star /></el-icon>
|
|
|
- <p>{{ highlight }}</p>
|
|
|
+ <div class="accordion-header">
|
|
|
+ <el-icon class="collapse-icon"><Star /></el-icon>
|
|
|
+ <span>{{ item.title }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="accordion-content">
|
|
|
+ <p class="collapse-description">{{ item.description }}</p>
|
|
|
+ <ul class="collapse-features">
|
|
|
+ <li v-for="(feature, idx) in item.features" :key="idx">
|
|
|
+ <el-icon class="feature-icon"><Check /></el-icon>
|
|
|
+ {{ feature }}
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</section>
|
|
|
@@ -420,7 +433,7 @@
|
|
|
|
|
|
<script setup>
|
|
|
import PageHeader from './PageHeader.vue'
|
|
|
-import { ArrowLeft, ArrowRight, Calendar, Location, User, Star, VideoPlay, Picture, Document, EditPen, DataAnalysis, Reading, FolderOpened, Collection, Download } from '@element-plus/icons-vue'
|
|
|
+import { ArrowLeft, ArrowRight, Calendar, Location, User, Star, VideoPlay, Picture, Document, EditPen, DataAnalysis, Reading, FolderOpened, Collection, Download, Check, ArrowDown } from '@element-plus/icons-vue'
|
|
|
import { ref, onMounted, computed } from 'vue'
|
|
|
import { ElMessage } from 'element-plus'
|
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
|
@@ -430,6 +443,14 @@ import { projectData } from '@/data/projectCasesData'
|
|
|
const videoPlaying = ref(false)
|
|
|
const viewerVideoPlaying = ref(false)
|
|
|
|
|
|
+// 手风琴组件状态
|
|
|
+const activeAccordion = ref(0)
|
|
|
+
|
|
|
+// 鼠标悬停触发面板展开(手风琴模式自动收起其他)
|
|
|
+const handleItemHover = (key) => {
|
|
|
+ activeAccordion.value = key
|
|
|
+}
|
|
|
+
|
|
|
// 控制案例展示视频播放
|
|
|
const toggleVideoPlay = (event) => {
|
|
|
const video = document.querySelector('.display-video')
|
|
|
@@ -935,39 +956,167 @@ const goToHome = () => {
|
|
|
margin-bottom: 2rem;
|
|
|
}
|
|
|
|
|
|
-.highlights-list {
|
|
|
- display: grid;
|
|
|
- gap: 1.5rem;
|
|
|
+/* 横向手风琴容器 */
|
|
|
+.horizontal-accordion-container {
|
|
|
+ width: 100%;
|
|
|
+ height: 400px;
|
|
|
+ display: flex;
|
|
|
+ border: 1px solid #e6e6e6;
|
|
|
+ border-radius: 8px;
|
|
|
+ overflow: hidden;
|
|
|
+ margin-top: 1.5rem;
|
|
|
+ background: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+/* 单个手风琴项 */
|
|
|
+.accordion-item {
|
|
|
+ flex: 1;
|
|
|
+ min-width: 150px;
|
|
|
+ max-width: 150px;
|
|
|
+ background-size: cover;
|
|
|
+ background-position: center;
|
|
|
+ background-repeat: no-repeat;
|
|
|
+ border-right: 1px solid rgba(255, 255, 255, 0.2);
|
|
|
+ transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+ cursor: pointer;
|
|
|
}
|
|
|
|
|
|
-.highlight-item {
|
|
|
+/* 为每个手风琴项设置不同的背景图片 */
|
|
|
+.accordion-item:nth-child(1) {
|
|
|
+ background-image: url('@/assets/images/太浦河全景2.png');
|
|
|
+}
|
|
|
+
|
|
|
+.accordion-item:nth-child(2) {
|
|
|
+ background-image: url('@/assets/images/防汛演练.jpg');
|
|
|
+}
|
|
|
+
|
|
|
+.accordion-item:nth-child(3) {
|
|
|
+ background-image: url('@/assets/images/抗咸保供.png');
|
|
|
+}
|
|
|
+
|
|
|
+.accordion-item:nth-child(4) {
|
|
|
+ background-image: url('@/assets/images/贡湖.png');
|
|
|
+}
|
|
|
+
|
|
|
+/* 背景图片增强文字可读性 */
|
|
|
+.accordion-item::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ bottom: 0;
|
|
|
+ background: rgba(0, 0, 0, 0.4); /* 半透明黑色叠加层 */
|
|
|
+ transition: all 0.3s ease;
|
|
|
+}
|
|
|
+
|
|
|
+.accordion-item:last-child {
|
|
|
+ border-right: none;
|
|
|
+}
|
|
|
+
|
|
|
+/* 手风琴项激活状态(展开) */
|
|
|
+.accordion-item.active {
|
|
|
+ flex: 4;
|
|
|
+ max-width: none;
|
|
|
+}
|
|
|
+
|
|
|
+/* 手风琴头部 */
|
|
|
+.accordion-header {
|
|
|
+ height: 100%;
|
|
|
display: flex;
|
|
|
- align-items: flex-start;
|
|
|
- gap: 1rem;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
padding: 1.5rem;
|
|
|
- background: #f8f9fa;
|
|
|
- border-radius: 12px;
|
|
|
+ text-align: center;
|
|
|
transition: all 0.3s ease;
|
|
|
+ color: white;
|
|
|
+ font-weight: 500;
|
|
|
+ position: relative;
|
|
|
+ z-index: 1;
|
|
|
}
|
|
|
|
|
|
-.highlight-item:hover {
|
|
|
- background: #f0f5ff;
|
|
|
- transform: translateX(10px);
|
|
|
+.accordion-item:hover .accordion-header {
|
|
|
+ background: rgba(255, 255, 255, 0.1);
|
|
|
+ color: white;
|
|
|
}
|
|
|
|
|
|
-.highlight-item :deep(.el-icon) {
|
|
|
- color: #326ee2;
|
|
|
- margin-top: 0.25rem;
|
|
|
- font-size: 1.25rem;
|
|
|
+.accordion-item.active .accordion-header {
|
|
|
+ opacity: 0;
|
|
|
+ visibility: hidden;
|
|
|
+ transform: translateX(-100%);
|
|
|
+}
|
|
|
+
|
|
|
+.collapse-icon {
|
|
|
+ color: white;
|
|
|
+ font-size: 1.5rem;
|
|
|
+ margin-bottom: 1rem;
|
|
|
+ transition: transform 0.3s ease;
|
|
|
+}
|
|
|
+
|
|
|
+.accordion-item:hover .collapse-icon {
|
|
|
+ transform: scale(1.1);
|
|
|
+}
|
|
|
+
|
|
|
+/* 手风琴内容 */
|
|
|
+.accordion-content {
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 150px;
|
|
|
+ height: 100%;
|
|
|
+ width: calc(100% - 150px);
|
|
|
+ padding: 2rem;
|
|
|
+ opacity: 0;
|
|
|
+ visibility: hidden;
|
|
|
+ transition: all 0.4s cubic-bezier(0.645, 0.045, 0.355, 1);
|
|
|
+ overflow-y: auto;
|
|
|
}
|
|
|
|
|
|
-.highlight-item p {
|
|
|
+.accordion-item.active .accordion-content {
|
|
|
+ left: 0;
|
|
|
+ width: 100%;
|
|
|
+ opacity: 1;
|
|
|
+ visibility: visible;
|
|
|
+}
|
|
|
+
|
|
|
+.collapse-description {
|
|
|
font-size: 1rem;
|
|
|
- color: #2c3e50;
|
|
|
- line-height: 1.6;
|
|
|
+ color: white;
|
|
|
+ line-height: 1.8;
|
|
|
+ margin-bottom: 1.5rem;
|
|
|
+ font-weight: 400;
|
|
|
+}
|
|
|
+
|
|
|
+.collapse-features {
|
|
|
+ list-style: none;
|
|
|
+ padding: 0;
|
|
|
margin: 0;
|
|
|
}
|
|
|
|
|
|
+.collapse-features li {
|
|
|
+ display: flex;
|
|
|
+ align-items: flex-start;
|
|
|
+ gap: 0.75rem;
|
|
|
+ font-size: 0.95rem;
|
|
|
+ color: white;
|
|
|
+ padding: 0.75rem 0;
|
|
|
+ border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
|
|
+ line-height: 1.6;
|
|
|
+}
|
|
|
+
|
|
|
+.collapse-features li:last-child {
|
|
|
+ border-bottom: none;
|
|
|
+}
|
|
|
+
|
|
|
+.feature-icon {
|
|
|
+ color: #28a745;
|
|
|
+ font-size: 0.9rem;
|
|
|
+ margin-top: 0.2rem;
|
|
|
+ flex-shrink: 0;
|
|
|
+}
|
|
|
+
|
|
|
/* 项目成果 */
|
|
|
.project-achievements {
|
|
|
margin-bottom: 2rem;
|
|
|
@@ -1627,6 +1776,42 @@ const goToHome = () => {
|
|
|
.achievements-grid {
|
|
|
grid-template-columns: repeat(2, 1fr);
|
|
|
}
|
|
|
+
|
|
|
+ /* 手风琴组件响应式调整 */
|
|
|
+ .horizontal-accordion-container {
|
|
|
+ height: 300px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .accordion-item {
|
|
|
+ min-width: 100px;
|
|
|
+ max-width: 100px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .accordion-header {
|
|
|
+ padding: 1rem;
|
|
|
+ font-size: 0.9rem;
|
|
|
+ }
|
|
|
+
|
|
|
+ .collapse-icon {
|
|
|
+ font-size: 1.2rem;
|
|
|
+ margin-bottom: 0.5rem;
|
|
|
+ }
|
|
|
+
|
|
|
+ .accordion-content {
|
|
|
+ left: 100px;
|
|
|
+ width: calc(100% - 100px);
|
|
|
+ padding: 1.5rem;
|
|
|
+ }
|
|
|
+
|
|
|
+ .collapse-description {
|
|
|
+ font-size: 0.9rem;
|
|
|
+ margin-bottom: 1rem;
|
|
|
+ }
|
|
|
+
|
|
|
+ .collapse-features li {
|
|
|
+ font-size: 0.85rem;
|
|
|
+ padding: 0.5rem 0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@media (max-width: 480px) {
|
|
|
@@ -1664,5 +1849,82 @@ const goToHome = () => {
|
|
|
.achievements-grid {
|
|
|
grid-template-columns: 1fr;
|
|
|
}
|
|
|
+
|
|
|
+ /* 手风琴组件在小屏幕上垂直排列 */
|
|
|
+ .horizontal-accordion-container {
|
|
|
+ height: auto;
|
|
|
+ flex-direction: column;
|
|
|
+ border: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ .accordion-item {
|
|
|
+ min-width: 100%;
|
|
|
+ max-width: 100%;
|
|
|
+ height: 60px;
|
|
|
+ border-right: none;
|
|
|
+ border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
|
|
+ }
|
|
|
+
|
|
|
+ .accordion-item:nth-child(1),
|
|
|
+ .accordion-item:nth-child(2),
|
|
|
+ .accordion-item:nth-child(3),
|
|
|
+ .accordion-item:nth-child(4) {
|
|
|
+ background-size: cover;
|
|
|
+ background-position: center;
|
|
|
+ }
|
|
|
+
|
|
|
+ .accordion-header {
|
|
|
+ flex-direction: row;
|
|
|
+ padding: 1rem;
|
|
|
+ font-size: 1rem;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+
|
|
|
+ .collapse-icon {
|
|
|
+ font-size: 1.2rem;
|
|
|
+ margin-bottom: 0;
|
|
|
+ margin-right: 1rem;
|
|
|
+ }
|
|
|
+
|
|
|
+ .accordion-content {
|
|
|
+ position: relative;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ width: 100%;
|
|
|
+ height: auto;
|
|
|
+ padding: 1rem;
|
|
|
+ opacity: 0;
|
|
|
+ visibility: hidden;
|
|
|
+ max-height: 0;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+
|
|
|
+ .accordion-item.active {
|
|
|
+ flex: none;
|
|
|
+ height: auto;
|
|
|
+ max-width: 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .accordion-item.active .accordion-content {
|
|
|
+ opacity: 1;
|
|
|
+ visibility: visible;
|
|
|
+ max-height: 500px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .accordion-item.active .accordion-header {
|
|
|
+ opacity: 1;
|
|
|
+ visibility: visible;
|
|
|
+ transform: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ .collapse-description {
|
|
|
+ font-size: 0.9rem;
|
|
|
+ margin-bottom: 1rem;
|
|
|
+ }
|
|
|
+
|
|
|
+ .collapse-features li {
|
|
|
+ font-size: 0.85rem;
|
|
|
+ padding: 0.5rem 0;
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|