/* Kole UI Mobile · Sticky 样式 — 对齐移动端规格 §39 吸顶容器:用 CSS 原生 position: sticky(不是 JS 监听滚动 + position: fixed)—— 后者在触屏上会随惯性滚动抖动,且离开文档流后会占位丢失、需要手动补占位元素。 sticky 的贴合位置由 `--kole-m-sticky-offset` 决定(默认等于导航栏高度,业务侧可覆盖), safeArea=true 时再叠加安全区;吸顶后的形态变化由宿主按滚动位置切 is-stuck。 */ .kole-m-sticky { /* 组件级变量:贴合边缘的偏移量(业务侧可覆盖,贴底用法通常覆盖为 0) */ --kole-m-sticky-offset: var(--kole-m-navbar-height); position: sticky; z-index: 100; box-sizing: border-box; display: flex; align-items: center; gap: var(--kole-space-8); min-height: var(--kole-m-touch-target); padding: var(--kole-space-8) var(--kole-m-gutter); background: var(--kole-color-card-bg); color: var(--kole-color-text-title); font-family: var(--kole-font-family); font-size: var(--kole-m-font-size-body); font-weight: 500; line-height: 1.4; } /* 变体 position:贴顶 / 贴底 */ .kole-m-sticky--top { top: var(--kole-m-sticky-offset); } .kole-m-sticky--bottom { bottom: var(--kole-m-sticky-offset); } /* 变体 safeArea=true:偏移叠加刘海 / 底部横条安全区(env() 不可用时安全区为 0px) */ .kole-m-sticky--top.kole-m-sticky--safe { top: calc(var(--kole-m-sticky-offset) + var(--kole-m-safe-top)); } .kole-m-sticky--bottom.kole-m-sticky--safe { bottom: calc(var(--kole-m-sticky-offset) + var(--kole-m-safe-bottom)); } /* 变体 shadow=true:吸顶后才出现的阴影(未吸顶时与内容齐平,不留悬空感) */ .kole-m-sticky--shadow { box-shadow: none; } .kole-m-sticky--shadow.is-stuck { box-shadow: var(--kole-shadow-medium); } /* 状态 is-stuck:已贴合边缘(由宿主按滚动位置切换) */ .kole-m-sticky.is-stuck { border-block-end: 1px solid var(--kole-color-border); } .kole-m-sticky--bottom.is-stuck { border-block-end: 0; border-block-start: 1px solid var(--kole-color-border); } .kole-m-sticky__title { flex: 1 1 auto; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .kole-m-sticky__extra { flex: 0 0 auto; font-size: var(--kole-m-font-size-label); font-weight: 400; color: var(--kole-color-text-secondary); } /* 容器内的动作按钮(可选):原生 button,热区 44px,负外边距吸收不撑高栏体 */ .kole-m-sticky__action { flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box; min-width: var(--kole-m-touch-target); height: var(--kole-m-touch-target); margin-inline-end: calc(-1 * var(--kole-space-12)); padding: 0 var(--kole-space-8); border: 0; border-radius: var(--kole-radius-base); background: none; color: var(--kole-color-brand); font-family: inherit; font-size: var(--kole-m-font-size-label); font-weight: 400; line-height: 1; cursor: pointer; touch-action: manipulation; } .kole-m-sticky__action:active { background: var(--kole-color-brand-bg); } .kole-m-sticky__action:focus-visible { outline: 2px solid var(--kole-color-focus-ring); outline-offset: -2px; } @media (prefers-reduced-motion: reduce) { .kole-m-sticky { transition: none; } }