| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- <template>
- <view class="feedback-overlay" v-if="visible" @touchmove.stop.prevent>
- <view class="feedback-toast" :class="{ 'feedback-enter': animating, 'feedback-leave': !animating }">
- <view class="feedback-icon">{{ icon }}</view>
- <text class="feedback-text">{{ text }}</text>
- </view>
- </view>
- </template>
- <script>
- export default {
- props: {
- visible: { type: Boolean, default: false },
- text: { type: String, default: '' },
- icon: { type: String, default: '✅' },
- animating: { type: Boolean, default: false }
- }
- }
- </script>
- <style scoped>
- .feedback-overlay {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- z-index: 9999;
- pointer-events: none;
- display: flex;
- align-items: center;
- justify-content: center;
- }
- .feedback-toast {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 12rpx;
- background: rgba(0,0,0,0.75);
- border-radius: 24rpx;
- padding: 40rpx 60rpx;
- backdrop-filter: blur(4px);
- }
- .feedback-icon { font-size: 80rpx; }
- .feedback-text {
- font-size: 32rpx;
- color: #fff;
- font-weight: 600;
- text-align: center;
- }
- .feedback-enter {
- animation: feedbackPopIn 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
- }
- .feedback-leave {
- animation: feedbackFadeOut 0.3s ease forwards;
- }
- </style>
- <style>
- @keyframes feedbackPopIn {
- 0% { transform: scale(0.3); opacity: 0; }
- 100% { transform: scale(1); opacity: 1; }
- }
- @keyframes feedbackFadeOut {
- 0% { opacity: 1; }
- 100% { opacity: 0; }
- }
- </style>
|