广告
返回顶部
首页 > 资讯 > 精选 >vue怎么实现书本翻页动画效果
  • 927
分享到

vue怎么实现书本翻页动画效果

2023-06-29 22:06:35 927人浏览 薄情痞子
摘要

本文小编为大家详细介绍“Vue怎么实现书本翻页动画效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现书本翻页动画效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果如下:关键字transfORM

本文小编为大家详细介绍“Vue怎么实现书本翻页动画效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现书本翻页动画效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

效果如下:

vue怎么实现书本翻页动画效果

关键字

transfORM

Transform属性应用于元素的2D或3D转换。这个属性允许你将元素旋转,缩放,移动,倾斜等。

语法为transform: none|*transform-functions*; 我们主要使用到其旋转效果,我们可以这样写。

transform: rotateY(90deg)//表示沿Y轴旋转90度

animation

既然是要实现动画效果,那么肯定少不了animation的出场了,

animation属性的语法为: animation: name duration timing-function delay iteration-count direction fill-mode play-state;我们需要用到的只是前两个属性,name和duration,分别为指定要绑定到选择器的关键帧的名称动画指定需要多少秒或毫秒完成 我们可以这样写

animation: fanPre 2s;

@keyframes

使用@keyframes规则,你可以创建动画,创建动画是通过逐步改变从一个CSS样式设定到另一个,在动画过程中,可以更改CSS样式的设定多次,指定的变化时发生时使用%,或关键字"from"和"to",这是和0%到100%相同。

语法为:@keyframes *animationname* {*keyframes-selector* {*css-styles;}* } 我们可以这样写

@keyframes fanPre {  0% {    transform: rotateY(0deg);    background-color: rgba(122, 112, 112);  }  50% {    background-color: rgba(122, 112, 112);  }  75% {    background-color: rgba(122, 112, 112);  }  100% {    transform: rotateY(-140deg);    background-color: none;  }}

var

此var并不是javascript中的var而是css中的var,我们可以使用其来实现css与vue数据继续数据交换,及css中可以使用vue定义的data来进行属性设置,具体如下:

//html<div :></div>//javascriptprops: {    speed: {      type: String,      default: "2s",    }}//css<style vars="{ speed, degs }" lang="scss" scoped>    animation: fanPre var(--speed);</style>

实现

知道了上面这几个关键词之后,我们便可以开始着手实现该效果了,首先我们需要一个书本页面列表数据

//书本页面列表    pagesList: {      type: Array,      default: () => {        return [          {            title: "关雎",            text: [              "关关雎鸠,在河之洲。窈窕淑女,君子好逑。",              "参差荇菜,左右流之。窈窕淑女,寤寐求之。",              "求之不得,寤寐思服。悠哉悠哉,辗转反侧。",              "参差荇菜,左右采之。窈窕淑女,琴瑟友之。",              "参差荇菜,左右芼之。窈窕淑女,钟鼓乐之。",            ],          },          {            title: "声声慢·寻寻觅觅",            text: [              "寻寻觅觅,冷冷清清,凄凄惨惨戚戚。乍暖还寒时候,最难将息。三杯两盏淡酒,怎敌他、晚来风急!雁过也,正伤心,却是旧时相识。",              "满地黄花堆积,憔悴损,如今有谁堪摘?守着窗儿,独自怎生得黑!梧桐更兼细雨,到黄昏、点点滴滴。这次第,怎一个愁字了得!",            ],          },          {            title: "青玉案·元夕",            text: [              "东风夜放花千树。更吹落、星如雨。宝马雕车香满路。凤箫声动,玉壶光转,一夜鱼龙舞。",              "蛾儿雪柳黄金缕。笑语盈盈暗香去。众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。",            ],          },          {            title: "蝶恋花·伫倚危楼风细细",            text: [              "伫倚危楼风细细,望极春愁,黯黯生天际。草色烟光残照里,无言谁会凭阑意。",              "拟把疏狂图一醉,对酒当歌,强乐还无味。衣带渐宽终不悔,为伊消得人憔悴。",            ],          },          {            title: "雨霖铃·秋别",            text: [              "寒蝉凄切,对长亭晚,骤雨初歇。都门帐饮无绪,留恋处,兰舟催发。执手相看泪眼,竟无语凝噎。念去去,千里烟波,暮霭沉沉楚天阔。",              "多情自古伤离别,更那堪,冷落清秋节!今宵酒醒何处?杨柳岸,晓风残月。此去经年,应是良辰好景虚设。便纵有千种风情,更与何人说",            ],          },        ];      },    },

将数据渲染到页面上,如下例子

<div    @click="turnPage(1)"    class="j-book-page"    :key="'page-now-' + index"    :>    <h4>{{ nowPage.title }}</h4>    <p      v-for="(t, nowPageInd) in nowPage.text"      :key="'nowPage-' + nowPageInd"    >      {{ t }}    </p></div>

页面翻页功能实现如下,使用currentPage来记录当前展示页面页数,使用flag来区分是上一页还是下一页翻页,并进行相应的翻页操作。其中要注意对点击事件进行防抖操作,防止翻页过快,具体代码如下:

    turnPage(flag) {      if (!this.canTurn) return;      if (this.currentPage <= this.pagesList.length)        this.setPage(this.currentPage, flag);      if (this.currentPage < this.pagesList.length && this.currentPage > 0) {        this.canTurn = false;        setTimeout(() => {          this.canTurn = true;        }, parseInt(this.speed) * 1000 - 100);      }      if (flag === 1) {        if (this.currentPage < this.pagesList.length) {          this.currentPage++;          this.nextClick = true;          this.lastClick = false;        }      } else {        if (this.currentPage > 0) {          this.currentPage--;          this.nextClick = false;          this.lastClick = true;        }      }    },

完整代码

<template>  <div class="j-book" :>    <div :>      <div        class="j-book-page-pre"        @click="turnPage(-1)"        v-if="currentPage > 0 && showCover"      >        <div class="j-book-page">          <h4>{{ prePage.title }}</h4>          <p v-for="(t, textInd) in prePage.text" :key="'prePage-' + textInd">            {{ t }}          </p>        </div>      </div>      <div class="j-book-pages">        <template v-for="(item, index) in pagesList">          <div            @click="turnPage(-1)"            class="j-book-page turn-page-ani"            v-if="currentPage === index + 2 && nextClick"            :key="'page-last--' + index"            :          >            <h4>{{ item.title }}</h4>            <p v-for="(t, itemInd) in item.text" :key="'item-' + itemInd">              {{ t }}            </p>          </div>          <div            @click="turnPage(-1)"            class="j-book-page turn-page-ani"            v-if="currentPage === 1 && nextClick"            :key="'page-last-' + index"            :          >            <h4>{{ cover.title }}</h4>            <p v-for="(t, coverInd) in cover.text" :key="'cover-' + coverInd">              {{ t }}            </p>          </div>          <div            @click="turnPage(1)"            class="j-book-page turn-page-pre-ani"            v-if="lastClick && currentPage === 0"            :key="'page-pre-currentPage' + index"            :          >            <h4>{{ cover.title }}</h4>            <p v-for="(t, coverInd) in cover.text" :key="'cover-0-' + coverInd">              {{ t }}            </p>          </div>          <div            @click="turnPage(1)"            class="j-book-page turn-page-pre-ani"            v-if="lastClick && currentPage === index + 1"            :key="'page-pre-' + index"            :          >            <h4>{{ item.title }}</h4>            <p v-for="(t, itemInd) in item.text" :key="'item-0-' + itemInd">              {{ t }}            </p>          </div>          <div            @click="turnPage(1)"            class="j-book-page"            :key="'page-now-' + index"            :          >            <h4>{{ nowPage.title }}</h4>            <p              v-for="(t, nowPageInd) in nowPage.text"              :key="'nowPage-' + nowPageInd"            >              {{ t }}            </p>          </div>        </template>      </div>    </div>  </div></template><script>export default {  name: "book",  props: {    width: {      type: Number,      default: 300,    },    height: {      type: Number,      default: 400,    },    speed: {      type: String,      default: "2s",    },    //书本页面列表    pagesList: {      type: Array,      default: () => {        return [          {            title: "关雎",            text: [              "关关雎鸠,在河之洲。窈窕淑女,君子好逑。",              "参差荇菜,左右流之。窈窕淑女,寤寐求之。",              "求之不得,寤寐思服。悠哉悠哉,辗转反侧。",              "参差荇菜,左右采之。窈窕淑女,琴瑟友之。",              "参差荇菜,左右芼之。窈窕淑女,钟鼓乐之。",            ],          },          {            title: "声声慢·寻寻觅觅",            text: [              "寻寻觅觅,冷冷清清,凄凄惨惨戚戚。乍暖还寒时候,最难将息。三杯两盏淡酒,怎敌他、晚来风急!雁过也,正伤心,却是旧时相识。",              "满地黄花堆积,憔悴损,如今有谁堪摘?守着窗儿,独自怎生得黑!梧桐更兼细雨,到黄昏、点点滴滴。这次第,怎一个愁字了得!",            ],          },          {            title: "青玉案·元夕",            text: [              "东风夜放花千树。更吹落、星如雨。宝马雕车香满路。凤箫声动,玉壶光转,一夜鱼龙舞。",              "蛾儿雪柳黄金缕。笑语盈盈暗香去。众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。",            ],          },          {            title: "蝶恋花·伫倚危楼风细细",            text: [              "伫倚危楼风细细,望极春愁,黯黯生天际。草色烟光残照里,无言谁会凭阑意。",              "拟把疏狂图一醉,对酒当歌,强乐还无味。衣带渐宽终不悔,为伊消得人憔悴。",            ],          },          {            title: "雨霖铃·秋别",            text: [              "寒蝉凄切,对长亭晚,骤雨初歇。都门帐饮无绪,留恋处,兰舟催发。执手相看泪眼,竟无语凝噎。念去去,千里烟波,暮霭沉沉楚天阔。",              "多情自古伤离别,更那堪,冷落清秋节!今宵酒醒何处?杨柳岸,晓风残月。此去经年,应是良辰好景虚设。便纵有千种风情,更与何人说",            ],          },        ];      },    },    //书本封面    cover: {      type: Object,      default: () => {        return {          title: "封面",          text: ["封面"],        };      },    },  },  data() {    return {      currentPage: 0,      nextClick: false,      lastClick: false,      prePage: {},      nowPage: {},      canTurn: true,      degs: "0deg",      showCover: false,    };  },  mounted() {    this.init();  },  methods: {    init() {      this.nowPage = this.cover;    },    getBookStyle() {      let res = "";      res += "width:" + this.width + "px;";      res += "height:" + this.height + "px;";      res += "'--speed':" + this.speed + ";";      res += "transform: rotate(" + this.degs + ");";      return res;    },    getPageStyle(index) {      let res = "";      res += "z-index:" + (this.pagesList.length - index) + ";";      return res;    },    setPage(page, flag) {      if (flag === -1) {        this.prePage = this.pagesList[page - 3] || this.cover;        this.nowPage = this.pagesList[page - 1];      } else {        this.prePage = this.pagesList[page - 2] || this.cover;        this.nowPage =          this.pagesList[ page ] || this.pagesList[this.pagesList.length - 1];      }      let speed = this.speed;      speed = parseInt(speed) * 1000 - 500;      setTimeout(() => {        if (this.currentPage === 1) {          this.showCover = true;        }        if (this.currentPage === 0) {          this.showCover = false;        }        if (flag === -1) {          this.nowPage = this.pagesList[this.currentPage - 1] || this.cover;          if (this.currentPage === 0) {            this.degs = "0deg";          }        } else {          this.degs = "-5deg";          this.prePage = this.pagesList[this.currentPage - 2] || this.cover;        }      }, speed);    },    turnPage(flag) {      if (!this.canTurn) return;      if (this.currentPage <= this.pagesList.length)        this.setPage(this.currentPage, flag);      if (this.currentPage < this.pagesList.length && this.currentPage > 0) {        this.canTurn = false;        setTimeout(() => {          this.canTurn = true;        }, parseInt(this.speed) * 1000 - 100);      }      if (flag === 1) {        if (this.currentPage < this.pagesList.length) {          this.currentPage++;          this.nextClick = true;          this.lastClick = false;        }      } else {        if (this.currentPage > 0) {          this.currentPage--;          this.nextClick = false;          this.lastClick = true;        }      }    },  },};</script><style vars="{ speed, degs }" lang="scss" scoped>.j-book {  background-color: gray;  position: relative;  box-shadow: 30px 0px 30px rgb(0, 0, 0, 0.6) inset;  transform: rotate(var(--degs));  color: #dec38f;  .j-book-page-pre {    position: absolute;    width: 100%;    height: 100%;    z-index: 2;    background-size: 100%;    transform-origin: left;    border-top-left-radius: 2px;    border-bottom-left-radius: 2px;    background-color: rgba(122, 112, 112);    transform: rotateY(-140deg);    .j-book-page {      position: absolute;      width: 100%;      height: 100%;    }  }  .j-book-pages {    position: absolute;    width: 100%;    height: 100%;    .turn-page-pre-ani {      position: absolute;      width: 100%;      height: 100%;      z-index: 2;      background-size: 100%;      transform-origin: left;      border-top-left-radius: 2px;      border-bottom-left-radius: 2px;      transform: rotateY(0deg);      animation: fanPre var(--speed);    }    @keyframes fanPre {      0% {        transform: rotateY(-140deg);        background-color: rgba(122, 112, 112);      }      50% {        background-color: rgba(122, 112, 112);      }      100% {        transform: rotateY(0deg);        background-color: none;      }    }    .turn-page-ani {      position: absolute;      width: 100%;      height: 100%;      z-index: 2;      background-size: 100%;      transform-origin: left;      border-top-left-radius: 2px;      border-bottom-left-radius: 2px;      transform: rotateY(-140deg);      animation: fan var(--speed);    }    @keyframes fan {      0% {        transform: rotateY(0deg);        background-color: none;      }      100% {        transform: rotateY(-140deg);        background-color: rgba(122, 112, 112);      }    }    .j-book-page {      position: absolute;      width: 100%;      height: 100%;      top: 0;      h4 {        text-align: center;      }      p {      }    }  }  .j-book-btns {    position: absolute;    bottom: 0;    display: flex;    justify-content: space-around;    width: 100%;  }}</style>

读到这里,这篇“vue怎么实现书本翻页动画效果”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: vue怎么实现书本翻页动画效果

本文链接: https://www.lsjlt.com/news/326575.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue怎么实现书本翻页动画效果
    本文小编为大家详细介绍“vue怎么实现书本翻页动画效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现书本翻页动画效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果如下:关键字transform...
    99+
    2023-06-29
  • vue实现书本翻页动画效果实例详解
    偶然兴起,想要用vue来做一个书本的组件,有了这个想法后边开始动手,先简单地实现基本的效果,为后续封装为组件进行准备工作,实现该效果的要使用vue + css + JavaScri...
    99+
    2022-11-13
  • 怎么在HTML5中实现一个3D书本翻页动画
    这期内容当中小编将会给大家带来有关怎么在HTML5中实现一个3D书本翻页动画,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。HTML代码 <div class="back...
    99+
    2023-06-09
  • 怎么使用html+css实现页面书本翻页特效
    本篇内容主要讲解“怎么使用html+css实现页面书本翻页特效”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用html+css实现页面书本翻页特效”吧!效果:实现:1.定义标签,shu是书...
    99+
    2023-07-05
  • vue实现数字翻页动画
    本文实例为大家分享了vue实现数字翻页动画的具体代码,供大家参考,具体内容如下 一、看效果 二、实现步骤 1、新建翻页组件scrollNumber.vue <template...
    99+
    2022-11-13
  • 怎么使用纯CSS实现书籍3D翻页效果
    这篇文章主要介绍了怎么使用纯CSS实现书籍3D翻页效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用纯CSS实现书籍3D翻页效果,代码如下:<!doctype&nb...
    99+
    2023-06-08
  • javaScript+turn.js如何实现图书翻页效果
    小编给大家分享一下javaScript+turn.js如何实现图书翻页效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先附上...
    99+
    2022-10-19
  • JS怎么实现图片翻书效果
    这篇文章主要介绍JS怎么实现图片翻书效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体代码如下所示:<html xmlns="http://www.w3...
    99+
    2022-10-19
  • css怎么实现旋转翻牌动画效果
    小编给大家分享一下css怎么实现旋转翻牌动画效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!css动画之旋转翻牌效果,具体内容如下所示:我们先设置两个盒子大小,...
    99+
    2023-06-08
  • 怎么用jQuery插件Turn.js实现移动端电子书翻页效果
    本篇内容主要讲解“怎么用jQuery插件Turn.js实现移动端电子书翻页效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用jQuery插件Turn.js实现移动端电子书翻页效果”吧!先来...
    99+
    2023-07-04
  • vue router如何实现自动判断左右翻页转场动画效果
    这篇文章将为大家详细讲解有关vue router如何实现自动判断左右翻页转场动画效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一 。首先父页面home.vue:<...
    99+
    2022-10-19
  • Android实现Flip翻转动画效果
    本文实例讲述了Android实现Flip翻转动画效果的方法,分享给大家供大家学习借鉴。 具体实现代码如下: LinearLayout locationLL = (Linear...
    99+
    2022-06-06
    动画 Android
  • vue怎么实现翻牌动画
    本篇内容主要讲解“vue怎么实现翻牌动画”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue怎么实现翻牌动画”吧!应用场景常用于大屏订单数量展示原理利用css writing-mode: ver...
    99+
    2023-06-30
  • iOS基于CATransition实现翻页、旋转等动画效果
    基于CATransition实现翻页、旋转、淡化、推进、滑入滑出、立方体、吮吸、波纹等动画效果。 首先看一下效果图: 下面贴上代码: #import <UIKit/UIK...
    99+
    2022-06-05
    iOS 翻页 旋转
  • 怎么用vue2.x+turn.js实现翻书效果
    这篇文章主要讲解了“怎么用vue2.x+turn.js实现翻书效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用vue2.x+turn.js实现翻书效果”吧!vue中使用turn.js...
    99+
    2023-06-26
  • vue实现弹窗翻页多选效果
    本文实例为大家分享了vue实现弹窗翻页多选效果的具体代码,供大家参考,具体内容如下 最终效果 点选择按钮后,弹出选择用户弹窗,可翻页勾多个用户  完整代码 <te...
    99+
    2022-11-13
  • Android如何实现翻转动画效果(卡片翻转)
    目录前言需求一、先介绍三个插值器二、实现步骤1.效果图2.布局3.逻辑判断(是否隐藏)4.翻转动画5.bug出现6.bug解决三、源码四、总结前言 最近好友问计蒙翻转动画,恰好在大...
    99+
    2022-11-12
  • 浅析vue怎么实现动画效果
    vue怎么实现动画效果?下面本篇文章带大家简单了解一下Vue封装的过度与动画,希望对大家有所帮助!Vue封装的过度与动画1.作用在插入,更新,移除DOM元素时,在合适的时候给元素添加样式类名。2.写法准备好样式:元素进入的样式<tem...
    99+
    2023-05-14
    Vue 动画
  • 怎么使用vue实现动画效果
    这篇文章主要介绍了怎么使用vue实现动画效果的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用vue实现动画效果文章都会有所收获,下面我们一起来看看吧。Vue封装的过度与动画1.作用在插入,更新,移除DOM...
    99+
    2023-07-05
  • Android实现文字翻转动画的效果
    本文实现了Android程序文字翻转动画的小程序,具体代码如下: 先上效果图如下: 要求: 沿Y轴正方向看,数值减1时动画逆时针旋转,数值加1时动画顺时针旋转。 实现...
    99+
    2022-06-06
    动画 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作