预览成果:
实现源码:
<template> <MenuBtn :open="openMenu" :size="24" /></template>
<template> <div :class="`menu ${open?'open':''}`" :style="`width:${size}px;height:${size}px`"> <span :style="` transition-duration:${duration}ms; transform:${open?`translateY(${(size-2)/2}px) rotate(-45deg)`:`translateY(${size/6}px)`}; `" /> <span :style="` transition-duration:${duration}ms; ${open?`opacity: 0;transform: rotate(-45deg)`:''} `" /> <span :style="` transition-duration:${duration}ms; transform:${open?`translateY(${-(size-2)/2}px) rotate(45deg)`:`translateY(-${size/6}px)`}; `" /> </div></template><script setup>// 这里用了vue3的专用写法。vue2写法,自行实现。const {open, size, duration} = defineProps({ open: { type: Boolean, default: false, required: true, }, size: { type: Number, default: 24, required: false }, duration: { type: Number, default: 300, required: false }});</script><style scoped lang="scss">.menu { position: relative; display: flex; align-items: center; justify-content: space-between; flex-direction: column; span { height: 2px; border-radius: 2px; display: flex; width: 100%; background-color: #333; }}</style>
源码阐明:
带有变量的款式,都写在行内了,因为这样适宜用在任意场景下。
// nuxt3 npx nuxi init <project-name>// nuxt2yarn create nuxt-app <project-name>// vue-clivue create <project-name>// vitenpm init vite-app <project-name>
其余场景:
vite能够间接在style标签中应用js变量
npm init vite-app <project-name>
<template> <h1>{color}</h1></template><script>export default { data () { return { color: 'red' } }}</script><style vars="{ color }" scoped>h1 { color: var(--color);}</style>