• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 手把手教你使用Vue3实现图片散落效果

手把手教你使用Vue3实现图片散落效果

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了Vue3效果,图片散落效果等相关知识,希望对您有所帮助

基于Vue3怎么实现图片散落效果?下面本篇文章给大家介绍一下使用Vue3实现图片散落效果的方法,希望对大家有所帮助!


手把手教你使用Vue3实现图片散落效果


今天又是美好的摸鱼一天,刚刚进入职场,觉得一切都很新鲜,导师给的任务也不多(要是每天都是这样就好了),于是开始带薪学习。


做啥好呢

没事在网上乱逛的时候,偶然间看到一个动画效果不错,就决定上手做一些,简单的说就是一个完整的图片,在一段时间之后回突然破裂开来,觉得很有意思,就新建了一个文件夹。


出现问题

一下午的摸鱼时光,间公司熙熙攘攘,我在其中却格格不入(太闲了),不知多少人投来质疑的眼光(这家伙不工作吗),但我只沉浸在我的代码里。终于勉强完成了一个不怎么丑的版本。


手把手教你使用Vue3实现图片散落效果


原理

图片破裂效果说白了就是搞了100个div,每个div都有自己的背景图片,通过backgroundPosition属性来控制每个div的背景图片方位,最后拼在一起,就像一张完整的图片一样,给每个div都加上动画效果,每个div的旋转角度不同,移动距离不同,移动方位不同来让整个图片像玻璃一样散开来。


HTML结构

这里用到了两个div,#break是用作为100个div的容器,#InBox是用来绑定下一张的背景图片

<div id="animateBox" v-show="showImg">        <div id="break"></div>        <div id="InBox"></div></div>

准备5张图片

import bgImg5 from '../../assets/img/1/y1.png'import bgImg4 from '../../assets/img/1/y2.png'import bgImg3 from '../../assets/img/1/y3.png'import bgImg2 from '../../assets/img/1/y4.png'import bgImg6 from '../../assets/img/1/y5.png'import { ref, onMounted, onUnmounted } from 'vue'let index = 0onMounted(() => {  let imageSrcArr = [bgImg2, bgImg3, bgImg4, bgImg5, bgImg6]  let imgloadPromiseArr: Array<Promise<HTMLImageElement>> = []  let imageArr: Array<string> = []  for (let i = 0; i < imageSrcArr.length; i++) {    imgloadPromiseArr[i] = new Promise((resolve, reject) => {      let img = new Image()      img.src = imageSrcArr[i]      img.onload = () => {        resolve(img)      }    })  }  imgloadPromiseArr.forEach(item => {    item.then(res => {      imageArr.push(`url(${(<HTMLImageElement>res).currentSrc})`)      index = imageArr.length    })  })})


创建div

通过createElement创建200个div,每个div绑定长宽,给div添加背景图片,使用backgroundPosition来让整个div变得像一张图片,给div绑定动画效果。

for (let i = 0; i < 100; i++) {      let div = document.createElement('div')      let div1 = document.createElement('div')      div.style.width = '76px'      div.style.height = '41px' // 这里为什么是41px后面会提到      div1.style.width = '76px'      div1.style.height = '40px'      div1.style.overflow = 'hidden'      div.style.boxSizing = 'border-box'      div.style.backgroundImage = imageArr[0]      let positionX = -(i % 10) * 76 + 'px'      let positionY = -Math.floor(i / 10) * 40 + 'px'      div.style.backgroundPosition = positionX + ' ' + positionY      div.style.backgroundSize = '760px 400px'      let style = document.styleSheets[0]      style.insertRule(`@keyframes secondrotate${i}        {            0%,30%{                transform:scale(1)            }            70%            {transform: rotateX(${180 + Math.random() * 720}deg) rotateY(${180 + Math.random() * 720}deg)}            100%            {transform: rotateX(${180 + Math.random() * 720}deg) rotateY(${180 + Math.random() * 720}deg)}        }`)      style.insertRule(`@keyframes secondrotateS${i}        {            0%,32%{                transform:scale(1);opacity:1;            }70%            {transform: translateZ(${300 + Math.random() * 1500}px) translate(${(0.5 - Math.random()) * 500}px,${        (0.5 - Math.random()) * 500      }px);opacity:0}            100%            {transform: translateZ(${300 + Math.random() * 1500}px) translate(${(0.5 - Math.random()) * 500}px,${        (0.5 - Math.random()) * 500      }px);opacity:0}         }`)      div1.style.animation = `secondrotateS${i} 4.5s ease-out infinite`      div.style.animation = `secondrotate${i} 4.5s ease-out infinite`      div.style.transformOrigin = `center center`      div1.appendChild(div)      dom.appendChild(div1)}


切换背景图片

通过zIndex来让当前展示的div是哪一个

前面说过,InBox是展示的下一张图片,在breakBox散落完成之后,让breakBox的zIndex降低,展示出下一张图片,随后带有100个div的breakBox完成下一张图片的渲染,zIndex提高,展示出来

let count = 0let repeat = truelet breakBox: HTMLDivElement = document.querySelector('#break')!let InBox: HTMLDivElement = document.querySelector('#InBox')!function changeImage(InBox: HTMLDivElement) {  if (repeat) {    breakBox.style.zIndex = '-10'    count++    count = count === index ? 0 : count    repeat = false    setTimeout(() => {      repeat = true      breakBox.style.zIndex = '100'      let currentImageLength = count === index - 1 ? 0 : count + 1      InBox.style.backgroundImage = imageArr[currentImageLength]    }, 1000)  }}

每次动画完成之后会去调上面这个方法,为了能在div碎片破碎完毕,展示下一张图片,使用定时器将该方法进行延迟处理 4s是因为div碎片在4s后完全消失。(动画在运行70%的时候,透明度为0)

const timer1 = ref<number>()const timer2 = ref<number>()for (let i = 0; i < 100; i++) {  let div = document.createElement('div')  let div1 = document.createElement('div')  div.style.width = '76px'  div.style.height = '41px'  div1.style.width = '76px'  div1.style.height = '40px'  div1.style.overflow = 'hidden'  div.style.boxSizing = 'border-box'  div.style.backgroundImage = imageArr[0]  let positionX = -(i % 10) * 76 + 'px'  let positionY = -Math.floor(i / 10) * 40 + 'px'  div.style.backgroundPosition = positionX + ' ' + positionY  div.style.backgroundSize = '760px 400px'  let style = document.styleSheets[0]  style.insertRule(`@keyframes secondrotate${i}    {        0%,30%{            transform:scale(1)        }        70%        {transform: rotateX(${180 + Math.random() * 720}deg) rotateY(${180 + Math.random() * 720}deg)}        100%        {transform: rotateX(${180 + Math.random() * 720}deg) rotateY(${180 + Math.random() * 720}deg)}    }`)  style.insertRule(`@keyframes secondrotateS${i}    {        0%,32%{            transform:scale(1);opacity:1;        }70%        {transform: translateZ(${300 + Math.random() * 1500}px) translate(${(0.5 - Math.random()) * 500}px,${    (0.5 - Math.random()) * 500  }px);opacity:0}        100%        {transform: translateZ(${300 + Math.random() * 1500}px) translate(${(0.5 - Math.random()) * 500}px,${    (0.5 - Math.random()) * 500  }px);opacity:0}    }`)  div1.style.animation = `secondrotateS${i} 4.5s ease-out infinite`  div.style.animation = `secondrotate${i} 4.5s ease-out infinite`  div.style.transformOrigin = `center center`  div.addEventListener('animationstart', () => {    timer1.value = setTimeout(() => {      changeImage(InBox)      div.style.backgroundImage = imageArr[count]    }, 4000)  })  div.addEventListener('animationiteration', () => {    timer2.value = setTimeout(() => {      changeImage(InBox)      div.style.backgroundImage = imageArr[count]    }, 4000)  })  div1.appendChild(div)  dom.appendChild(div1)}


div存在间隙的问题


手把手教你使用Vue3实现图片散落效果


在100个div展示之后会出现这样的线,在经过多次尝试之后,找到了方法,将div的高度变大,div1设置overflow:hidden; 线回消失


代码详情

<template>  <div>    <transition name="fadeIn">      <div id="animateBox" v-show="showImg">        <div id="break"></div>        <div id="InBox"></div>      </div>    </transition>  </div></template> <script setup>import bgImg5 from '../../assets/img/1/y1.png'import bgImg4 from '../../assets/img/1/y2.png'import bgImg3 from '../../assets/img/1/y3.png'import bgImg2 from '../../assets/img/1/y4.png'import bgImg6 from '../../assets/img/1/y5.png'import { ref, onMounted, onUnmounted } from 'vue'const timer1 = ref<number>()const timer2 = ref<number>()const showImg = ref<boolean>(false) onMounted(() => {  let imageSrcArr = [bgImg2, bgImg3, bgImg4, bgImg5, bgImg6]  let imgloadPromiseArr: Array<Promise<HTMLImageElement>> = []  let imageArr: Array<string> = []  for (let i = 0; i < imageSrcArr.length; i++) {    imgloadPromiseArr[i] = new Promise((resolve, reject) => {      let img = new Image()      img.src = imageSrcArr[i]      img.onload = () => {        resolve(img)      }    })  }  imgloadPromiseArr.forEach(item => {    item.then(res => {      imageArr.push(`url(${(<HTMLImageElement>res).currentSrc})`)      index = imageArr.length    })  })  showImg.value = true  let repeat = true  function changeImage(InBox: HTMLDivElement) {    if (repeat) {      breakBox.style.zIndex = '-10'      count++      count = count === index ? 0 : count      repeat = false      setTimeout(() => {        repeat = true        breakBox.style.zIndex = '100'        let currentImageLength = count === index - 1 ? 0 : count + 1        InBox.style.backgroundImage = imageArr[currentImageLength]      }, 1000)    }  }  let count = 0  let index = 0  let breakBox: HTMLDivElement = document.querySelector('#break')!  let InBox: HTMLDivElement = document.querySelector('#InBox')!  InBox.style.backgroundImage = imageArr[1]  const appendDom = (dom: HTMLElement) => {    for (let i = 0; i < 100; i++) {      let div = document.createElement('div')      let div1 = document.createElement('div')      div.style.width = '76px'      div.style.height = '41px'      div1.style.width = '76px'      div1.style.height = '40px'      div1.style.overflow = 'hidden'      div.style.boxSizing = 'border-box'      div.style.backgroundImage = imageArr[0]      let positionX = -(i % 10) * 76 + 'px'      let positionY = -Math.floor(i / 10) * 40 + 'px'      div.style.backgroundPosition = positionX + ' ' + positionY      div.style.backgroundSize = '760px 400px'      let style = document.styleSheets[0]      style.insertRule(`@keyframes secondrotate${i}        {            0%,30%{                transform:scale(1)            }            70%            {transform: rotateX(${180 + Math.random() * 720}deg) rotateY(${180 + Math.random() * 720}deg)}            100%            {transform: rotateX(${180 + Math.random() * 720}deg) rotateY(${180 + Math.random() * 720}deg)}        }`)      style.insertRule(`@keyframes secondrotateS${i}        {            0%,32%{                transform:scale(1);opacity:1;            }70%            {transform: translateZ(${300 + Math.random() * 1500}px) translate(${(0.5 - Math.random()) * 500}px,${        (0.5 - Math.random()) * 500      }px);opacity:0}            100%            {transform: translateZ(${300 + Math.random() * 1500}px) translate(${(0.5 - Math.random()) * 500}px,${        (0.5 - Math.random()) * 500      }px);opacity:0}         }`)      div1.style.animation = `secondrotateS${i} 4.5s ease-out infinite`      div.style.animation = `secondrotate${i} 4.5s ease-out infinite`      div.style.transformOrigin = `center center`      div.addEventListener('animationstart', () => {        timer1.value = setTimeout(() => {          changeImage(InBox)          div.style.backgroundImage = imageArr[count]        }, 4000)      })      div.addEventListener('animationiteration', () => {        timer2.value = setTimeout(() => {          changeImage(InBox)          div.style.backgroundImage = imageArr[count]        }, 4000)      })      div1.appendChild(div)      dom.appendChild(div1)    }  }  appendDom(breakBox)})onUnmounted(() => {  typeof timer1 === 'number' && clearTimeout(timer1)  typeof timer2 === 'number' && clearTimeout(timer2)})</script> <style scoped>@import url('../../css/comment/animate.css');#animateBox {  width: 100vw;  height: calc(100vh - 50px);  //  background-color: rgba(255, 255, 255, 0.6);  #break {    position: absolute;    left: 0;    top: 0;    right: 0;    bottom: 0;    margin: auto;    width: 760px;    height: 400px;    display: flex;    perspective: 1000px;    transform-style: preserve-3d;    flex-wrap: wrap;    z-index: 100;  }  #InBox {    position: absolute;    left: 0;    top: 0;    right: 0;    bottom: 0;    margin: auto;    width: 760px;    height: 400px;    display: flex;    perspective: 1000px;    transform-style: preserve-3d;    flex-wrap: wrap;    z-index: 10;    background-size: 760px 400px;  }}</style>


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 手把手教你使用Vue3实现图片散落效果

相关文章

  • 2022-04-29Illustrator制作OSX风格磁铁图标
  • 2022-04-29浅析uni-app中设置导航栏和修改默认端口的方法
  • 2022-04-29看看使用uni-app如何编写一个五子棋小游戏
  • 2022-04-29织梦dedecms文章、软件发布页添加图片展示(增加多
  • 2022-04-29PetalBot-华为自研搜索引擎,这个蜘蛛就是花瓣蜘蛛,将来或许也会在国内再杀出一个搜索引擎
  • 2022-04-29聊聊怎么在小程序中实现一个可截断的瀑布流组件
  • 2022-04-29PHP如何重定向?浅谈跳转页面的3种方法
  • 2022-04-29大型企业网站的十大问题详解
  • 2022-04-29Photoshop制作冬季雪花字教程
  • 2022-04-29Photoshop制作时尚风格文艺海报教程

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • 手把手教你CSS如何实现毛玻璃效果
    • Photoshop制作一个古典的小木箱
    • PHP实用函数集合
    • 聊聊怎么在小程序中实现一个可截断的瀑布流组件
    • 2018最新手机号验证正则表达式方法
    • 详解PS进行IOS设计流程的诀窍
    • MySQL 日期加减函数汇总
    • dede 安全设置集合!dede站长必看!
    • PHP怎么遍历数组替换数组中的元素的值
    • 介绍PHP + MySQL 实现数据分页显示

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有