<template> <v-container> <div> <!-- <v-breadcrumbs divider="/" style="padding-top: 0"> <template v-for="(item, index) in items" :key="index"> <v-breadcrumbs-item :disabled="item.disabled" :href="item.href" :class="{ 'breadcrumb-disabled': item.disabled, 'breadcrumb-active': !item.disabled, 'breadcrumb-last': index === items.length - 1, }" :style=" index === items.length - 1 ? 'color: black;font-size:15px' : 'font-size:15px;' " > {{ item.title }} </v-breadcrumbs-item> <span v-if="index < items.length - 1" class="breadcrumb-divider" >/</span > </template> </v-breadcrumbs> --> <v-breadcrumbs divider="/" style="padding-top: 0"> <template v-for="(item, index) in items" :key="index"> <v-breadcrumbs-item :disabled="item.disabled" :href="item.href" :class="{ 'breadcrumb-disabled': item.disabled, 'breadcrumb-active': !item.disabled, }" style="font-size: 14px" > {{ item.title }} </v-breadcrumbs-item> <!-- 添加分隔符,排除最后一个 item --> <span v-if="index < items.length - 1" class="breadcrumb-divider" style="color: gray" >/</span > </template> </v-breadcrumbs> </div> <v-row class="mb-16 ma-0"> <v-col cols="12" sm="5" class="carousel-container"> <v-carousel class="tw-float-left tw-sticky tw-top-[16px]" height="450" v-model="slide" hide-delimiter-background style="top: 16px" > <v-carousel-item cover v-for="(slide, i) in info?.productimageliststore" :src="slide.url" :key="i" :alt="info.name" > </v-carousel-item> </v-carousel> </v-col> <v-col cols="12" sm="7" class="table-container"> <!-- <v-row class="bg-white mb-sm-10 text-h4 font-weight-medium"> <v-col>{{ info.name }}</v-col> </v-row> --> <h1 class="tw-m-[12px] tw-mb-[36px]">{{ info.name }}</h1> <div class="tw-flex tw-flex-wrap"> <div class="tw-w-1/2 tw-mb-[12px]"> <span class="tw-leading-[10px] tw-m-[12px]"> Brand:{{ info.brandName }} </span> </div> <div class="tw-w-1/2 tw-mb-[12px]"> <span class="tw-leading-[10px] tw-m-[12px]" >Product Model:{{ info.model }}</span > </div> <div class="tw-w-1/2 tw-mb-[12px]" v-if="info.basename1"> <span class="tw-leading-[10px] tw-m-[12px]" >{{ info.basename1 }}:{{ info.basecore1 }}</span > </div> <div class="tw-w-1/2 tw-mb-[12px]" v-if="info.basename2"> <span class="tw-leading-[10px] tw-m-[12px]" >{{ info.basename2 }}:{{ info.basecore2 }}</span > </div> <div class="tw-w-1/2 tw-mb-[12px]" v-if="info.basename3"> <span class="tw-leading-[10px] tw-m-[12px]" >{{ info.basename3 }}:{{ info.basecore3 }}</span > </div> </div> <div class="tw-flex tw-flex-wrap" v-if=" info.productAttributeList && info.productAttributeList.length > 0 " > <div v-for="(attribute, index) in info.productAttributeList" :key="index" class="tw-w-1/2 tw-mb-[12px]" > <span class="tw-leading-normal tw-m-0 tw-block tw-max-w-full tw-break-words tw-ml-[12px]" >{{ attribute.name }}:{{ attribute.value }}</span > </div> </div> <!-- <v-table density="comfortable" class="table1 tw-mt-[32px]" v-if="info.ticketTypes?.length" > --> <v-table density="comfortable" class="table1 tw-mt-[32px] tw-overflow-x-auto" v-if="info.ticketTypes?.length" > <thead> <tr class="bg-grey-lighten-3"> <th class="text-left headerBorder text-grey-darken-1"> Product Name / Code </th> <th class="text-left headerBorder text-grey-darken-1"> Specification and model </th> <th v-if="info.priceShow !== undefined && info.priceShow" class="text-left headerBorder text-grey-darken-1" > Price </th> <th class="text-left headerBorder text-grey-darken-1">Actions</th> </tr> </thead> <tbody> <tr class="tr" v-for="item in info.ticketTypes || []" :key="item.rank" > <td class="td text-grey-darken-4 font-weight-medium"> {{ item.rank }} </td> <td class="td text-grey-darken-4 font-weight-medium"> {{ item.typeName }} </td> <td v-if="item.priceShow" class="td"> <div style="color: #df3931"> {{ item.price + " " + item.priceUnit }} </div> <s style="font-size: 13px; color: #757575">{{ item.originPrice + " " + item.priceUnit }}</s> </td> <td class="td"> <v-btn size="small" color="blue-darken-1" @click="router.push('/contact')" > <!-- Quotation Inquiry --> Quote </v-btn> </td> </tr> </tbody> </v-table> <!-- <v-dialog v-model="dialog" activator="parent" width="auto"> <v-card> Contact us Email: contact@canrd.com QQ: 3003597584 / 2902385824 </v-card> </v-dialog> --> </v-col> </v-row> <v-tabs class="tabs" v-model="tabRecomHot" style="margin-top: 25px" color="white" bg-color="#eeeeee" slider-color="blue-lighten-1" selected-class="active" v-if="recommendImagesHot[0] !== null" > <v-tab :value="1">Best Sellers</v-tab> <!-- <v-tab :value="3">商品百科</v-tab> --> </v-tabs> <div id="image-container" v-if="recommendImagesHot[0] !== null"> <div class="recommend-left-box"> <v-img src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/76c987e13a334be481a346c19c2284f3qy4tjnxps7.png" alt="往左移" class="recommend-img-left" @click="toggleRowLeft" /> </div> <div class="image-row" id="row1"> <!-- <img v-for="(imageObj, index) in recommendImages.slice(0, 5)" :key="'row1-' + index" :src="imageObj[0]?.url" :alt="'Image ' + (index + 1)" style="margin: 0 5px; width: 200px; height: 200px" /> --> <div v-for="(imageObj, index) in recommendImagesHot" :key="'row1-' + index" class="imageTotal" > <a v-if="imageObj" :href="imageObj[0]?.productUrl" target="_blank"> <img :src="imageObj[0]?.url" :alt="'Image ' + (index + 1)" class="item-imgHot" /> <span class="image-name"> {{ imageObj[0]?.name }} </span> </a> <div v-else style="width: 200px; height: 200px"></div> </div> </div> <div class="recommend-right-box"> <v-img src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/b5daa0a8f2f140f5b406e984c730a453iznzlekysg.png" alt="往右移" class="recommend-img-right" @click="toggleRowRight" /> </div> </div> <div style="display: flex; width: 100%; box-sizing: border-box"> <div class="tw-pb-[64px]" style=" width: 70%; margin-right: 10px; display: flex; flex-direction: column; flex-wrap: wrap; overflow: auto; " > <v-tabs class="tabs" v-model="tab" color="white" bg-color="#eeeeee" slider-color="blue-lighten-1" selected-class="active" style="width: 100%" > <v-tab :value="1">Product Details</v-tab> <v-tab :value="2" v-if="info.productAttributeList" >Specification</v-tab > <!-- <v-tab :value="3">商品百科</v-tab> --> </v-tabs> <v-window v-model="tab" class="tw-p-[24px]" style=" min-height: 500px; height: auto; overflow-wrap: break-word; word-wrap: break-word; white-space: pre-wrap; " > <v-window-item key="1" :value="1"> <!-- 修改位置 1: 使用 clearSpanStyle 方法清理 info.advantage --> <div v-if="info.advantage" class="tw-mb-[24px]"> <!-- <div class="text-h6">Advantage</div> <v-divider class="tw-mb-[12px]"></v-divider> --> <div v-html="clearSpanStyle(info.advantage)"></div> </div> <!-- 修改位置 2: 使用 clearSpanStyle 方法清理 info.physicalproperty --> <div v-if="info.physicalproperty" class="tw-mb-[24px]"> <!-- <div class="text-h6">Physical Property</div> <v-divider class="tw-mb-[12px] html-content"></v-divider> --> <div v-html="clearSpanStyle(info.physicalproperty)"></div> </div> <!-- 修改位置 3: 使用 clearSpanStyle 方法清理 info.storage --> <div v-if="info.storage" class="tw-mb-[24px]"> <!-- <div class="text-h6">Storage</div> <v-divider class="tw-mb-[12px]"></v-divider> --> <div v-html="clearSpanStyle(info.storage)"></div> </div> <!-- 修改位置 4: 使用 clearSpanStyle 方法清理 info.introduction --> <div v-if="info.introduction" class="tw-mb-[24px]"> <!-- <div class="text-h6">Introduction</div> <v-divider class="tw-mb-[12px]"></v-divider> --> <div v-html="clearSpanStyle(info.introduction)"></div> </div> <!-- 修改位置 5: 使用 clearSpanStyle 方法清理 info.description --> <div v-if="info.description" class="tw-mb-[24px]"> <!-- <div class="text-h6">Description</div> <v-divider class="tw-mb-[12px]"></v-divider> --> <div v-html="clearSpanStyle(info.description)"></div> </div> </v-window-item> <!-- <div v-if="info.advantage" class="tw-mb-[24px]"> <div class="text-h6">Advantage</div> <v-divider class="tw-mb-[12px]"></v-divider> <div v-html="info.advantage"></div> </div> <div v-if="info.physicalproperty" class="tw-mb-[24px]"> <div class="text-h6">Physical Property</div> <v-divider class="tw-mb-[12px] html-content"></v-divider> <div v-html="info.physicalproperty" style=" overflow-wrap: break-word; word-wrap: break-word; white-space: pre-wrap; line-height: 1.5; " ></div> </div> <div v-if="info.storage" class="tw-mb-[24px]"> <div class="text-h6">Storage</div> <v-divider class="tw-mb-[12px]"></v-divider> <div v-html="info.storage"></div> </div> <div v-if="info.introduction" class="tw-mb-[24px]"> <div class="text-h6">Introduction</div> <v-divider class="tw-mb-[12px]"></v-divider> <div v-html="info.introduction"></div> </div> <div v-if="info.description" class="tw-mb-[24px]"> <div class="text-h6">Description</div> <v-divider class="tw-mb-[12px]"></v-divider> <div v-html="info.description"></div> </div> </v-window-item> --> <v-window-item key="2" :value="2"> <v-table density="compact" class="table2"> <tbody> <tr class="tr" v-for="item in info.productAttributeList || []" :key="item.name" > <td class="td tw-w-[400px]">{{ item.name }}</td> <td class="td">{{ item.value }}</td> </tr> </tbody> </v-table> </v-window-item> <!-- <v-window-item key="3" :value="3"> 2 </v-window-item> --> </v-window> </div> <div style="width: 30%"> <v-tabs v-model="tabPeriodical" color="white" bg-color="#eeeeee" slider-color="blue-lighten-1" selected-class="active" grow > <v-tab value="one">Product-related Journals</v-tab> </v-tabs> <v-list> <v-list-item v-for="item in info.journals" :key="item.id" @click="navigateToUrl(item.link)" @mouseenter="hoveredItem = item.id" @mouseleave="hoveredItem = null" > <v-list-item-title> <span :class="['title', { 'full-title': hoveredItem === item.id }]" > {{ item.title }} </span> </v-list-item-title> </v-list-item> </v-list> </div> </div> <v-tabs class="tabs" v-model="tabRecom" color="white" bg-color="#eeeeee" slider-color="blue-lighten-1" selected-class="active" v-if="recommendImages[0] !== null" > <v-tab :value="1">Related Products</v-tab> <!-- <v-tab :value="3">商品百科</v-tab> --> </v-tabs> <div id="image-container" v-if="recommendImages[0] !== null"> <div class="recommend-left-box"> <v-img src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/76c987e13a334be481a346c19c2284f3qy4tjnxps7.png" alt="往左移" class="recommend-img-left" @click="toggleRow" /> </div> <div v-if="currentIndex === 0" class="image-row" id="row1"> <!-- <img v-for="(imageObj, index) in recommendImages.slice(0, 5)" :key="'row1-' + index" :src="imageObj[0]?.url" :alt="'Image ' + (index + 1)" style="margin: 0 5px; width: 200px; height: 200px" /> --> <div v-for="(imageObj, index) in recommendImages.slice(0, 5)" :key="'row1-' + index" class="imageTotal" > <a v-if="imageObj" :href="imageObj[0]?.productUrl" target="_blank"> <img :src="imageObj[0]?.url" :alt="'Image ' + (index + 1)" class="item-imgHot" /> <span class="image-name"> {{ imageObj[0]?.name }} </span> </a> <div v-else style="width: 200px; height: 200px"></div> </div> </div> <div v-else class="image-row" id="row2"> <!-- <img v-for="(imageObj, index) in recommendImages.slice(5, 10)" :key="'row2-' + index" :src="imageObj[0]?.url" :alt="'Image ' + (index + 6)" style="margin: 0 5px; width: 200px; height: 200px" /> --> <div v-for="(imageObj, index) in recommendImages.slice(5, 10)" :key="'row2-' + index" class="imageTotal" > <a v-if="imageObj" :href="imageObj[0]?.productUrl" target="_blank"> <img :src="imageObj[0]?.url" :alt="'Image ' + (index + 6)" class="item-imgHot" /> <span class="image-name"> {{ imageObj[0]?.name }} </span> </a> <div v-else style="width: 200px; height: 200px; margin-right: 10px" ></div> </div> </div> <div class="recommend-right-box"> <v-img src="https://m-canrd.oss-cn-shenzhen.aliyuncs.com/crmebimage/public/maintain/2024/09/14/b5daa0a8f2f140f5b406e984c730a453iznzlekysg.png" alt="往右移" class="recommend-img-right" @click="toggleRow" /> </div> </div> <div class="social-share-container"> <SocialShare network="facebook" :styled="true" :label="true" :title="info.name" :url="currentUrl" style="color: #1e88e5; width: 140px" /> <SocialShare network="twitter" :styled="true" :label="true" :title="info.name" :url="currentUrl" style="color: #1e88e5; width: 140px" /> <SocialShare network="linkedin" :styled="true" :label="true" :title="info.name" :url="currentUrl" style="color: #1e88e5; width: 140px" /> </div> </v-container> </template> <script setup lang="ts"> import type { Product, ProductImage } from "~/type"; import { defineProps, onMounted, ref } from "vue"; import { useDialogStore } from "~/stores/dialog"; import { useRouter, useRoute } from "vue-router"; import { useRouteQuery } from "@/stores/route_query"; const recommendList = ref(); const recommendImages = ref(); const selectedItem = ref(); const tabRecom = ref(0); const tabRecommend = ref(0); const tabPeriodical = ref(0); const route = useRoute(); const router = useRouter(); const routeQuery = useRouteQuery(); const dialogStore = useDialogStore(); const href1 = ref("/products"); const href2 = ref("/products"); const idHref = ref("/products"); const hoveredItem = ref(null); const productStore = useProductListStore(); const maxPage = ref(1); const tabRecomHot = ref(); const recommendListHot = ref(); const recommendImagesHot = ref(); const currentIndexHot = ref(1); const currentUrl = ref("https://www.canrud.com/products"); // 定义单个 item 的接口 interface BreadcrumbItem { title: string; // 标题 disabled: boolean; // 是否禁用 href: string; // 链接地址 } // 示例数据 const items = ref<BreadcrumbItem[]>([ { title: "Products", disabled: false, href: "https://www.canrud.com/products", }, { title: "CATEGORY", disabled: false, href: href1.value, }, { title: "Not specified", disabled: false, href: href2.value, }, { title: "Not specified", disabled: false, href: "/products", }, ]); const props = defineProps<{ info: Product; }>(); const info = props.info; let { data: resData } = await useAsyncData( "list", () => $fetch("/shop/product/list", { method: "GET", params: { pageNo: 1, pageSize: 20, ids: info.relatedProductIds, }, }), { server: true, // 仅在服务器端获取数据 } ); const loadHotProducts = async () => { let { data: hotProducts } = await useAsyncData( "hotProducts", () => $fetch("/shop/product/hotProducts", { method: "GET", params: { pageNo: currentIndexHot.value, pageSize: 5, }, }), { server: true, // 仅在服务器端获取数据 } ); recommendListHot.value = hotProducts.value.data.records; maxPage.value = hotProducts.value.data.pages; // recommendImages.value = recommendList.value.slice(0, 10).map((item) => { recommendImagesHot.value = Array.from({ length: 5 }).map((_, index) => { const item = recommendListHot.value[index]; if (!item) { return null; } // 检查 productimageliststore 是否为字符串格式,如果是,则尝试解析 if (typeof item.productimageliststore === "string") { try { item.productimageliststore = JSON.parse(item.productimageliststore); } catch (error) { item.productimageliststore = []; // 解析失败时,设置为空数组 } } const ree = (item.productimageliststore = item?.productimageliststore.map( (productItem: ProductImage) => ({ ...productItem, // url: `http://112.74.45.244:8100/api/show/image?fileKey=${item.fileKey}`, url: `https://www.canrud.com/api/show/image?fileKey=${productItem.fileKey}&psize=p256`, name: item.name, productUrl: `https://www.canrud.com/products/detail/${item.id}`, }) )); return ree; }); }; const clearSpanStyle = (htmlContent) => { if (!htmlContent) return ""; // 检查是否为空 // 创建一个 DOM 解析器 const parser = new DOMParser(); const doc = parser.parseFromString(htmlContent, "text/html"); // 清理 span 的 style 属性 const spans = doc.querySelectorAll("span"); spans.forEach((span) => { span?.removeAttribute("style"); // 清空 style 属性 }); // const imgs = doc.querySelectorAll("img"); // imgs.forEach((img) => { // const style = img.getAttribute("style") || ""; // 获取现有 style // if (!style.includes("width: 100%")) { // img.setAttribute("style", `${style} width: 100%; height: auto;`.trim()); // 添加 width: 100% 和 height: auto // } // }); const imgs = doc.querySelectorAll("img"); imgs.forEach((img) => { // 去除 img 标签内的 width 和 height 属性,如果存在的话 if (img.hasAttribute("width")) { img.removeAttribute("width"); } if (img.hasAttribute("height")) { img.removeAttribute("height"); } // 获取现有的 style 属性,如果存在的话 let style = img.getAttribute("style") || ""; // 如果 style 中有 width 和 height,移除它们 style = style .replace(/width\s*:\s*[^;]+;?/gi, "") .replace(/height\s*:\s*[^;]+;?/gi, ""); // 添加 width: 100% 和 height: auto 样式 img.setAttribute("style", `${style} width: 100%; height: auto;`.trim()); }); // 返回处理后的 HTML return doc.body.innerHTML; }; let intervalId: any; const toggleRowLeft = () => { if (currentIndexHot.value !== 1) { currentIndexHot.value--; } else if (currentIndexHot.value == 1) { currentIndexHot.value = maxPage.value; } startTimer(); }; const toggleRowRight = () => { if (currentIndexHot.value < maxPage.value) { currentIndexHot.value++; } else if (currentIndexHot.value == maxPage.value) { currentIndexHot.value = 1; } startTimer(); }; const startTimer = () => { // 清除已有计时器,防止重复 clearInterval(intervalId); intervalId = setInterval(() => { toggleRowRight(); }, 5000); // 每6秒调用一次 }; onMounted(() => { startTimer(); }); watch(currentIndexHot, (newIndex) => { loadHotProducts(); // Call loadHotProducts when currentIndex changes }); // Initial load of hot products await loadHotProducts(); // Load hot products the first time watchEffect(() => { currentUrl.value = "https://www.canrud.com/products/detail/" + info.id; if (info?.productCrumbsVO?.category1 && productStore.keyword) { items.value[1].title = info.productCrumbsVO.category1; items.value[1].href = "https://www.canrud.com/products?categories=" + info.productCrumbsVO.category1; href1.value = "https://www.canrud.com/products?categories=" + info.productCrumbsVO.category1; if (info?.productCrumbsVO?.category2) { items.value[2].title = info.productCrumbsVO.category2; href2.value = href1.value + "," + info.productCrumbsVO.category2; items.value[2].href = href1.value + "," + info.productCrumbsVO.category2; } if (info?.productCrumbsVO?.function) { // items.value.push({ // title: info.productCrumbsVO.function, // disabled: false, // href: href2.value + "&function=" + info.productCrumbsVO.function, // }); items.value[3].title = info.productCrumbsVO.function; items.value[3].href = href2.value + "&function=" + info.productCrumbsVO.function; } } else if (routeQuery.categories) { if (!routeQuery.categories.includes("Energy materials")) { routeQuery.updateFunction("Not specified"); } const categories = routeQuery.categories.split(","); const mainCategory = categories[0].trim(); // 取第一个值 const subCategoryName = ref( categories[1] ? categories[1].trim() : "Not specified" ); // 取第二个值(如果存在) if (subCategoryName.value == "Accessories & fixtures") { subCategoryName.value = encodeURIComponent("Accessories & fixtures"); items.value[2].title = "Accessories & fixtures"; } else { items.value[2].title = subCategoryName.value; } items.value[1].title = mainCategory; items.value[1].href = "https://www.canrud.com/products?categories=" + mainCategory; href1.value = "https://www.canrud.com/products?categories=" + mainCategory; // items.value[1].title = subCategoryName.value; href2.value = href1.value + "," + subCategoryName.value; items.value[2].href = href1.value + "," + subCategoryName.value; if (routeQuery?.selectedFunction) { // items.value.push({ // title: routeQuery.selectedFunction, // disabled: false, // href: href2.value + "&function=" + routeQuery.selectedFunction, // }); items.value[3].title = routeQuery.selectedFunction; items.value[3].href = href2.value + "&function=" + routeQuery.selectedFunction; // routeQuery.updateFunction(null); } } else if (info?.productCrumbsVO?.category1) { items.value[1].title = info.productCrumbsVO.category1; items.value[1].href = "https://www.canrud.com/products?categories=" + info.productCrumbsVO.category1; href1.value = "https://www.canrud.com/products?categories=" + info.productCrumbsVO.category1; if (info?.productCrumbsVO?.category2) { items.value[2].title = info.productCrumbsVO.category2; href2.value = href1.value + "," + info.productCrumbsVO.category2; items.value[2].href = href1.value + "," + info.productCrumbsVO.category2; } if (info?.productCrumbsVO?.function) { // items.value.push({ // title: info.productCrumbsVO.function, // disabled: false, // href: href2.value + "&function=" + info.productCrumbsVO.function, // }); items.value[3].title = info.productCrumbsVO.function; items.value[3].href = href2.value + "&function=" + info.productCrumbsVO.function; } } recommendList.value = resData.value.data.records; // recommendImages.value = recommendList.value.slice(0, 10).map((item) => { recommendImages.value = Array.from({ length: 10 }).map((_, index) => { const item = recommendList.value[index]; if (!item) { return null; } // 检查 productimageliststore 是否为字符串格式,如果是,则尝试解析 if (typeof item.productimageliststore === "string") { try { item.productimageliststore = JSON.parse(item.productimageliststore); } catch (error) { item.productimageliststore = []; // 解析失败时,设置为空数组 } } const ree = (item.productimageliststore = item?.productimageliststore.map( (productItem: ProductImage) => ({ ...productItem, // url: `http://112.74.45.244:8100/api/show/image?fileKey=${item.fileKey}`, url: `https://www.canrud.com/api/show/image?fileKey=${productItem.fileKey}&psize=p256`, name: item.name, productUrl: `https://www.canrud.com/products/detail/${item.id}`, }) )); return ree; }); }); // onMounted(() => { // dialogStore.updateDialog(true) // }) const currentIndex = ref(0); const navigateToUrl = (url) => { window.open(url); // 在新标签页中打开链接 }; const toggleRow = () => { currentIndex.value = currentIndex.value === 0 ? 1 : 0; }; const tab = ref(0); const slide = ref(0); </script> <style lang="scss" scoped> .headerBorder { border-top: 3px solid #1f88e5 !important; } @media screen and (min-width: 1537px) { .tabs { border-bottom: 2px solid #1f88e5; margin: 0px auto 20px; width: 100%; } } @media screen and (max-width: 1536px) and (min-width: 1281px) { .tabs { border-bottom: 2px solid #1f88e5; margin: 0px auto 40px; width: 100%; } } @media screen and (max-width: 1280px) { .tabs { border-bottom: 2px solid #1f88e5; margin: 0px auto 40px; width: 100%; } } // .tabs { // border-bottom: 2px solid #1f88e5; // } .active { background-color: #1086e8; } .td, th { border: 1px solid #dcdcdc; border-right: 0px; border-bottom: 0px !important; height: 50px !important; &:last-child { border: 1px solid #dcdcdc; } } .tr:last-child { .td { border-bottom: 1px solid #dcdcdc !important; } } .tw-sticky { position: sticky; } .carousel-container { position: relative; } .table-container { overflow-x: auto; /* 防止表格超出页面宽度 */ } .table1 { width: 100%; min-width: 600px; /* 设置表格最小宽度 */ } .tr { border-bottom: 1px solid #e0e0e0; /* 表格行样式 */ } .headerBorder { border-bottom: 2px solid #ccc; /* 表头边框 */ } .text-grey-darken-4 { color: #333; /* 表格文字颜色 */ } .breadcrumb-disabled { color: black; pointer-events: none; /* 禁用点击 */ text-decoration: none; /* 移除链接样式 */ } .breadcrumb-active { color: #1e88e5; } @media screen and (min-width: 1537px) { #image-container { display: flex; align-items: center; justify-content: center; height: 320px; margin: 10px auto 80px; width: 100%; } } @media screen and (max-width: 1536px) and (min-width: 1281px) { #image-container { display: flex; align-items: center; justify-content: center; height: 320px; margin: 10px auto 0px; width: 80%; padding: 0; } } @media screen and (max-width: 1280px) { #image-container { display: flex; align-items: center; justify-content: center; height: 320px; margin: 10px auto 0px; width: 80%; padding: 0; } } .image-row { display: flex; height: 245px; } @media screen and (min-width: 1537px) { .imageTotal { display: inline-block; margin: 0 5px; text-align: center; width: 300px; } } @media screen and (max-width: 1536px) and (min-width: 1281px) { .imageTotal { display: inline-block; margin: 0 5px; text-align: center; width: 200px; } } @media screen and (max-width: 1280px) { .imageTotal { display: inline-block; margin: 0 5px; text-align: center; width: 200px; } } @media screen and (min-width: 1537px) { .image-row img { width: 200px; height: 200px; } } @media screen and (max-width: 1536px) and (min-width: 1281px) { .image-row img { width: 140px; height: 140px; } } @media screen and (max-width: 1280px) { .image-row img { width: 160px; height: 160px; } } @media screen and (min-width: 1537px) { .image-name { display: -webkit-box; /* Enables multi-line text handling */ -webkit-box-orient: vertical; /* Defines the vertical orientation of the box */ -webkit-line-clamp: 3; /* Limits the text to 3 lines */ overflow: hidden; /* Hides the overflowed text */ text-overflow: ellipsis; /* Adds an ellipsis when the text overflows */ margin-top: 5px; font-size: 16px; width: 180px; color: #555; text-align: center; /* Centers the text horizontally */ margin-left: 50px; } } @media screen and (max-width: 1536px) and (min-width: 1281px) { .image-name { display: -webkit-box; /* Enables multi-line text handling */ -webkit-box-orient: vertical; /* Defines the vertical orientation of the box */ -webkit-line-clamp: 3; /* Limits the text to 3 lines */ overflow: hidden; /* Hides the overflowed text */ text-overflow: ellipsis; /* Adds an ellipsis when the text overflows */ margin-top: 5px; font-size: 16px; width: 180px; color: #555; text-align: center; /* Centers the text horizontally */ margin-left: 10px; } } @media screen and (max-width: 1280px) { .image-name { display: -webkit-box; /* Enables multi-line text handling */ -webkit-box-orient: vertical; /* Defines the vertical orientation of the box */ -webkit-line-clamp: 3; /* Limits the text to 3 lines */ overflow: hidden; /* Hides the overflowed text */ text-overflow: ellipsis; /* Adds an ellipsis when the text overflows */ margin-top: 5px; font-size: 16px; width: 180px; color: #555; text-align: center; /* Centers the text horizontally */ margin-left: 20px; } } button .recommendButton { margin: 0 0px; cursor: pointer; } .recommend-left-box { } .recommend-img-left { width: 26px; height: 27px; margin-right: 30px; margin-bottom: 50px; } .recommend-img-left:hover { cursor: pointer; } .recommend-right-box { } .recommend-img-right { width: 26px; height: 27px; margin-left: 30px; margin-bottom: 50px; } .recommend-img-right:hover { cursor: pointer; } .social-share-container { display: flex; flex-direction: row; /* 父容器横向排列 */ gap: 1rem; /* 设置每个分享项之间的间距 */ margin-top: 40px; } .social-share-item { display: flex; flex-direction: row; /* 每个分享项横向排列 */ align-items: center; /* 垂直居中对齐 */ gap: 0.5rem; /* 标题与按钮之间的间距 */ } .social-share-title { font-size: 1rem; font-weight: bold; } .title { font-size: 15px; /* 设置字体大小为24px */ color: black; /* 设置字体颜色为黑色 */ display: -webkit-box; /* 使用盒模型显示多行文本 */ -webkit-line-clamp: 2; /* 限制为两行 */ -webkit-box-orient: vertical; /* 盒子方向为垂直 */ overflow: hidden; /* 超过部分隐藏 */ transition: max-height 0.3s ease; /* 过渡效果 */ } .full-title { display: block; /* 当悬浮时显示为块级元素 */ color: #1e88e5; white-space: normal; /* 允许换行 */ overflow: visible; /* 显示全部内容 */ } </style>