前言
在之前浏览到月空人的博客的时候,看到了有个播客页面,便想着如何在自己的博客上面,也就有了今天这篇文章了。
添加Vue页面
在 BlogRoot:/app/pages中添加vue文件(这里没有太大要求,只要自己找得到即可):
<script lang="ts" setup>
import { ref, onMounted } from 'vue';
import { siteLinkItems } from '../sitelink'
const layoutStore = useLayoutStore()
layoutStore.setAside(['blog-stats', 'blog-tech', 'blog-log'])
const activeTab = ref(0); // 默认激活第一个标签页
</script>
<template>
<div class="sitelinkPage">
<div class="feed-label">
<h2> 站点详情 </h2>
</div>
<div class="tabs-container">
<div class="tabs">
<button v-for="(tab, index) in siteLinkItems" :key="tab.name" @click="activeTab = index" :class="{ 'active': activeTab === index }">
{{ tab.name }}
</button>
</div>
<span class="count-text" v-for="(count, index) in siteLinkItems[activeTab]" :key="index">
{{ count.name }}{{ count?.itemnumber ?? 0 }}个站点
</span>
<div class="sitelink-list">
<div class="sitelink-item" v-for="(site, index) in siteLinkItems[activeTab].Item" :key="index">
<img width="150" height="150" alt="Syntax" class="cover" :src="site.image">
<main>
<header class="header">
<div class="title">
<a :href="site.link" rel="noopener noreferrer" target="_blank">
{{ site.name }}
</a>
<span class="iconify i-ph:link-duotone" aria-hidden="true" style="font-size: 0.8em;"></span>
</div>
</header>
<section>
<div class="badges" v-for="service in site.service" :key="service.name">
<a :href="service.link" rel="noopener noreferrer" target="_blank" class="badge badge-img">
<img :alt="service.name" class="badge-icon" :src="service.image">
<span class="badge-text">
{{ service.name }}
</span>
</a>
</div>
<p class="description">
{{ site.desc }}
</p>
</section>
<footer>
<h5 class="rss">
<span class="iconify i-ph:rss-fill" aria-hidden="true"></span>
<a :href="site.link" rel="noopener noreferrer" target="_blank">
{{ site.link }}
</a>
</h5>
</footer>
</main>
</div>
</div>
</div>
</div>
</template>
<style lang="css" scoped>
/* 页面宽度 */
.sitelinkPage {
margin-left: 1rem;
margin-right: 1rem;
}
/* tab组件样式(从原来的组件样式照搬) */
.float-in-leave-active {
position: revert
}
.center {
margin-inline:auto;max-width: 100%
}
.center,.tabs {
width: -moz-fit-content;
width: fit-content
}
.tabs {
display: flex;
flex-wrap: wrap;
font-size: .9em;
gap: .5em;
justify-content: center;
line-height: 1.4;
margin: 0 auto
}
.tabs,button {
position: relative
}
button {
border-radius: .4em;
color: var(--c-text-2);
margin-bottom: .5em;
padding: .3em .5em;
transition: all .2s
}
button:hover {
background-color: var(--c-bg-soft);
color: var(--c-text)
}
button:after,button:before {
border-radius: 1em;
bottom: -.5em;
display: block;
height: 2px;
left: .8em;
pointer-events: none;
position: absolute;
right: .8em
}
button:after {
background-color: var(--c-border);
content: "";
left: -.8em;
right: -.8em
}
button.active {
background-color: var(--ld-bg-card);
box-shadow: 0 1px .5em var(--ld-shadow);
color: var(--c-text)
}
button.active:before {
background-color: var(--c-primary);
content: "";
z-index: 1
}
.tab-content {
padding: .5em 0
}
/* badge组件样式(从原来的组件样式直接照搬) */
.badge {
align-items: baseline;
background-color: var(--c-bg-2);
border: 1px solid var(--c-border);
border-radius: 4px;
display: inline-flex;
font-size: .875em;
height: 1.6em;
line-height: 1.6;
transition: color .2s
}
@supports (color: color-mix(in srgb,transparent,transparent)) {
.badge {
background-color:color-mix(in srgb,currentcolor 5%,transparent);
border-color: color-mix(in srgb,currentcolor 10%,transparent);
color: color-mix(in srgb,currentcolor 80%,transparent)
}
}
.badge[href]:hover {
color: var(--c-text)
}
.badge.badge-round,.badge.badge-round .badge-icon {
border-radius: 1em
}
.badge-img .badge-icon {
align-self: center;
border-radius: 3.5px;
height: 100%
}
.badge-img .badge-text {
margin-left: -.1em
}
.badge-text {
padding: 0 .4em
}
.badge-text:empty {
display: none
}
/* 卡片组件样式 */
.feed-label {
margin: 2rem 1rem -1rem
}
.sitelink-list {
margin: 1rem
}
@media (max-width: 639px) {
.sitelink-list {
padding:1rem
}
.sitelink-item {
display: grid;
gap: 1rem;
grid-template-columns: 1fr;
justify-items: center
}
.sitelink-item main {
font-size: .9em;
line-height: 1.4;
overflow-wrap: break-word
}
}
.sitelink-item {
animation: float-in .2s var(--delay) backwards;
background: var(--c-bg);
background-color: var(--ld-bg-card);
border-radius: .8em;
box-shadow: var(--ld-shadow);
box-shadow: 0 .1em .2em var(--ld-shadow);
display: grid;
gap: 1rem;
grid-template-columns: 150px 1fr;
margin-bottom: 1rem;
padding: 1rem;
transition: all .2s
}
.sitelink-item:hover {
box-shadow: 0 .5em 1em var(--ld-shadow);
transform: translateY(-2px)
}
.sitelink-item main {
display: flex;
flex-direction: column;
justify-content: space-between
}
.sitelink-item main section {
flex: 1
}
.sitelink-item main header {
margin-bottom: .5rem
}
.sitelink-item .title {
align-items: center;
color: var(--c-text);
display: flex;
font-size: 1.2em;
gap: .5rem;
line-height: 1.2;
margin: 0
}
.sitelink-item .cover {
border-radius: .8em;
height: 150px;
width: 150px
}
.sitelink-item .badges {
display: flex;
flex-wrap: wrap;
gap: .5rem;
margin-bottom: .2em;
margin-top: .2em
}
.sitelink-item .description {
color: var(--c-text-2);
margin: .5em 0
}
.sitelink-item footer {
color: var(--c-text-2);
font-size: .9em
}
.sitelink-item footer,.sitelink-item footer .rss {
align-items: center;
display: flex;
gap: .5rem
}
</style>
添加Ts文件
在BlogRoot:/app/中添加 sitelink.ts :
export interface siteTabs {
name: string
itemnumber: string
Item: Item[]
}
export interface Item {
name: string
image: string
link: string
desc: string
service: service[]
}
export interface service {
name: string
image: string
link: string
}
export const siteLinkItems: siteTabs[] = [
{
name: '镜像站点',
itemnumber: '3',
Item: [
{
name: 'EdgeOne镜像',
image: 'https://sourceimage.s3.bitiful.net/myxz.avif',
link: 'https://blog-v3.edgeone.mirrors.myxz.top',
desc: "",
service: [
{
name: 'EdgeOne',
image: '/assets/img/link/service/edgeone.jpg',
link: "https://edgeone.ai/"
}
],
},{
name: "Vercel镜像",
image: "https://sourceimage.s3.bitiful.net/myxz.avif",
link: "https://blog-v3.vercel.mirrors.myxz.top",
desc: "",
service: [
{
name: "Vercel",
image: "/assets/img/link/service/vercel.jpg",
link: "https://vercel.com"
}
]
},{
name: "Netlify镜像",
image: "https://sourceimage.s3.bitiful.net/myxz.avif",
link: "https://blog-v3.netifly.mirrors.myxz.top",
desc: "",
service: [
{
name: "Netlify",
image: "/assets/img/link/service/netlify.jpg",
link: "https://Netlify.com"
}
]
},
]
},
{
name: '服务',
itemnumber: '1',
Item: [
{
name: '说说',
image: 'https://sourceimage.s3.bitiful.net/myxz.avif',
link: 'https://blog-v3.myxz.top',
desc: "",
service: [
{
name: 'EdgeOne',
image: '',
link: ""
}
],
}
]
},
]

评论加载中...