一个有趣的图片过度动画效果

前言

昨天在网上冲浪的时候,看到了一个关于AI修正图片的网站(GoEnhance AI - Video to video, Image enhancer and upscaler),这个网站上面有一个图片过渡的效果,就是根据你的鼠标移动来改变图片的展示效果。

实现原理

我看到这个效果的一瞬间就感到很好玩,于是就想了想怎么实现它,发现还是很简单的。

首先

我们先创建一个大盒子(.container),在它里面创建两个子盒子(.box),再在这两个盒子里面分别添加一个img图片标签。(ps:当然你也可以直接将图片放到子盒子中,当它们的背景图片)

ini 复制代码
<div class="container" id="container">
      <div class="box">
        <img src="./images/at.jpg" alt="你自己图片地址">
      </div>
      <div class="box" id="box2">
        <img src="./images/gs.jpg" alt="你自己图片地址">
      </div>
      <div class="line" id="line"></div>
 </div>

然后

我们开始写css样式。

css 复制代码
 * {
        margin: 0;
        padding: 0;
      }
      .container {
        width: 500px;
        height: 500px;
        margin: 0 auto;
        position: relative;
      }
      .box {
        width: 100%;
        text-align: center;
        position: absolute;
        overflow: hidden;
      }
      img {
        height: 500px;
      }
      .box:nth-child(2) {
        width: 50%;
      }
      .line{
        content: '';
        position: absolute;
        height: 100%;
        border: 1px solid #000;
        left: 50%;
        transform: translate(50%);
      }

最后

我们开始写js执行脚本,思路是先获取.cantainer、.line和.box2的元素节点,然后再在 .cantainer盒子上面绑定一个鼠标移动事件,再然后获取鼠标在视图上的x轴的位置和.cantainer在视图上的x轴的位置,将它们相减就可以得到鼠标在.cantainer上的位置了,最后把它赋值给.line和.box2上面就好。js代码如下:

ini 复制代码
var con = document.getElementById('container')
    var line = document.getElementById('line')
    var box2 = document.getElementById('box2')
    con.addEventListener('mousemove', (event)=>{
        var mouseX = event.clientX

        var boxRect = con.getBoundingClientRect()
        var boxX = boxRect.left

        var offsetX = mouseX - boxX

        
        line.style.left = `${offsetX}px`
        box2.style.width = `${offsetX}px`
        console.log(offsetX)
    })
   console.log(con.style)

实现效果

相关推荐
我有满天星辰28 分钟前
Vue 3 响应式双雄:ref 与 reactive 完全指南
前端·javascript·vue.js
随风一样自由9 小时前
【前端独角兽】刚进入前端领域的前端开发用jQuery还是Vue3?
前端·javascript·vue3·jquery
YHHLAI10 小时前
[特殊字符] 面试中的 Promise —— 从入门到精通
前端·javascript·面试
weixin_BYSJ198710 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
沪飘大军11 小时前
ll-llm:一个零依赖、可插拔的 OpenAI 兼容 LLM 代理
javascript
山河木马13 小时前
GPU自动处理专题3-NDC怎么映射成屏幕像素坐标(视口变换)
javascript·webgl·图形学
Appthing14 小时前
在 TanStack Start 中使用 VitePWA 的正确配置
javascript
前端炒粉15 小时前
手写promise
java·前端·javascript
mONESY15 小时前
Node.js fs 文件系统模块 四种读写方案全解析
javascript·后端
Larcher15 小时前
从回调地狱到优雅异步:Node.js 文件操作进化史
javascript·后端·架构