Pārlūkot izejas kodu

详情页面改动

BAI 3 nedēļas atpakaļ
vecāks
revīzija
b08adb1025
1 mainītis faili ar 287 papildinājumiem un 25 dzēšanām
  1. 287 25
      RuoYi-Vue3/src/views/front/ProjectCases.vue

+ 287 - 25
RuoYi-Vue3/src/views/front/ProjectCases.vue

@@ -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>