mirror of https://github.com/nocodb/nocodb
navi
3 years ago
committed by
GitHub
6 changed files with 250 additions and 20 deletions
@ -0,0 +1,111 @@
|
||||
<template> |
||||
<div |
||||
class="flip-card" |
||||
:style="{ height, width }" |
||||
@click="handleClick" |
||||
@mouseover="handleHover(true)" |
||||
@mouseleave="handleHover(false)" |
||||
> |
||||
<div class="flipper" :style="{ transform: flipped ? 'rotateY(180deg)' : '' }"> |
||||
<div class="front" :style="{ 'pointer-events': flipped ? 'none' : 'auto' }"> |
||||
<slot name="front" /> |
||||
</div> |
||||
<div class="back" :style="{ 'pointer-events': flipped ? 'auto' : 'none' }"> |
||||
<slot name="back" /> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'FlipCard', |
||||
props: { |
||||
width: { |
||||
type: Number, |
||||
required: true |
||||
}, |
||||
height: { |
||||
type: Number, |
||||
required: true |
||||
}, |
||||
onHover: { |
||||
type: Boolean, |
||||
default: true |
||||
}, |
||||
onClick: { |
||||
type: Boolean, |
||||
default: false |
||||
}, |
||||
onTime: { |
||||
type: Number, |
||||
default: 0 |
||||
} |
||||
}, |
||||
data: () => ({ |
||||
flipped: false, |
||||
hovered: false, |
||||
flipTimer: null |
||||
}), |
||||
mounted() { |
||||
if (this.onTime > 0) { |
||||
this.flipTimer = setInterval(() => { |
||||
if (!this.hovered) { |
||||
this.flipped = !this.flipped |
||||
} |
||||
}, this.onTime) |
||||
} |
||||
}, |
||||
unmounted() { |
||||
if (this.flipTimer) { |
||||
clearInterval(this.flipTimer) |
||||
} |
||||
}, |
||||
methods: { |
||||
handleHover(val) { |
||||
this.hovered = val |
||||
if (this.onHover) { |
||||
this.flipped = val |
||||
} |
||||
}, |
||||
handleClick() { |
||||
if (this.onClick) { |
||||
this.flipped = !this.flipped |
||||
} |
||||
} |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
.flip-card { |
||||
background-color: transparent; |
||||
perspective: 1000px; |
||||
} |
||||
|
||||
.flipper { |
||||
position: relative; |
||||
width: 100%; |
||||
height: 100%; |
||||
text-align: center; |
||||
transition: transform 0.8s; |
||||
transform-style: preserve-3d; |
||||
} |
||||
|
||||
.front, .back { |
||||
position: absolute; |
||||
width: 100%; |
||||
height: 100%; |
||||
-webkit-backface-visibility: hidden; |
||||
backface-visibility: hidden; |
||||
} |
||||
|
||||
.front { |
||||
color: black; |
||||
} |
||||
|
||||
.back { |
||||
color: black; |
||||
transform: rotateY(180deg); |
||||
} |
||||
</style> |
Loading…
Reference in new issue