|
|
- <script setup>
- // 接收案例项数据作为props
- const props = defineProps({
- item: {
- type: Object,
- required: true
- },
- // 是否显示分类标签
- showCategory: {
- type: Boolean,
- default: true
- },
- // 按钮类型:"link"链接样式 或 "button"按钮样式
- buttonType: {
- type: String,
- default: 'link' // 'link' 或 'button'
- }
- });
-
- // 点击查看详情事件
- const emit = defineEmits(['view-details']);
-
- const viewDetails = () => {
- emit('view-details', props.item.id);
- };
- </script>
-
- <template>
- <div class="case-card" data-aos="fade-up" :data-aos-delay="item.delay">
- <div class="case-image">
- <div v-if="showCategory" class="category-tag">{{ item.categoryName }}</div>
- <img :src="item.imageUrl && item.imageUrl.split(',')[0]" :alt="item.title" />
- </div>
- <div class="case-content">
- <h3>{{ item.title }}</h3>
- <p>{{ item.description }}</p>
- <!-- 根据buttonType渲染不同的按钮样式 -->
- <a v-if="buttonType === 'link'" href="#" class="btn-link" @click.prevent="viewDetails">查看详情</a>
- <button v-else class="btn-details" @click="viewDetails">查看详情</button>
- </div>
- </div>
- </template>
-
- <style lang="scss" scoped>
- /* 导入全局SCSS变量 */
- @use '../../assets/scss/main.scss' as *;
- // .case-card {
- // background: white;
- // border-radius: 8px;
- // overflow: hidden;
- // box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
- // transition: transform 0.3s ease, box-shadow 0.3s ease;
-
- // &:hover {
- // transform: translateY(-10px);
- // box-shadow: 0 15px 30px rgba(0, 0, 0, 0.1);
-
- // .case-image img {
- // transform: scale(1.05);
- // }
- // }
-
- // .case-image {
- // position: relative;
-
- // img {
- // width: 100%;
- // height: 300px;
- // object-fit: cover;
- // transition: transform 0.5s ease;
- // }
-
- // .category-tag {
- // position: absolute;
- // top: 15px;
- // right: 15px;
- // background-color: rgba(52, 152, 219, 0.9);
- // color: white;
- // padding: 6px 12px;
- // border-radius: 4px;
- // font-size: 0.8rem;
- // font-weight: 600;
- // z-index: 2;
- // }
- // }
-
- // .case-content {
- // padding: 25px;
-
- // h3 {
- // font-size: 1.5rem;
- // margin-bottom: 15px;
- // color: #2c3e50;
- // }
-
- // p {
- // color: #7f8c8d;
- // margin-bottom: 20px;
- // }
- // }
- // }
-
- // .btn-link {
- // color: #3498db;
- // text-decoration: none;
- // font-weight: 600;
- // position: relative;
- // cursor: pointer;
-
- // &:after {
- // content: '';
- // position: absolute;
- // width: 0;
- // height: 2px;
- // bottom: -5px;
- // left: 0;
- // background-color: #3498db;
- // transition: width 0.3s ease;
- // }
-
- // &:hover {
- // &:after {
- // width: 100%;
- // }
- // }
- // }
-
- // .btn-details {
- // background-color: #3498db;
- // color: white;
- // border: none;
- // padding: 10px 20px;
- // border-radius: 4px;
- // font-weight: 600;
- // cursor: pointer;
- // transition: background-color 0.3s ease;
-
- // &:hover {
- // background-color: #2980b9;
- // }
- // }
-
- .case-card {
- border-radius: 12px;
- overflow: hidden;
- box-shadow: $shadow-sm;
- transition: transform 0.3s ease, box-shadow 0.3s ease;
- background: white;
- position: relative;
-
- &:hover {
- transform: translateY(-10px);
- box-shadow: $shadow-lg;
-
- .case-image img {
- transform: scale(1.05);
- }
- }
-
- .case-image {
- position: relative;
- overflow: hidden;
-
- img {
- width: 100%;
- height: 250px;
- object-fit: cover;
- transition: transform 0.5s ease;
- }
- }
-
- .category-tag {
- position: absolute;
- top: 15px;
- right: 15px;
- background: rgba($primary-color, 0.8);
- color: white;
- padding: 5px 12px;
- border-radius: 20px;
- font-size: 12px;
- font-weight: 500;
- z-index: 1;
- }
-
- .case-content {
- padding: 25px;
- background: white;
-
- h3 {
- font-size: 1.3rem;
- margin-bottom: 10px;
- color: $text-color;
- }
-
- p {
- color: $text-light;
- margin-bottom: 15px;
- line-height: 1.6;
- }
- }
- }
-
- .btn-details {
- display: inline-block;
- padding: 8px 20px;
- background: transparent;
- border: 1px solid $primary-color;
- color: $primary-color;
- border-radius: 30px;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.3s ease;
-
- &:hover {
- background: $primary-color;
- color: white;
- }
- }
- </style>
|