vue CSS 自定义宽高 翻页 剥离 效果

新增需求,客户需要类似PPT的剥离效果用于WEB页面翻页,查找资料后,参考下方的掘金博主的文章,并将HTML修改成vue的页面进行使用。其中宽度、高度改成了变量,样式style中的属性与宽高的关系整理成了公式进行动态计算。

宽高比例建议不超过2倍,否则样式就会有问题。如果有极限值出现的情况,建议把rotateBox的border显示,进行调整时各个div之间的关系看得更清晰。

【完整代码】

<template>
  <div class="container">
    <article>
      <div class="book">
        <div class="rotateBox" :style="rotateBoxStyles">
          <div class="pageItem front" :style="[pageItemStyles,frontStyle]">
            <figure>
              <img src="https://cdn.pixabay.com/photo/2023/11/22/18/13/beach-8406104_640.jpg" alt="">
              <figcaption>Page 1</figcaption>
            </figure>
          </div>
          <div class="pageItem back" :style="[pageItemStyles, backStyle]">
            <figure>
              <img src="https://cdn.pixabay.com/photo/2023/07/07/15/51/sea-8112910_640.jpg" alt="">
              <figcaption>Page 2</figcaption>
            </figure>
          </div>
        </div>
        <div class="pageItem" :style="pageItemStyles">
          <figure>
            <img src="https://cdn.pixabay.com/photo/2021/11/26/17/26/dubai-desert-safari-6826298_640.jpg" alt="">
            <figcaption>Page 3</figcaption>
          </figure>
        </div>
      </div>
    </article>
  </div>
</template>


<script>
export default {
  data() {
    return {
      pageWidth: 400,
      pageHeight: 200,
    }
  },
  computed: {
    pageItemStyles() {
      return {
        width: this.pageWidth + 'px',
        height: this.pageHeight + 'px',
      }
    },
    rotateBoxStyles() {
      return {
        width: this.pageWidth * 2 + this.pageHeight * 0.5 + 'px',
        height: this.pageWidth * 2 + this.pageHeight * 0.5 + 'px',
        bottom: -this.pageWidth * 2 + 'px',
        transformOrigin: '0 ' + (this.pageWidth * 2 + this.pageHeight * 0.5) + 'px',
        transform: 'rotate(-'+ Math.atan((2*this.pageWidth - this.pageHeight)/this.pageWidth)* (180 / Math.PI) +'deg)',
      }
    },
    frontStyle() {
      return {
        bottom: (2*this.pageWidth - this.pageHeight) + 'px',
        // bottom: 0.5*(this.pageWidth * 2 + this.pageHeight * 0.5) + 'px',
        // bottom: this.pageHeight * 0.5+ 'px',
        transformOrigin: '0 ' + (this.pageWidth * 2) + 'px',
        transform: 'rotate('+ Math.atan((2*this.pageWidth - this.pageHeight)/this.pageWidth)* (180 / Math.PI) +'deg)',
      }
    },
    backStyle() {
      return {
        bottom: (2*this.pageWidth - this.pageHeight) + 'px',
        // bottom: 0.5*(this.pageWidth * 2 + this.pageHeight * 0.5) + 'px',
        // bottom: this.pageHeight * 0.5+ 'px',
        left: - this.pageWidth + 'px',
        transformOrigin: this.pageWidth + 'px' +' ' + (this.pageWidth * 2) + 'px',
        transform: 'rotate('+ (180 - Math.atan((2*this.pageWidth - this.pageHeight)/this.pageWidth)* (180 / Math.PI)) +'deg)',
      }
    },
  },
}

</script>


<style scoped lang="less">
.container {
  position: relative;
  margin-top: 100px;
}

.book {
  background-color: cornflowerblue;
  position: relative;
}

article {
  position: relative;
  width: 500px;
  height: 400px;
  // padding: 40px 80px 40px 380px;
  margin: auto;
  // box-shadow: 2px 3px 5px 6px #3f1300;
  // background-image: url(https://cdn.pixabay.com/photo/2016/12/18/09/05/trees-1915245_1280.jpg);
}

.pageItem {
  position: absolute;
  overflow: hidden;
  // width: 500px;  // w
  // height: 400px; // h
  font-size: 32px;
  text-align: center;
  box-shadow: 0 0 11px rgba(0, 0, 0, .5);
}


.rotateBox {
  overflow: hidden;
  position: absolute;
  z-index: 10;
  // width: 1200px;  // 2w+0.5h
  // height: 1200px; // 2w+0.5h
  // bottom: -1000px; // -2w
  // transform-origin: 0px 1200px;  // 0 2w+0.5h
  border: 1px dashed #b0b0b0;
  //transform: rotate(-50.19deg); // -arctan((2w-h)/w)
  transition: 1s;
  // background: pink;
}

.front {
  // bottom: 600px; // 2w-h
  // transform-origin: 0 1000px; // 0 2w
  // transform: rotate(50.19deg); // arctan((2w-h)/w)
  transition: 1s;
}

.back {
  // bottom: 600px; // 2w-h
  // left: -500px; // -w
  // transform-origin: 500px 1000px; // w 2w
  // transform: rotate(129.81deg); // 180 - arctan((2w-h)/w)
  transition: 1s;
}

figure img {
  width: 100%;
  height: 100%;
  aspect-ratio: 3/4;
  object-fit: cover;
}

figure figcaption {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  text-wrap: nowrap;
  color: #fff;
  background-color: rgba(255, 255, 255, .5);
  padding: 1em;
  border: 4px double #fff;
}

article:hover .rotateBox {
  transform: rotate(-90deg) !important;
}

article:hover .front {
  transform: rotate(90deg) !important;
}

article:hover .back {
  transform: rotate(90deg) !important;
}
</style>

【参考文章】

CSS实现翻页效果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单北斗+鸿蒙系统+国产芯片,遨游防爆手机自主可控“三保险”

在当今全球科技竞争日益激烈的背景下&#xff0c;技术自主可控的重要性愈发凸显。它不仅关乎国家安全&#xff0c;更是推动产业升级和经济发展的关键。特别是在一些特殊领域&#xff0c;如防爆通信&#xff0c;自主可控的技术更是不可或缺。遨游通讯推出了一款融合了单北斗、鸿…

Word2Vec:将词汇转化为向量的技术

文章目录 Word2Vec来龙去脉分层Softmax负采样 Word2Vec 下面的文章纯属笔记&#xff0c;看完后不会有任何收获&#xff0c;如果想理解这两种优化技术&#xff0c;给大家推荐一篇博客&#xff0c;讲的很好&#xff1a; 详解-----分层Softmax与负采样 来龙去脉 word2vec,即将词…

虚幻5描边轮廓材质

很多游戏内都有这种描边效果&#xff0c;挺实用也挺好看的&#xff0c;简单复刻一下 效果演示&#xff1a; Linethickness可以控制轮廓线条的粗细 这样连完&#xff0c;然后放到网格体细节的覆层材质上即可 可以自己更改粗细大小和颜色

websocket_asyncio

WebSocket 和 asyncio 指南 简介 本指南涵盖了使用 Python 中的 websockets 库进行 WebSocket 编程的基础知识&#xff0c;以及 asyncio 在异步非阻塞 I/O 中的作用。它提供了构建高效 WebSocket 服务端和客户端的知识&#xff0c;以及 asyncio 的特性和优势。 1. 什么是 WebS…

序列模型的使用示例

序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络&#xff08;RNN&#xff09;1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN&#xff08;1&#xff09;RNN实例化&#xff08;2&#xff09;forward函数&#xff08;3&#xf…

Hadoop学习笔记(包括hadoop3.4.0集群安装)(黑马)

Hadoop学习笔记 0-前置章节-环境准备 0.1 环境介绍 配置环境&#xff1a;hadoop-3.4.0&#xff0c;jdk-8u171-linux-x64 0.2 VMware准备Linux虚拟机 0.2.1主机名、IP、SSH免密登录 1.配置固定IP地址&#xff08;root权限&#xff09; 开启master&#xff0c;修改主机名为…

【计算机网络】Layer4-Transport layer

目录 传输层协议How demultiplexing works in transport layer&#xff08;传输层如何进行分用&#xff09;分用&#xff08;Demultiplexing&#xff09;的定义&#xff1a;TCP/UDP段格式&#xff1a; UDPUDP的特点&#xff1a;UDP Format端口号Trivial File Transfer Protocol…

Android Studio创建新项目并引入第三方so外部aar库驱动NFC读写器读写IC卡

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单&#xff0c;选择 要创建的项目模版&#xff0c;点击 Next 二、输入项目名称…

【Linux】—简单实现一个shell(myshell)

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦&#xff01; 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&…

【Python爬虫系列】_032.Scrapy_全站爬取

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈

Android通过okhttp下载文件(本文案例 下载mp4到本地,并更新到相册)

使用步骤分为两步 第一步导入 okhttp3 依赖 第二步调用本文提供的 utils 第一步这里不做说明了&#xff0c;直接提供第二步复制即用 DownloadUtil 中 download 为下载文件 参数说明 这里主要看你把 destFileName 下载文件名称定义为什么后缀&#xff0c;比如我定义为 .mp4 下…

win10配置子系统Ubuntu子系统(无需通过Windows应用市场)实际操作记录

win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09;实际操作记录 参考教程 : win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09; - 一佳一 - 博客园 开启虚拟机服务的 以管理员方式运行PowerShell运行命令。 &#xf…

Showrunner AI技术浅析(四):多智能体模拟

多智能体模拟技术涉及多个智能体&#xff08;Agents&#xff09;在虚拟环境中的行为和互动&#xff0c;每个智能体都有自己的属性、目标和行为规则。 1. 多智能体模拟概述 多智能体模拟技术通过模拟多个智能体在虚拟环境中的互动来生成复杂的剧情和场景。每个智能体都有其独特…

创新性融合丨卡尔曼滤波+目标检测 新突破!

2024深度学习发论文&模型涨点之——卡尔曼滤波目标检测 卡尔曼滤波是一种递归算法&#xff0c;用于估计线性动态系统的状态。它通过预测和更新两个步骤&#xff0c;结合系统模型和观测数据&#xff0c;来估计系统状态&#xff0c;并最小化估计的不确定性。 在目标检测中&am…

USB模块布局布线

1、USB接口定义 2、USB模块常规分类介绍 3、USB常用管脚定义图示 4、USB模块布局布线分析 USB3.0高速线因为速度比较高&#xff0c;建议走圆弧线不能走钝角 5、总结 1、CTRL鼠标中间滑轮按下可以看线的长度 2、不懂差分类和规则的设置&#xff0c;可以看本人写的AD基础操作…

SpringCloud系列之分布式配置中心极速入门与实践

[toc] 1、分布式配置中心简介 在实际的项目开发中&#xff0c;配置文件是使用比较多的&#xff0c;很多项目有测试环境(TEST)、开发环境(DEV)、规范的项目还有集成环境(UAT)、生产环境(PROD)&#xff0c;每个环境就一个配置文件。 CSDN链接&#xff1a;SpringCloud系列之分布式…

【Vue3学习】setup语法糖中的ref,reactive,toRef,toRefs

在 Vue 3 的组合式 API&#xff08;Composition API&#xff09;中&#xff0c;ref、reactive、toRef 和 toRefs 是四个非常重要的工具函数&#xff0c;用于创建和管理响应式数据。 一、ref 用ref()包裹数据,返回的响应式引用对象&#xff0c;包含一个 .value 属性&#xff0…

解决 Git Permission denied 问题

前言 push项目时出现gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.出现这个问题表示你在尝试将本地代码推送到GitHub时&#xff0c;没有提供…

React的状态管理库-Redux

核心思想&#xff1a;单一数据源、状态是只读的、以及使用纯函数更新状态。 组成部分 Store&#xff08;存储&#xff09; 应用的唯一状态容器&#xff0c;存储整个应用的状态树,使用 createStore() 创建。 getState()&#xff1a;获取当前状态。dispatch(action)&#xff…

蓝卓总裁谭彰:AI+工业互联网推动制造业数字化转型

近日&#xff0c;新一代工业操作系统supOS6.0在2024中国5G工业互联网大会上重磅发布。 大会期间&#xff0c;工信部新闻宣传中心《人民邮电报》对蓝卓总裁谭彰就“工业互联网人工智能技术融合的思考”“supOS6.0的探索与实践”“未来工业互联网平台的发展方向”展开专题访谈&am…