fix(frontend): MkFolderのアニメーションにフォールバックを追加 (#15937)

* fix(frontend): Chrome系以外のブラウザでMkFolderがアニメーションしない問題を修正

* fix

* Update Changelog

* fix
This commit is contained in:
かっこかり 2025-05-04 14:06:43 +09:00 committed by GitHub
parent 8dbd8ff4cf
commit 0884605b62
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 54 additions and 3 deletions

View File

@ -7,6 +7,7 @@
- Feat: マウスでもタイムラインを引っ張って更新できるように - Feat: マウスでもタイムラインを引っ張って更新できるように
- アクセシビリティ設定からオフにすることもできます - アクセシビリティ設定からオフにすることもできます
- Enhance: タイムラインのパフォーマンスを向上 - Enhance: タイムラインのパフォーマンスを向上
- Fix: 一部のブラウザでアコーディオンメニューのアニメーションが動作しない問題を修正
### Server ### Server
- Enhance: 凍結されたユーザのノートが各種タイムラインで表示されないように `#15775` - Enhance: 凍結されたユーザのノートが各種タイムラインで表示されないように `#15775`

View File

@ -31,6 +31,10 @@ SPDX-License-Identifier: AGPL-3.0-only
:leaveActiveClass="prefer.s.animation ? $style.transition_toggle_leaveActive : ''" :leaveActiveClass="prefer.s.animation ? $style.transition_toggle_leaveActive : ''"
:enterFromClass="prefer.s.animation ? $style.transition_toggle_enterFrom : ''" :enterFromClass="prefer.s.animation ? $style.transition_toggle_enterFrom : ''"
:leaveToClass="prefer.s.animation ? $style.transition_toggle_leaveTo : ''" :leaveToClass="prefer.s.animation ? $style.transition_toggle_leaveTo : ''"
@enter="enter"
@afterEnter="afterEnter"
@leave="leave"
@afterLeave="afterLeave"
> >
<KeepAlive> <KeepAlive>
<div v-show="opened"> <div v-show="opened">
@ -86,6 +90,42 @@ const bgSame = ref(false);
const opened = ref(props.defaultOpen); const opened = ref(props.defaultOpen);
const openedAtLeastOnce = ref(props.defaultOpen); const openedAtLeastOnce = ref(props.defaultOpen);
//#region interpolate-sizeTODO:
function enter(el: Element) {
if (CSS.supports('interpolate-size', 'allow-keywords')) return;
if (!(el instanceof HTMLElement)) return;
const elementHeight = el.getBoundingClientRect().height;
el.style.height = '0';
el.offsetHeight; // reflow
el.style.height = `${Math.min(elementHeight, props.maxHeight ?? Infinity)}px`;
}
function afterEnter(el: Element) {
if (CSS.supports('interpolate-size', 'allow-keywords')) return;
if (!(el instanceof HTMLElement)) return;
el.style.height = '';
}
function leave(el: Element) {
if (CSS.supports('interpolate-size', 'allow-keywords')) return;
if (!(el instanceof HTMLElement)) return;
const elementHeight = el.getBoundingClientRect().height;
el.style.height = `${elementHeight}px`;
el.offsetHeight; // reflow
el.style.height = '0';
}
function afterLeave(el: Element) {
if (CSS.supports('interpolate-size', 'allow-keywords')) return;
if (!(el instanceof HTMLElement)) return;
el.style.height = '';
}
//#endregion
function toggle() { function toggle() {
if (!opened.value) { if (!opened.value) {
openedAtLeastOnce.value = true; openedAtLeastOnce.value = true;
@ -108,17 +148,27 @@ onMounted(() => {
.transition_toggle_enterActive, .transition_toggle_enterActive,
.transition_toggle_leaveActive { .transition_toggle_leaveActive {
overflow-y: hidden; // margin clip 使 overflow-y: hidden; // margin clip 使
transition: opacity 0.3s, height 0.3s !important; transition: opacity 0.3s, height 0.3s;
} }
@supports (interpolate-size: allow-keywords) {
.transition_toggle_enterFrom,
.transition_toggle_leaveTo {
height: 0;
}
.root {
interpolate-size: allow-keywords; // heighttransition
}
}
.transition_toggle_enterFrom, .transition_toggle_enterFrom,
.transition_toggle_leaveTo { .transition_toggle_leaveTo {
opacity: 0; opacity: 0;
height: 0;
} }
.root { .root {
display: block; display: block;
interpolate-size: allow-keywords; // heighttransition
} }
.header { .header {