- API 路由统一: 移除 /api/h5/,统一 /api/pms/ 入口 - 二进制改名: api-server -> pms-api(与服务名一致) - nginx: 合并 /api/ + /pms/api/ 为 /api/pms/ - 新增 docs/API.md 接口文档 - 后端: CabinetDetail 增加 rssi/pow_fail/address/soc 等字段 - Redis 管道批量读取仓体实时数据(SOC/电压/电流/功率) - DB: 所有 TIMESTAMP 列改为 DATETIME(修复类型不匹配) - 用户管理: 新增创建时间/修改时间列,状态改用 Switch - 角色管理/用户管理: 操作按钮改为图标 - PC 设备详情: 基本信息补全 RSSI/ICCID/电源/地址 - PC 卡片: 通道统计改用 Lucide 图标,颜色统一 - PC 二维码: canvas 渲染,含编号文字,支持右键下载 - H5: 按 uni-app 规范修正导航(navigateTo 替代 reLaunch) - H5: 详情页加返回导航条 - H5: 扫码支持摄像头(jsQR)+ ?id= 参数 - H5: 底部 tabBar 在所有页面常显 - H5: 首页统计改为 6 项(设备/通道/空闲/充电/充满/故障) - H5: 下拉刷新 / 上拉加载 - 产品首页: 添加业务联系 - 文档: 清理过时文件,补充缺失规范章节
3.9 KiB
title, impact, impactDescription, type, tags
| title | impact | impactDescription | type | tags | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| TransitionGroup FLIP Animations Do Not Work With Inline Elements | MEDIUM | Move animations silently fail on inline elements, causing items to jump | gotcha |
|
TransitionGroup FLIP Animations Do Not Work With Inline Elements
Impact: MEDIUM - The FLIP (First, Last, Invert, Play) animation technique that Vue uses for <TransitionGroup> move transitions does not work with elements that have display: inline. The move animation will silently fail, and items will jump to their new positions instead of smoothly transitioning.
This is a CSS limitation, not a Vue bug. CSS transforms (which FLIP uses internally) do not apply to inline elements per the CSS specification.
Task Checklist
- Ensure list items are not
display: inlineelements - Use
display: inline-blockordisplay: blockfor list items - Use flexbox or grid containers which make children block-level
- Check if inherited styles are setting
display: inline
Incorrect - Inline elements break move animations:
<template>
<!-- BROKEN: span elements are inline by default -->
<TransitionGroup name="tag" tag="div" class="tag-container">
<span v-for="tag in tags" :key="tag.id" class="tag">
{{ tag.name }}
</span>
</TransitionGroup>
</template>
<style>
.tag-move {
transition: transform 0.3s ease;
/* This won't work because spans are inline! */
}
</style>
Correct - Use inline-block:
<template>
<TransitionGroup name="tag" tag="div" class="tag-container">
<span v-for="tag in tags" :key="tag.id" class="tag">
{{ tag.name }}
</span>
</TransitionGroup>
</template>
<style>
.tag {
display: inline-block; /* REQUIRED for FLIP animations */
}
.tag-move {
transition: transform 0.3s ease;
}
</style>
Correct - Use flexbox container:
<template>
<TransitionGroup name="tag" tag="div" class="tag-container">
<span v-for="tag in tags" :key="tag.id" class="tag">
{{ tag.name }}
</span>
</TransitionGroup>
</template>
<style>
.tag-container {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
/* Flex children are block-level, FLIP works automatically */
.tag-move {
transition: transform 0.3s ease;
}
</style>
Correct - Use block elements:
<template>
<!-- div elements are block by default -->
<TransitionGroup name="item" tag="div">
<div v-for="item in items" :key="item.id" class="item">
{{ item.name }}
</div>
</TransitionGroup>
</template>
<style>
.item-move {
transition: transform 0.3s ease;
}
</style>
Why Inline Elements Don't Work
Per CSS specifications, the transform property does not apply to inline boxes. Since FLIP animations use CSS transforms to animate element positions:
/* Vue internally applies something like this during move */
.item {
transform: translateX(-50px) translateY(-20px);
/* Then transitions to transform: none */
}
This transform is ignored on inline elements, so no animation occurs.
Elements That Are Inline by Default
Be aware of these common inline elements that need display: inline-block:
<span><a><em>,<strong>,<i>,<b><code>,<kbd><label><button>(inline-block by default, but verify)
Move Animations Also Require Transform Transition
The .move class must have transform in its transition property:
/* CORRECT */
.list-move {
transition: transform 0.3s ease;
}
/* ALSO CORRECT */
.list-move {
transition: all 0.3s ease; /* 'all' includes transform */
}
/* WRONG - transform not included */
.list-move {
transition: opacity 0.3s ease; /* Move won't animate! */
}