vue3 拆信封动画

snows_l's BLOGicon-default.png?t=O83Ahttp://snows-l.site/

一、效果如下

截图工具截图效果不是很好, 可以查看线上效果

 信封 | snows_l's BLOGicon-default.png?t=O83Ahttp://snows-l.site/about/like/envelope

二、源码如下

<!--* @Description: ------------ fileDescription -----------* @Author: snows_l snows_l@163.com* @Date: 2025-01-02 19:05:25* @LastEditors: snows_l snows_l@163.com* @LastEditTime: 2025-01-03 15:19:59* @FilePath: \BLOG\src\views\love\envelope\index.vue
-->
<template><div class="envelope-warp"><div class="envelope-inner" :style="{ scale: isMobi ? 0.6 : 1 }" :class="{ 'is-flip': state.isFlip, 'no-flip': !state.isFlip }"><div class="back"><div class="flip-warp"><div class="latter-warp" :class="{ 'is-chou': state.isOpen }"><div class="latter-top" :style="{ transform: state.isOpen ? 'rotateX(180deg)' : 'rotateX(0deg)' }"><div class="latter-top-front"></div><div class="latter-top-back"><div:style="{ opacity: state.isOpen ? 1 : 0, '--c': state.isOpen ? '0.5s' : '0.3s' }"class="close pointer iconfont icon-cc-close-crude"@click="() => (state.isOpen = false)"></div></div></div><div class="latter-inner" :class="{ 'is-transform': state.isOpen }" :style="{ '--b': state.isOpen ? '0.7s' : '0.7s' }"><div class="latter-bottom"><div class="header">Dear Lover:</div><div class="latter-content"><div class="latter-content-inner"><div class="latter-content-item" v-for="(item, index) in state.contents" :key="index">{{ item }}</div></div></div><div class="footer">—— Your Lover</div></div></div></div><div class="bottom"><div class="flip-btn pointer" @click="handleFlip(true)">Flip</div></div><div class="top" :class="[state.isOpen ? 'is-open' : 'no-open']" :style="{ '--a': state.isOpen ? '0s' : '1.2s', 'z-index': state.isOpen ? '98' : '100' }"><div class="top-back"></div><div class="top-front"><div class="yinzhang pointer" :style="{ 'background-position': state.isFirstOpen ? '0 100%' : '0 200%' }" @click="handleOpen"></div></div></div></div></div><div class="front"><h1>Dear Lover</h1><div class="flip-btn pointer" @click="handleFlip(false)">Flip</div></div></div></div>
</template><script lang="ts" setup>
import { reactive } from 'vue';
import useResize from '@/hooks/useResize';
const { isMobi } = useResize();
const state = reactive({isFlip: false,isOpen: false,isFirstOpen: false,contents: []
});const content = `💖 见字如晤,展信舒颜。这封信承载着我对你深深的思念。🌹 喜欢你,或许是这个世界上最无法解释的事情。不是权衡利弊,不是见色起意,而是突然间有了你,让我牵肠挂肚,无法割舍。🌈 你是我安稳岁月里的意外,是我平淡生活里的星辰大海。我不曾搜索爱的定义,因为当我开车等红灯时,转头看到你坐在副驾驶,那就是爱;当我清晨醒来,希望第一眼看到的是你的睡颜,那也是爱。🌅 无论是清晨的日出,还是正午的悠闲,或是漫天星辰的夜晚,我都想与你共度。我的爱,无需理由,只因是你。💍 遇见你,是故事的开始;而你,是我余生的欢喜。做过最勇敢的事,就是在最真实的时候选择送你离开,因为你值得更好的。🌸 你是一树一树的花开,是温暖的希望,是人间四月天。我试图诅咒你,只因你只能待在我身边,只爱我一个人。但我知道,人生短暂,我想娶自己爱的人。🌻 你是我生命中不可或缺的一部分,是我一生的希望。我不想放弃你,不想放弃爱的感觉。我不想再让你孤单,不想再让你孤独。🌼 你是我生命中最美的风景,是我生命中最值得珍惜的记忆。🌲 你是我生命中最美的记忆,是我生命中最珍贵的回忆。🌴 你是我生命中最美的风景,是我生命中最值得珍惜的记忆🌱 你是我生命中最美的记忆,是我生命中最珍贵的回忆👨‍❤️‍👩‍👧‍👦 我曾以为我会孤独终老,直到遇见你。我不敢承诺一生不惹你生气,但在我能想象的未来里,只想对你一个人好。纵使生活不易,我还是想把你放在未来里,一生欢喜,纯净如初。
`;state.contents = content.split('\n');// 信封翻转
const handleFlip = (isBackFlip: boolean = false) => {if (isBackFlip && state.isOpen) {state.isOpen = false;setTimeout(() => {state.isFlip = !state.isFlip;}, 1.4 * 1000);} else {state.isFlip = !state.isFlip;}
};// 打开/关闭信封
const handleOpen = () => {state.isOpen = !state.isOpen;if (!state.isFirstOpen) state.isFirstOpen = true;
};
</script><style lang="scss" scoped>
.envelope-warp {width: 100vw;height: 100vh;position: relative;display: flex;justify-content: center;align-items: center;.envelope-inner {margin-top: 100px;position: relative;width: 600px;height: 300px;.front {backface-visibility: hidden;position: absolute;top: 0;left: 0;width: 600px;height: 300px;font-size: 1.25em;background: url('@/assets/images/common/letterStamp.png') no-repeat 20px 20px, beige url('@/assets/images/common/letterBg.png');border: 1px solid #eae1d5;box-shadow: inset 0 0 10px 1px hsla(0, 0%, 100%, 0.6), 0 2px 3px -2px rgba(0, 0, 0, 0.6);padding: 20px;color: #837362;text-shadow: 0 1px 0 #fff, 0 1px 0 #fff;display: flex;justify-content: center;align-items: center;position: relative;.flip-btn {position: absolute;bottom: 20px;right: 20px;font-size: 18px;font-weight: 600;}}.back {transform: rotateY(-180deg);position: absolute;top: 0;left: 0;width: 600px;height: 300px;color: #837362;background-color: #837362;text-shadow: 0 1px 0 #fff, 0 1px 0 #fff;.flip-warp {width: 600px;height: 300px;position: relative;perspective: 100;// 信封 上半部分.top {transform-style: preserve-3d;position: absolute;left: 0;top: 0;z-index: 101;width: 100%;height: 150px;border-bottom-right-radius: 30px;border-bottom-left-radius: 30px;box-shadow: inset 0 0 10px 1px hsla(0, 0%, 100%, 0.6), 0 2px 3px -2px rgba(0, 0, 0, 0.6);transition: transform 0.7s ease var(--a), z-index 0.7s ease var(--a);transform-origin: top center;.top-front {backface-visibility: hidden;position: absolute;top: 0;left: 0;width: 100%;height: 150px;background: beige url('@/assets/images/common/letterBg.png');border-bottom-right-radius: 30px;border-bottom-left-radius: 30px;border-bottom: 1px solid #eae1d5;.yinzhang {width: 150px;height: 150px;background-image: url('@/assets/images/common/letterStitch.png');background-size: 100% 200%;position: absolute;bottom: -71px;left: 50%;margin-left: -75px;}}.top-back {position: absolute;top: 0;left: 0;width: 100%;height: 150px;background-color: #837362;border: 35px solid hsla(0, 0%, 100%, 0.1);border-top: 2px solid #8f8579;box-shadow: inset 0 10px 30px 10px rgba(0, 0, 0, 0.1);border-bottom-right-radius: 30px;border-bottom-left-radius: 30px;}}// 信封 下半部分.bottom {position: absolute;left: 0;bottom: 0;z-index: 100;width: 100%;height: 200px;background: beige url('@/assets/images/common/letterBg.png');border: 1px solid #eae1d5;box-shadow: inset 0 0 10px 1px hsla(0, 0%, 100%, 0.6), 0 2px 3px -2px rgba(0, 0, 0, 0.6);.flip-btn {position: absolute;bottom: 20px;right: 20px;font-size: 18px;font-weight: 600;}}// 信纸.latter-warp {background-color: #fff;margin: 5%;width: 90%;position: absolute;left: 0;top: -8%;z-index: 99;transition: all 0.7s ease 0.7s;.latter-top {height: 40px;background-color: #fff;transform-style: preserve-3d;transition: transform 0.7s ease 0.3s;transform-origin: top center;// backface-visibility: hidden;.latter-top-back {position: absolute;top: 0;left: 0;height: 100%;width: 100%;display: flex;justify-content: flex-end;align-items: center;padding: 10px 20px;font-size: 16px;font-weight: 600;// background-color: #f2f2f2;border-bottom: 1px solid #f2f2f2;border-top: 1px solid #f2f2f2;.close {transition: all 0.3s ease var(--c);}}.latter-top-front {position: absolute;top: 0px;left: 0;height: 100%;width: 100%;}}.latter-inner {margin-top: -40px;backface-visibility: hidden;width: 100%;height: 100%;transform: rotateX(-180deg);transform-style: preserve-3d;transition: all 0.7s ease var(--b);.latter-bottom {background-color: #fff;.latter-content {padding: 0 20px;.latter-content-inner {height: 197px;overflow-y: auto;.latter-content-item {line-height: 24px;font-size: 16px;text-indent: 32px;min-height: 24px;}}}.header {height: 27px;line-height: 27px;padding: 0 20px;text-align: left;margin: 8px 0;font-size: 20px;font-weight: 600;}.footer {padding: 18px 0;line-height: 27px;padding: 0 20px;text-align: right;margin: 12px 0;font-size: 20px;font-weight: 600;}}}.is-transform {transform: rotateX(0deg);}}.is-chou {transform: translateY(-68%);}}}}.is-flip {transform: rotateY(180deg);transform-style: preserve-3d;transition: transform 0.7s 0s;transform-origin: center center;}.no-flip {transform: rotateY(360deg);transform-style: preserve-3d;transition: transform 0.7s 0s;transform-origin: center center;}.is-open {transform: rotateX(-180deg);}.no-open {transform: rotateX(0deg);}
}@keyframes flip {
}
</style>

如果想要资源的直接去我的 snows_l's BLOG 打开 开发者工具直接拿就行了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502243.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用python编写一个放烟花的小程序

import pygame import random # 代码解释及使用说明&#xff1a; # 首先&#xff0c;导入 pygame 和 random 库。pygame 用于创建游戏窗口和图形绘制&#xff0c;random 用于生成随机数。 # 初始化 pygame&#xff0c;并设置屏幕尺寸为 800x600 像素&#xff0c;设置窗口标题为…

法律专业legal case的留学论文写作技巧分析(1)

对于法律专业的留学生而言&#xff0c;案例的分析是写作的重要方面。无论留学的国家是英、美、澳洲还是加拿大&#xff0c;它们都属于case law 的法律体系。一个非常显著的特点便是通过对案例进行分析和提炼&#xff0c;从中总结提炼出principle和rules。case analysis的留学论…

Jenkins 中自动化部署 Spring Boot 项目

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

MetaGPT - 多Agent框架

文章目录 一、关于 MetaGPT功能介绍快速开始的演示视频教程 二、安装Pip安装Docker安装 一、关于 MetaGPT MetaGPT 为GPTs分配不同的角色&#xff0c;以形成一个协作实体来完成复杂的任务。 github : https://github.com/geekan/MetaGPTtwitter : https://twitter.com/MetaGP…

计算机网络 (15)宽带接入技术

前言 计算机网络宽带接入技术是指通过高速、大容量的通信信道或网络&#xff0c;实现用户与互联网或其他通信网络之间的高速连接。 一、宽带接入技术的定义与特点 定义&#xff1a;宽带接入技术是指能够传输大量数据的通信信道或网络&#xff0c;其传输速度通常较高&#xff0c…

计算机网络复习(大题)

&#x1f4e2;&#x1f4e2;&#x1f4e2;传送门 一、简答题&#xff08;1&#xff09;五层原理体系结构每层功能&#xff1a;&#xff08;2&#xff09;TCP建立连接三次握手过程&#xff1a;&#xff08;3&#xff09;访问浏览器的过程&#xff1a;&#xff08;4&#xff09;抓…

AI代码开发实践-微信小程序开发

接上回&#xff0c;本人参加了一次小孩学校组织的护学岗&#xff0c;萌生了开发一个微信小程序的水印相机的想法&#xff0c;说干就干。 最近也是在学习用AI编程&#xff0c;索性之前也用一点&#xff0c;今天就尝试一下 工具选择&#xff0c;环境搭建 阿里-通义灵码 通义灵…

基于Java的超级玛丽游戏的设计与实现【源码+文档+部署讲解】

目 录 1、绪论 1.1背景以及现状 1.2 Java语言的特点 1.3 系统运行环境及开发软件&#xff1a; 1.4 可行性的分析 1.4.1 技术可行性 1.4.2 经济可行性 1.4.3 操作可行性 2、 需求分析 2.1 用户需求分析 2.2功能需求分析 2.3界面设计需求分析…

麒麟服务器安装kafka--亲测

我这安装的是单机版本的&#xff1a; 下载地址&#xff1a;Index of /kafka/3.9.0 我下载的是&#xff1a;https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…

基于HTML和CSS的旅游小程序

一、技术基础 HTML&#xff08;HyperText Markup Language&#xff09;&#xff1a;超文本标记语言&#xff0c;用于定义网页的内容和结构。在旅游小程序中&#xff0c;HTML用于搭建页面的基本框架&#xff0c;包括标题、段落、图片、链接等元素&#xff0c;以及用于交互的表单…

【操作系统不挂科】操作系统期末考试题库<1>(单选题&简答题&计算与分析题&应用题)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 操作系统不挂科 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 一.单项选择题&#xff08;每个空2分&#xff0c;共40分&#xff09; 1. 计算机的操作系统是一种&#xff08; B &#xff09;。 A. 应用软件…

Excel重新踩坑5:二级下拉列表制作;★数据透视表;

0、在excel中函数公式不仅可以写在单元格里面&#xff0c;还可以写在公式里面。 1、二级下拉列表制作&#xff1a; 2、数据透视表&#xff1a; 概念&#xff1a;通过拖拉就能实现复杂函数才能实现的数据统计问题。 概览&#xff1a;在插入选项中有个数据透视表&#xff0c;数…

【赵渝强老师】MongoDB写入数据的过程

在MongoDB数据更新时&#xff0c;WiredTiger存储引擎使用预写日志的机制先将数据更新写入到Journal日志文件中。然后在创建检查点操作开始时&#xff0c;再将日志文件中记录的操作刷新到数据文件。换句话说&#xff0c;通过预写日志和检查点机制可以保证将数据更新持久化到数据…

【双层模型】考虑供需双侧的综合能源双层优化模型

目录 主要内容 内容研究 1.模型简介 2 程序释义 部分代码 运行结果 下载链接 主要内容 该程序实现一个综合能源系统的优化调度双层模型&#xff0c;上下层分别采用差分进化算法和规划算法进行求解。模型考虑了多种能源设备&#xff0c;包括燃气轮机、燃气锅炉、风电…

Linux驱动开发(16):输入子系统–电容触摸驱动实验

有关电容触摸的基础知识内容可以参考野火STM32相关教程&#xff0c;这里只介绍电容触摸驱动的相关内容。 本章配套源码、设备树以及更新固件位于“~/embed_linux_driver_tutorial_imx6_code/linux_driver/touch_scream_GTxxx”目录下。 触摸面板通过双面胶粘在显示屏上&#…

QML自定义滑动条Slider的样式

代码展示 import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.1Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Slider {id: controlvalue: 0.5background: Rectangle {x: control.leftPaddingy: control.topPadding …

【项目开发】C#环境配置及VScode运行C#教程(学生管理系统)

原创文章,禁止转载。 文章目录 下载.NETVScode配置运行程序下载.NET 官网链接: https://dotnet.microsoft.com/en-us/download选择任意版本下载: 下载完成后,双击运行exe文件,等待安装完成。 在控制台输入: dotnet --version若出现版本信息,说明安装成功: VScode配…

卡码网 ACM答题编程模板

背景&#xff1a; input() 在 ACM 编程中的底层调用原理 1. input() 的核心原理 在 Python 中&#xff0c;input() 的底层实现依赖于标准输入流 sys.stdin。每次调用 input() 时&#xff0c;Python 会从 sys.stdin 中读取一行字符串&#xff0c;直到遇到换行符 \n 或文件结束…

Linux驱动开发(18):linux驱动并发与竞态

并发是指多个执行单元同时、并行执行&#xff0c;而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问 则很容易导致竞态。对于多核系统&#xff0c;很容易理解&#xff0c;由于多个CPU同时执行&#xff0c;多个CPU同时读、写共享资源时很容易造成竞态。…

k8s基础(3)—Kubernetes-Deployment

一、 Deployment概述 ‌ Kubernetes Deployment‌是Kubernetes中的一个核心概念&#xff0c;它是一种高级别的控制器&#xff0c;用于管理Pod和ReplicaSet&#xff0c;确保应用程序的高可用性和稳定性。Deployment通过声明式配置来创建和更新Pod和ReplicaSet&#xff0c;从而…