JavaScript练手小技巧:仿米哈游官网人物跟随鼠标位移效果

news2024/11/28 20:45:16

最近,有同学找到我,说:老师,我想模仿米哈游官网。

我说:可以,很不错的。

她说:有些效果有点难,能不能帮我看下。

于是,我就简单大概粗糙的讲解了下大致的原理,毕竟米哈游官网不是那么好仿的。

今天,太累了,就突然想到这个,就模仿其中一个效果来做做。

代码已经挂在gitee 上了。(话说,我让大家把作业挂上gitee,但是总有那么几个同学不做,哎)

源码地址:my-practice: 我自己的练习仓库,仅供学习使用。 - Gitee.com

预览地址:仿米哈游官网人物跟随鼠标位移效果

一、HTML

 <div class="wrapper" id="wrapper">
        <div class="imgs" id="imgs">
            <img src="images/1.png" alt="">
            <img src="images/2.png" alt="">
            <img src="images/3.png" alt="">
        </div>
        <div class="text">
            Lorem ipsum dolor sit amet consectetur adipisicing elit. Sequi reiciendis nesciunt minus, vel quibusdam quidem numquam pariatur, obcaecati voluptatem, nostrum quaerat eum sint omnis amet. Soluta quam explicabo nemo harum eveniet aperiam reiciendis beatae quia, ipsum dignissimos. Porro eaque velit delectus, in atque, ullam sequi itaque molestiae enim ab laudantium quis quo aliquid beatae omnis distinctio. Nobis amet eveniet assumenda accusamus totam voluptate praesentium. Sunt ducimus voluptates, nam, sit dolore corrupti obcaecati saepe consectetur voluptate corporis fugiat? Excepturi aperiam tempore dicta odit ratione accusamus suscipit ut quam odio, ducimus facilis aspernatur nisi laboriosam dolor reiciendis nulla assumenda, qui dolores. Sequi?
        </div>
    </div>

一个大 wrapper 把整个内容套起来。

这个 wrapper 会跟鼠标联动,基于鼠标在其中的位置控制图片的位移。

div.imgs 放三方图片,图片均来自mihoyo官网。

div.text 则是凑数的,模拟mihoyo官网文本内容。

二、CSS

写的 SCSS

html{
    font-size: 100px;
}
body{
    font-size: 0.16rem;
}

.wrapper{
    width: 100vw;
    min-width: 1400px;
    height: 90vh;
    margin-top: 10vh;
    background: #eee;
    display: flex;
    justify-content: center;
    align-items: center;
}
.imgs{
    width: 10rem;
    height: 6.14rem;
    background: #ccc;
    position: relative;
    overflow: hidden;
    img{
        position: absolute;
        bottom:0;
        transform: translateX(0);
        transition:all 0.4s linear;
        &:nth-child(1){
            margin-left: 60%;
        }
        &:nth-child(2){
            margin-left: -10%;
        }
        &:nth-child(3){
            margin-left: 30%;
        }
    }
}
.text{
    width: 4rem;
    height: 6rem;
    margin-left: 0.4rem;
}

关键点就在于,让图片绝对定位,div.imgs 相对定位。

考虑到图片要产生位移动画,就给图片添加了过渡动画 transition 。

三、JS

关键点:

1. 要通过JS 获取 鼠标在 div.wrapper 里的位置。利用了 DOM 的 getBoundingClientRect() 方法。

具体可以参考博主这篇文章:100%经典文章:JS如何获取鼠标在一个标签中的坐标_获取标签的坐标-CSDN博客

2. 鼠标位移的距离,是以 div.wrapper 的中线为参考。鼠标在左,图片右移;鼠标在右,图片左移。

3. 每张图片都移动,每张图移动到距离还不一样。简化操作,就让图片位移 translateX 一定的百分比(这个百分比是以图片宽度为参考)。利用循环,让每个图片都位移百分比有偏差。这样,每个图片位移的距离就不同,产生了视觉差。

完整代码:(模仿,跟官网原版效果还是有出入)

// 获取图片元素,wrapper元素
let imgs = document.getElementById('imgs').querySelectorAll('img');
let wrapper = document.getElementById('wrapper');
// 获取鼠标位置
function getMousePos(e) {
    let rect = wrapper.getBoundingClientRect();
    return {
        x: e.clientX - rect.left,
        y: e.clientY - rect.top
    };
}
// 鼠标移动事件
function moveImg(e) {
    let mousePos = getMousePos(e);  // 获取鼠标在wrapper里的坐标
    let x = (mousePos.x / wrapper.offsetWidth) * 100;  // 计算图片移动距离百分比
    let xP = (x - 50)/50;  //  50%为图片宽度的一半,计算图片移动距离百分比
    imgs.forEach((img,index) => {  // 每张图片都移动,移动距离为 (5 + 索引数据)% 图片宽度
        img.style.transform = `translateX(${-xP*(5+index*2)}%)`;
    });
}
wrapper.addEventListener('mousemove', moveImg);

完毕~!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity学习(78)--unity调试--长痛不如短痛

1.在vs2022中&#xff0c;工具--获取工具与功能。 2. 安装图中工具&#xff0c;原来我早就安装了。 3 f9下断 同时点击图中按钮 vs此时变为如下状态 unity中出现如下提示&#xff1a; 4 在unity中运行游戏&#xff0c;vs这边确实成功断住了&#xff01;

柔数组的介绍

柔数组简单介绍 这个词你可能没有听过但是他的确是存在的。 1.在c99中结构中的最后⼀个元素允许是未知⼤⼩的数组&#xff0c;这就叫做『柔性数组』成员 2这就代表了它存在与结构体中&#xff0c;很重要的一点是&#xff0c;他只能是结构体的最后的一个成员&#xff0c;这是…

面向对象特征二:继承

继承的概述 生活中的继承 财产继承&#xff1a; 绿化&#xff1a;前人栽树&#xff0c;后人乘凉 “绿水青山&#xff0c;就是金山银山” 样貌&#xff1a; 继承之外&#xff0c;是不是还可以"进化"&#xff1a; 继承有延续&#xff08;下一代延续上一代的基因、财…

动态内存管理【malloc,calloc,realloc和free的理解】【柔性数组的概念】

一.为什么要有动态内存分配 我们知道&#xff0c;当我们创建变量的时候&#xff0c;我们会向系统申请一定大小的空间内存。比如int a10或者int arr[10]&#xff1b;我就向内存申请了4或者40个字节的大小来存放数据。但是当我们一旦申请好这个空间&#xff0c;大小就无法调整了…

Linux部署Kafka2.8.1

安装Jdk 首先确保你的机器上安装了Jdk&#xff0c;Kafka需要Java运行环境&#xff0c;低版本的Kafka还需要Zookeeper&#xff0c;我此次要安装的Kafka版本为2.8.1&#xff0c;已经内置了一个Zookeeper环境&#xff0c;所以我们可以不部署Zookeeper直接使用。 1、解压Jdk包 t…

缓存和缓存的常用使用场景

想象一下,一家公司在芬兰 Google Cloud 数据中心的服务器上托管一个网站。对于欧洲用户来说,加载可能需要大约 100 毫秒,但对于墨西哥用户来说,加载需要 3-5 秒。幸运的是,有一些策略可以最大限度地减少远程用户的请求延迟。 这些策略称为缓存和内容交付网络 (CDN),它们是…

HarmonyOS实战开发-使用List组件实现导航与内容联动的效果。

1 卡片介绍 使用ArkTS语言&#xff0c;实现一个导航与内容二级联动的效果。 2 标题 二级联动&#xff08;ArkTS&#xff09; 3 介绍 本篇Codelab是主要介绍了如何基于List组件实现一个导航和内容的二级联动效果。样例主要包含以下功能&#xff1a; 切换左侧导航&#xff…

OSCP靶场--Sorcerer

OSCP靶场–Sorcerer 考点(feroxbuster目录扫描zip包隐藏文件发现公钥私钥公钥覆盖私钥登陆suid start-stop-daemon提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.100 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.or…

nodejs下载安装以及npm、yarn安装及配置教程

1、nodejs下载安装 ​ 1.1、使用nodejs版本管理工具下载安装&#xff0c;可一键安装、切换不同nodejs版本&#xff0c; nvm-setup.zip&#xff1a;安装版&#xff0c;推荐使用 本次演示的是安装版。 1、双击安装文件 nvm-setup.exe 选择nvm安装路径 例如&#xff1a;E:\Soft…

STL中容器、算法、迭代器

STL标准模板库封装了常用的数据结构和算法&#xff0c;让程序员无需太关心真实的数据结构实现。 容器 容器&#xff1a;用来存放数据的。 STL容器就是将运用最广泛的的一些数据结构实现出来。 常用的数据结构有&#xff1a;数组、链表、树、栈、队列、集合、映射表。 这些…

印度神体系与编程思维

印度神体系中存在三大主神&#xff1a;至高神梵天、毗湿奴以及湿婆。 1.神的类型抽象与神性优先级&#xff1a; 每一个神都掌握着世间中所存在的规律&#xff0c;比如天界里因陀罗&#xff08;帝释天&#xff09;等神掌控风火水电。换句话说&#xff0c;每一个可以抽象出来的世…

怎么把照片容量变小?图片压缩技巧分享

照片文件通常占据大量存储空间&#xff0c;特别是在拍摄高分辨率照片或大量照片的情况下&#xff0c;通过减小照片文件大小&#xff0c;可以节省设备内部存储或外部存储介质上的空间&#xff0c;使您能够容纳更多的照片。 打开压缩网站&#xff0c;点击选择图片压缩&#xff0…

JUC高并发编程详解

大家好&#xff0c;欢迎来到这篇关于JUC&#xff08;Java Util Concurrent&#xff09;高并发编程的博客&#xff01;在这个数字时代&#xff0c;我们的软件需求越来越庞大&#xff0c;而对于高并发编程的需求也日益迫切。在Java的世界里&#xff0c;JUC就像一位强大的武士&…

Mamba: Linear-Time Sequence Modeling with Selective State Spaces(论文笔记)

What can I say? 2024年我还能说什么&#xff1f; Mamba out! 曼巴出来了&#xff01; 原文链接&#xff1a; [2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Mamba: Linear-Time …

线程池-2:runWorker分析-1

为何runWorker中在task被当前worker中的当前线程获取到准备执行task时需要进行worker.lock()? 如下图&#xff1a; 1、某个worker中的run逻辑只会被worker中包装的线程进行执行&#xff1b; 2、按理说&#xff1a;不会存在多个线程并发执行同一个worker中的runWorker()逻辑&a…

蓝桥杯真题Day41 倒计时13天 纯练题,该开始复习知识点了!

蓝桥杯第十二届省赛真题-分果果 题目描述 小蓝要在自己的生日宴会上将 n 包糖果分给 m 个小朋友。每包糖果都要分出去&#xff0c;每个小朋友至少要分一包&#xff0c;也可以分多包。 小蓝将糖果从 1 到 n 编号&#xff0c;第 i 包糖果重 wi。小朋友从 1 到 m 编号。每个小朋…

Codeforces Round 838 (Div. 2) D. GCD Queries

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

SpringCloud下的微服务应用技术(结尾篇)

六. Feign远程调用 6.1 替代RestTemplate RestTemplate调用问题&#xff1a;代码可读性差&#xff0c;参数复杂且URL难维护。 Feign是一个声明式的HTTP客户端&#xff0c;官方地址&#xff1a;GitHub - OpenFeign/feign: Feign makes writing java http clients easier 它可…

安装DPDK环境

安装DPDK环境 下载解压源码 wget https://fast.dpdk.org/rel/dpdk-19.08.2.tar.xz tar -xcf ./dpdk-19.08.2.tar.xz安装源码 1.处理库文件 编译库文件 ./dpdk-setup.sh 根据操作系统选择对应gcc库文件2.设置环境变量 配置多网卡队列和巨页 ethernet1.virtualDev "vm…

车载以太网AVB交换机 TSN交换机 时间敏感网络 11口 千兆 SW2000TSN

目录 一、TSN时间敏感交换机概述 二、产品介绍 SW2000M/H TSN 1、产品框架 2、产品特点与参数 产品特点 产品参数 3、配置与使用 4、常用连接方式 4.1 双通道作为监控和数据采集器&#xff0c;采集两个设备间的通信数据&#xff08;Bypass功能&#xff09; 4.2 试验搭…