Files
halo-theme-WarmIsland/src/components/PostCard.astro
T
nxxy335 bcc221c3bd fix: 修复首页卡片字数与 Hero 滚动,移除光感跟随 (v1.1.6)
修复
- 首页文章卡片开启"显示字数"后无效果:该配置项此前只有声明没有实现,现已在文章流卡片接入服务端字数统计(依赖 API 扩展包,未安装时自动隐藏)
- Hero 下滑箭头滚动不到位:Hero 为固定背景(position: fixed),此前箭头额外减去了导航栏高度,导致内容区上方始终露出一段 Hero 渐变;现与滚动吸附逻辑对齐,内容区顶部直接对齐视口顶部
- 鼠标点击特效开启后无效果:特效类型默认值为 off(关闭),开启开关但不选择类型时静默不生效;默认值改为"社会主义核心价值观"

移除
- 移除鼠标光感跟随功能及对应配置项

优化
- 上下篇导航:新增方向箭头与悬停反馈(背景、位移、变色),移动端收紧内边距
- Hero 一言自动刷新改为淡出→换文案→淡入的过渡动画,避免生硬跳变
- README 全面更新:环境要求、插件适配表(新增微信读书与 API 扩展包)、自定义页面模板、功能说明、目录结构与开发注意事项
2026-09-26 12:29:28 +08:00

307 lines
6.5 KiB
Plaintext

---
interface Props {
variant?: "default" | "featured" | "compact";
}
const { variant = "default" } = Astro.props;
---
<a
class:list={["post-card", `post-card--${variant}`]}
th:href="@{${post.status.permalink}}"
>
<div
th:unless="${#strings.isEmpty(post.spec.cover)}"
class="post-card__image-wrap"
>
<img
class="post-card__image"
th:src="${post.spec.cover}"
th:srcset="|${thumbnail.gen(post.spec.cover, 's')} 400w,
${thumbnail.gen(post.spec.cover, 'm')} 800w,
${thumbnail.gen(post.spec.cover, 'l')} 1200w|"
th:alt="${post.spec.title}"
loading="lazy"
decoding="async"
/>
<div class="post-card__overlay"></div>
</div>
<div class="post-card__content">
<div class="post-card__meta">
<time
class="post-card__date"
th:text="${#dates.format(post.spec.publishTime, 'yyyy-MM-dd')}"
></time>
<span
class="post-card__words"
th:if="${theme.config?.home?.home_card_show_wordcount == true and pluginFinder.available('extra-api')}"
th:with="words=${extraApiStatsFinder.getPostWordCount({name: post.metadata.name})}"
th:text="${words > 0 ? words + ' 字' : ''}"
></span>
</div>
<h3 class="post-card__title" th:text="${post.spec.title}"></h3>
<p
th:if="${variant != 'compact'}"
class="post-card__excerpt"
th:text="${post.status.excerpt}"
></p>
<div
th:if="${variant != 'compact' and !#lists.isEmpty(post.tags)}"
class="post-card__tags"
>
<span
th:each="tag : ${post.tags}"
class="post-card__tag"
th:text="${tag.spec.displayName}"
></span>
</div>
</div>
</a>
<style>
.post-card {
display: flex;
align-items: stretch;
gap: var(--space-lg);
background: var(--bg-raised);
border-radius: var(--border-radius-lg);
overflow: hidden;
text-decoration: none;
color: inherit;
box-shadow: var(--shadow-sm);
transition:
transform 400ms var(--ease-out-expo),
box-shadow 400ms var(--ease-out-expo);
}
.post-card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-lg);
}
.post-card__image-wrap {
flex-shrink: 0;
overflow: hidden;
border-radius: var(--border-radius-lg);
}
.post-card__image {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 400ms var(--ease-out-expo);
}
.post-card:hover .post-card__image {
transform: scale(1.03);
}
.post-card__overlay {
display: none;
}
.post-card__content {
display: flex;
flex-direction: column;
gap: var(--space-sm);
padding: var(--space-lg);
min-width: 0;
}
.post-card__date {
font-size: var(--text-xs);
text-transform: uppercase;
letter-spacing: var(--tracking-wider);
color: var(--ink-3);
line-height: var(--leading-none);
}
.post-card__meta {
display: flex;
align-items: center;
gap: 0.6rem;
}
.post-card__words {
font-size: var(--text-xs);
color: var(--ink-3);
line-height: var(--leading-none);
padding-left: 0.6rem;
border-left: 1px solid var(--rule);
}
.post-card__title {
font-family: var(--font-sans);
font-weight: 700;
font-size: clamp(1.1rem, 2vw, 1.5rem);
line-height: var(--leading-tight);
color: var(--ink);
margin: 0;
transition: color 400ms var(--ease-out-expo);
}
.post-card:hover .post-card__title {
color: var(--accent);
}
.post-card__excerpt {
color: var(--ink-2);
font-size: var(--text-sm);
line-height: var(--leading-normal);
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
margin: 0;
}
.post-card__tags {
display: flex;
flex-wrap: wrap;
gap: var(--space-xs);
margin-top: auto;
}
.post-card__tag {
display: inline-flex;
align-items: center;
padding: 0.2em 0.6em;
border-radius: var(--border-radius-sm);
background: var(--bg-raised);
border: 1px solid var(--rule);
font-size: var(--text-xs);
color: var(--ink-2);
line-height: var(--leading-none);
}
.post-card--default {
flex-direction: row;
}
.post-card--default .post-card__image-wrap {
width: 40%;
aspect-ratio: 4 / 3;
}
.post-card--featured {
flex-direction: column;
}
.post-card--featured .post-card__image-wrap {
width: 100%;
aspect-ratio: 16 / 9;
position: relative;
}
.post-card--featured .post-card__overlay {
display: block;
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 50%;
background: linear-gradient(
to top,
var(--glass-bg),
transparent
);
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
pointer-events: none;
}
.post-card--featured .post-card__content {
padding: var(--space-xl);
gap: var(--space-md);
}
.post-card--featured .post-card__title {
font-size: clamp(1.5rem, 3vw, 2rem);
}
.post-card--featured .post-card__excerpt {
-webkit-line-clamp: 3;
}
.post-card--compact {
flex-direction: row;
align-items: center;
background: transparent;
box-shadow: none;
gap: var(--space-md);
}
.post-card--compact:hover {
box-shadow: none;
}
.post-card--compact .post-card__image-wrap {
width: 60px;
height: 60px;
flex-shrink: 0;
border-radius: var(--border-radius-md);
}
.post-card--compact .post-card__image-wrap img {
aspect-ratio: 1 / 1;
}
.post-card--compact .post-card__content {
padding: var(--space-sm) 0;
gap: 0.2rem;
}
.post-card--compact .post-card__title {
font-size: var(--text-md);
}
@media (max-width: 768px) {
.post-card--default {
flex-direction: column;
}
.post-card--default .post-card__image-wrap {
width: 100%;
aspect-ratio: 16 / 9;
}
.post-card__content {
padding: var(--space-md);
}
.post-card__title {
font-size: clamp(1.15rem, 3vw, 1.5rem);
}
.post-card__excerpt {
font-size: var(--text-sm);
-webkit-line-clamp: 3;
}
.post-card--featured .post-card__content {
padding: var(--space-lg);
}
.post-card--featured .post-card__title {
font-size: clamp(1.3rem, 4vw, 1.7rem);
}
}
@media (max-width: 480px) {
.post-card__content {
padding: var(--space-md) var(--space-sm);
}
.post-card__title {
font-size: clamp(1.05rem, 4vw, 1.25rem);
}
.post-card__excerpt {
font-size: var(--text-sm);
-webkit-line-clamp: 2;
}
}
</style>