/** * AKSRT Enhancements — 全局 UI 增强 * * 包含:骨架屏、悬停动效、暗色过渡、滚动感知 * 所有选择器使用 aksrt- 前缀避免冲突 */ @keyframes aksrt-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* ============================================================ * 1. 骨架屏加载动画 * ============================================================ */ .aksrt-skeleton { background: linear-gradient( 90deg, rgba(121, 121, 121, 0.08) 25%, rgba(121, 121, 121, 0.15) 37%, rgba(121, 121, 121, 0.08) 63% ); background-size: 400% 100%; animation: aksrt-skeleton-shimmer 1.5s ease infinite; border-radius: 4px; } .aksrt-skeleton--image { height: 0; padding-bottom: 66.67%; /* 3:2 aspect ratio */ } .aksrt-skeleton--avatar { width: 40px; height: 40px; border-radius: 50%; } .aksrt-skeleton--title { height: 22px; width: 80%; } .aksrt-skeleton--text { height: 16px; width: 100%; } .aksrt-skeleton--text-short { height: 16px; width: 60%; } .aksrt-skeleton--button { height: 36px; width: 100px; border-radius: 8px; } @keyframes aksrt-skeleton-shimmer { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } } /* 骨架屏组合:文章卡片骨架 */ .aksrt-skeleton-card { background: var(--surface-1, #fff); border: 1px solid var(--color-line); border-radius: 12px; overflow: hidden; padding: 0; } .aksrt-skeleton-card .aksrt-skeleton--image { border-radius: 0; } .aksrt-skeleton-card__body { padding: 16px; display: flex; flex-direction: column; gap: 10px; } /* ============================================================ * 2. 悬停交互动效 * ============================================================ */ /* 卡片放大 */ .aksrt-hover-zoom { transition: transform 0.3s ease; } .aksrt-hover-zoom:hover { transform: scale(1.02); } /* 卡片轻微放大 */ .aksrt-hover-zoom-sm { transition: transform 0.3s ease; } .aksrt-hover-zoom-sm:hover { transform: scale(1.02); } /* 悬停显示内容 */ .aksrt-hover-show { position: relative; } .aksrt-hover-show__content { position: absolute; opacity: 0; visibility: hidden; transform: translateY(6px); transition: opacity 0.3s, transform 0.3s, visibility 0.3s; z-index: 10; } .aksrt-hover-show:hover .aksrt-hover-show__content { opacity: 1; visibility: visible; transform: translateY(0); } /* 关闭按钮旋转 */ .aksrt-ic-close { transition: transform 0.3s; cursor: pointer; } .aksrt-ic-close:hover { transform: rotate(270deg); } /* 图片悬停缩放(缩略图容器) */ .aksrt-hover-zoom-img img { transition: transform 0.3s ease; } .aksrt-hover-zoom-img:hover img { transform: scale(1.02); } .aksrt-hover-zoom-img-sm img { transition: transform 0.3s ease; } .aksrt-hover-zoom-img-sm:hover img { transform: scale(1.02); } /* 按钮悬停上浮 */ .aksrt-hover-lift { transition: transform 0.2s ease, box-shadow 0.2s ease; } .aksrt-hover-lift:hover { transform: none; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } /* ============================================================ * 3. 暗色模式过渡 (View Transitions API) * ============================================================ */ ::view-transition-old(root), ::view-transition-new(root) { animation: none; mix-blend-mode: normal; } .dark::view-transition-old(root), body.dark-theme::view-transition-old(root) { z-index: 1; } .dark::view-transition-new(root), body.dark-theme::view-transition-new(root) { z-index: 2147483646; } ::view-transition-old(root) { z-index: 2147483646; } ::view-transition-new(root) { z-index: 1; } /* backdrop-filter 不支持时的降级 */ @supports not ((-webkit-backdrop-filter: blur(20px)) or (backdrop-filter: blur(20px))) { :root { --aksrt-blur-bg: #ffffff; } .dark { --aksrt-blur-bg: var(--surface-1); } } /* ============================================================ * 4. 滚动方向感知 * ============================================================ */ /* 向下滚动时隐藏导航栏 */ body.aksrt-scroll-down .site-nav.nav-scroll-hide { transform: translateY(-100%); transition: transform 0.3s ease; } body.aksrt-scroll-up .site-nav.nav-scroll-hide { transform: translateY(0); transition: transform 0.3s ease; } /* 滚动时隐藏浮动按钮 */ body.aksrt-scrolling .aksrt-floating-right.scrolling-hide { opacity: 0; pointer-events: none; transition: opacity 0.2s; } /* body-scroll 状态类 */ body.aksrt-body-scroll .aksrt-show-on-scroll { opacity: 1; visibility: visible; } .aksrt-show-on-scroll { opacity: 0; visibility: hidden; transition: opacity 0.3s, visibility 0.3s; } /* ============================================================ * 5. 图片灯箱 * ============================================================ */ [data-aksrt-lightbox="1"] img:not(.no-imgbox):not(.no-lightbox), .aksrt-lightbox-trigger img:not(.no-imgbox):not(.no-lightbox), .imgbox-container img:not(.no-imgbox):not(.no-lightbox), .comment-content .box-img { cursor: zoom-in; } .aksrt-lightbox { --imgbox-origin-left: 50vw; --imgbox-origin-top: 50vh; position: fixed; inset: 0; z-index: 100000; display: flex; align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.88); opacity: 0; visibility: hidden; transition: opacity 0.25s ease, visibility 0.25s ease; } .aksrt-lightbox.is-open { opacity: 1; visibility: visible; } .aksrt-lightbox__stage { position: absolute; inset: 64px 72px 82px; display: flex; align-items: center; justify-content: center; overflow: hidden; } .aksrt-lightbox__img { display: block; max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; transform: scale(1); transform-origin: center; transition: transform 0.25s ease, opacity 0.2s ease; cursor: zoom-in; user-select: none; -webkit-user-drag: none; } .aksrt-lightbox.from-origin.is-open .aksrt-lightbox__img { animation: aksrt-lightbox-enter 0.3s ease both; } .aksrt-lightbox.is-zoomed .aksrt-lightbox__img { cursor: zoom-out; } .aksrt-lightbox__toolbar { position: absolute; z-index: 3; top: 14px; right: 14px; display: flex; align-items: center; gap: 8px; } .aksrt-lightbox__tool, .aksrt-lightbox__nav { border: 0; background: rgba(255, 255, 255, 0.14); color: #fff; box-shadow: none; cursor: pointer; transition: background-color 0.2s ease, transform 0.2s ease; } .aksrt-lightbox__tool { display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px; padding: 0; border-radius: 999px; font-size: 16px; } .aksrt-lightbox__tool:hover, .aksrt-lightbox__tool:focus-visible, .aksrt-lightbox__nav:hover, .aksrt-lightbox__nav:focus-visible { background: rgba(255, 255, 255, 0.28); color: #fff; } .aksrt-lightbox__tool:focus-visible, .aksrt-lightbox__nav:focus-visible, .aksrt-lightbox__thumb:focus-visible { outline: 2px solid #fff; outline-offset: 2px; } .aksrt-lightbox__counter { min-width: 48px; color: rgba(255, 255, 255, 0.84); font-size: 14px; text-align: center; } .aksrt-lightbox__nav { position: absolute; z-index: 2; top: 50%; display: inline-flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 999px; font-size: 22px; transform: translateY(-50%); } .aksrt-lightbox__nav--prev { left: 16px; } .aksrt-lightbox__nav--next { right: 16px; } .aksrt-lightbox__caption { position: absolute; z-index: 2; right: 20px; bottom: 18px; left: 20px; color: rgba(255, 255, 255, 0.88); font-size: 14px; line-height: 1.6; text-align: center; pointer-events: none; } .aksrt-lightbox__thumbs { position: absolute; z-index: 3; right: 50%; bottom: 18px; display: flex; gap: 8px; max-width: min(70vw, 760px); padding: 6px; overflow-x: auto; border-radius: 8px; background: rgba(0, 0, 0, 0.38); transform: translateX(50%); scrollbar-width: thin; } .aksrt-lightbox__thumb { flex: 0 0 auto; width: 56px; height: 44px; padding: 0; overflow: hidden; border: 2px solid transparent; border-radius: 5px; background: transparent; opacity: 0.6; cursor: pointer; } .aksrt-lightbox__thumb.is-active { border-color: #fff; opacity: 1; } .aksrt-lightbox__thumb img { display: block; width: 100%; height: 100%; object-fit: cover; } .aksrt-lightbox__thumbs:not([hidden]) ~ .aksrt-lightbox__caption { bottom: 78px; } .aksrt-lightbox [hidden] { display: none !important; } @keyframes aksrt-lightbox-enter { from { transform-origin: var(--imgbox-origin-left) var(--imgbox-origin-top); transform: scale(0.82); opacity: 0; } to { transform-origin: center; transform: scale(1); opacity: 1; } } @media (max-width: 767px) { .aksrt-lightbox__stage { inset: 58px 10px 78px; } .aksrt-lightbox__toolbar { top: 10px; right: 10px; gap: 5px; } .aksrt-lightbox__tool { width: 34px; height: 34px; font-size: 14px; } .aksrt-lightbox__counter { min-width: 36px; font-size: 12px; } .aksrt-lightbox__nav { width: 40px; height: 40px; font-size: 18px; background: rgba(0, 0, 0, 0.34); } .aksrt-lightbox__nav--prev { left: 8px; } .aksrt-lightbox__nav--next { right: 8px; } .aksrt-lightbox__thumbs { max-width: calc(100vw - 20px); } }