491 lines
9.8 KiB
CSS
491 lines
9.8 KiB
CSS
/**
|
|
* 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);
|
|
}
|
|
}
|
|
|