我正在尝试使用由 vue-router(vue-router 4 和 vue 3)切换的垂直窗格制作类似手风琴的用户界面。这里给出了一个非常紧凑的例子。垂直排列有3个平底锅,路由器切换其中的一些内容。这个概念有效,但我希望窗格平滑地收缩和扩展。我确信带有 css 动画的组件可以解决该任务,但无法找出正确的样式。
我尝试根据样式应用 js 转换,但它的行为很奇怪:
<!DOCTYPE html>
<html>
<body>
<div id="app">
</div>
<script src="https://unpkg.com/vue@3"></script>
<script src="https://unpkg.com/vue-router@4"></script>
<script lang="javascript">
const Default = {template: `<div> <h1> DEFAULT </h1> </div>`}
const DefaultShrinked = {template: `<div> <router-link to="/">DEFAULT</router-link> </div>`}
const About = {template: `<div> <h1> ABOUT </h1> </div>`}
const AboutShrinked = {template: `<div> <router-link to="/about">ABOUT</router-link> </div>`}
const News = {template: `<div> <h1> NEWS </h1> </div>`}
const NewsShrinked = {template: `<div> <router-link to="/news">NEWS</router-link> </div>`}
const router = VueRouter.createRouter({
history: VueRouter.createWebHistory(),
routes: [
{ path: '/', name: 'default', component: Default },
{ path: '/about', name: 'about', component: About },
{ path: '/news', name: 'news', component: News },
]
})
const Main = {
components: {
'pane-default-shrinked': DefaultShrinked,
'pane-about-shrinked': AboutShrinked,
'pane-news-shrinked': NewsShrinked,
},
methods: {
isPaneActive(name) {
return this.$route.name == name
},
enter(el, done) {
el.style.transition = "1s"
el.style.float = "left"
el.style.width = "60%"
done()
},
leave(el, done) {
el.style.transition = "1s"
el.style.float = "left"
el.style.width = "20%"
done()
},
},
template: `
<div class=boyan>
<transition @enter="enter" @leave="leave">
<div v-if="isPaneActive('default')" style="width: 60%; float: left;" key="active"> <router-view></router-view> </div>
<div v-else style="width: 20%; float: left;" key="inactive"> <pane-default-shrinked></pane-default-shrinked></div>
</transition>
<transition @enter="enter" @leave="leave">
<div v-if="isPaneActive('about')" style="width: 60%; float: left;" key="active"> <router-view></router-view> </div>
<div v-else style="width: 20%; float: left;" key="inactive"> <pane-about-shrinked></pane-about-shrinked> </div>
</transition>
<transition @enter="enter" @leave="leave">
<div v-if="isPaneActive('news')" style="width: 60%; float: left;" key="active"> <router-view></router-view> </div>
<div v-else style="width: 20%; float: left;" key="inactive"> <pane-news-shrinked></pane-news-shrinked> </div>
</transition>
</div>
`,
}
const app = Vue.createApp(Main);
app.use(router);
app.mount('#app');
</script>
</script>
</body>
</html>
如果有人帮助我,我将不胜感激。