原生js简单实现放大镜特效

yizhihongxing

实现放大镜特效可以为网站或应用程序增加一些交互性和视觉吸引力。下面是一个完整攻略,包含了如何使用原生 JavaScript 实现放大镜特效的过程和两个示例说明。

实现放大镜特效

步骤一:HTML 结构

首先,我们需要创建一个 HTML 结构来容纳放大镜和原始图像。下面是一个示例:

<div class="container">
  <div class="image">
    <img src="image.jpg" alt="原始图像">
    <div class="magnifier"></div>
  </div>
</div>

上述代码中,我们创建了一个包含原始图像和放大镜的容器。原始图像使用 img 元素加载,放大镜使用 div 元素创建。

步骤二:CSS 样式

接下来,我们需要使用 CSS 样式来布局和样式化放大镜和原始图像。下面是一个示例:

.container {
  position: relative;
  width: 500px;
  height: 500px;
  margin: 50px auto;
}

.image {
  position: relative;
  width: 100%;
  height: 100%;
}

.image img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.magnifier {
  position: absolute;
  width: 200px;
  height: 200px;
  border: 2px solid #fff;
  border-radius: 50%;
  cursor: none;
  pointer-events: none;
  background-repeat: no-repeat;
  background-size: 100% 100%;
  visibility: hidden;
}

上述代码中,我们将 .container 元素的 position 属性设置为 relative,以使其成为相对定位元素。我们将 .image 元素的 position 属性设置为 relative,以使其成为相对定位元素。我们使用 object-fit 属性设置原始图像的填充方式。我们将 .magnifier 元素的 position 属性设置为 absolute,以使其成为绝对定位元素。我们将 .magnifier 元素的 width 和 height 属性设置为 200px,以使其成为圆形。我们使用 border 属性设置放大镜的边框。我们使用 border-radius 属性将放大镜变成圆形。我们使用 cursor 属性将鼠标指针设置为无形,以使其不影响用户体验。我们使用 pointer-events 属性将鼠标事件禁用,以使其不影响用户体验。我们使用 background-repeat 和 background-size 属性设置放大镜的背景图像。我们使用 visibility 属性将放大镜设置为不可见。

步骤三:JavaScript 代码

最后,我们需要使用 JavaScript 代码来实现放大镜特效。下面是一个示例:

var container = document.querySelector('.container');
var image = document.querySelector('.image');
var magnifier = document.querySelector('.magnifier');
var magnifierWidth = magnifier.offsetWidth;
var magnifierHeight = magnifier.offsetHeight;
var imageWidth = image.offsetWidth;
var imageHeight = image.offsetHeight;
var ratioX = imageWidth / magnifierWidth;
var ratioY = imageHeight / magnifierHeight;

image.addEventListener('mousemove', function(e) {
  var mouseX = e.pageX - container.offsetLeft;
  var mouseY = e.pageY - container.offsetTop;
  var posX = mouseX - magnifierWidth / 2;
  var posY = mouseY - magnifierHeight / 2;

  if (posX < 0) {
    posX = 0;
  }

  if (posY < 0) {
    posY = 0;
  }

  if (posX + magnifierWidth > imageWidth) {
    posX = imageWidth - magnifierWidth;
  }

  if (posY + magnifierHeight > imageHeight) {
    posY = imageHeight - magnifierHeight;
  }

  magnifier.style.left = posX + 'px';
  magnifier.style.top = posY + 'px';
  magnifier.style.backgroundImage = 'url(' + image.querySelector('img').src + ')';
  magnifier.style.backgroundPositionX = -posX * ratioX + 'px';
  magnifier.style.backgroundPositionY = -posY * ratioY + 'px';
});

image.addEventListener('mouseenter', function() {
  magnifier.style.visibility = 'visible';
});

image.addEventListener('mouseleave', function() {
  magnifier.style.visibility = 'hidden';
});

上述代码中,我们首先获取 .container 元素、.image 元素和 .magnifier 元素。我们使用 offsetWidth 和 offsetHeight 属性获取放大镜和原始图像的宽度和高度。我们使用 image.querySelector('img').src 获取原始图像的 URL。我们使用 ratioX 和 ratioY 变量计算放大镜和原始图像的比例。

我们使用 mousemove 事件监听器来监听鼠标移动事件。每次鼠标移动时,我们计算鼠标在 .container 元素中的位置,并将其减去 .magnifier 元素宽度和高度的一半,以使放大镜的中心与鼠标对齐。我们使用 if 语句确保放大镜不会超出原始图像的边界。我们使用 style 属性设置放大镜的位置和背景图像。我们使用 backgroundPositionX 和 backgroundPositionY 属性设置背景图像的位置。

我们使用 mouseenter 事件监听器来监听鼠标进入事件。每次鼠标进入时,我们将 .magnifier 元素的 visibility 属性设置为 visible,以使其可见。

我们使用 mouseleave 事件监听器来监听鼠标离开事件。每次鼠标离开时,我们将 .magnifier 元素的 visibility 属性设置为 hidden,以使其不可见。

示例

下面是两个示例,演示如何使用原生 JavaScript 实现放大镜特效。

示例一:放大镜特效

<div class="container">
  <div class="image">
    <img src="image.jpg" alt="原始图像">
    <div class="magnifier"></div>
  </div>
</div>
.container {
  position: relative;
  width: 500px;
  height: 500px;
  margin: 50px auto;
}

.image {
  position: relative;
  width: 100%;
  height: 100%;
}

.image img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.magnifier {
  position: absolute;
  width: 200px;
  height: 200px;
  border: 2px solid #fff;
  border-radius: 50%;
  cursor: none;
  pointer-events: none;
  background-repeat: no-repeat;
  background-size: 100% 100%;
  visibility: hidden;
}
var container = document.querySelector('.container');
var image = document.querySelector('.image');
var magnifier = document.querySelector('.magnifier');
var magnifierWidth = magnifier.offsetWidth;
var magnifierHeight = magnifier.offsetHeight;
var imageWidth = image.offsetWidth;
var imageHeight = image.offsetHeight;
var ratioX = imageWidth / magnifierWidth;
var ratioY = imageHeight / magnifierHeight;

image.addEventListener('mousemove', function(e) {
  var mouseX = e.pageX - container.offsetLeft;
  var mouseY = e.pageY - container.offsetTop;
  var posX = mouseX - magnifierWidth / 2;
  var posY = mouseY - magnifierHeight / 2;

  if (posX < 0) {
    posX = 0;
  }

  if (posY < 0) {
    posY = 0;
  }

  if (posX + magnifierWidth > imageWidth) {
    posX = imageWidth - magnifierWidth;
  }

  if (posY + magnifierHeight > imageHeight) {
    posY = imageHeight - magnifierHeight;
  }

  magnifier.style.left = posX + 'px';
  magnifier.style.top = posY + 'px';
  magnifier.style.backgroundImage = 'url(' + image.querySelector('img').src + ')';
  magnifier.style.backgroundPositionX = -posX * ratioX + 'px';
  magnifier.style.backgroundPositionY = -posY * ratioY + 'px';
});

image.addEventListener('mouseenter', function() {
  magnifier.style.visibility = 'visible';
});

image.addEventListener('mouseleave', function() {
  magnifier.style.visibility = 'hidden';
});

上述代码中,我们创建了一个包含原始图像和放大镜的容器。原始图像使用 img 元素加载,放大镜使用 div 元素创建。我们使用 JavaScript 代码实现了放大镜特效。

示例二:放大镜特效并添加缩略图

<div class="container">
  <div class="image">
    <img src="image.jpg" alt="原始图像">
    <div class="magnifier"></div>
  </div>
  <div class="thumbnails">
    <img src="thumbnail1.jpg" alt="缩略图1">
    <img src="thumbnail2.jpg" alt="缩略图2">
    <img src="thumbnail3.jpg" alt="缩略图3">
  </div>
</div>
.container {
  position: relative;
  width: 500px;
  height: 500px;
  margin: 50px auto;
}

.image {
  position: relative;
  width: 100%;
  height: 100%;
}

.image img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.magnifier {
  position: absolute;
  width: 200px;
  height: 200px;
  border: 2px solid #fff;
  border-radius: 50%;
  cursor: none;
  pointer-events: none;
  background-repeat: no-repeat;
  background-size: 100% 100%;
  visibility: hidden;
}

.thumbnails {
  display: flex;
  justify-content: center;
  margin-top: 20px;
}

.thumbnails img {
  width: 100px;
  height: 100px;
  margin-right: 10px;
  cursor: pointer;
  transition: all 0.3s ease;
}

.thumbnails img:hover {
  transform: scale(1.2);
}
var container = document.querySelector('.container');
var image = document.querySelector('.image');
var magnifier = document.querySelector('.magnifier');
var magnifierWidth = magnifier.offsetWidth;
var magnifierHeight = magnifier.offsetHeight;
var imageWidth = image.offsetWidth;
var imageHeight = image.offsetHeight;
var ratioX = imageWidth / magnifierWidth;
var ratioY = imageHeight / magnifierHeight;
var thumbnails = document.querySelectorAll('.thumbnails img');

for (var i = 0; i < thumbnails.length; i++) {
  var thumbnail = thumbnails[i];
  thumbnail.addEventListener('click', function() {
    var src = this.src.replace('thumbnail', 'image');
    image.querySelector('img').src = src;
  });
}

image.addEventListener('mousemove', function(e) {
  var mouseX = e.pageX - container.offsetLeft;
  var mouseY = e.pageY - container.offsetTop;
  var posX = mouseX - magnifierWidth / 2;
  var posY = mouseY - magnifierHeight / 2;

  if (posX < 0) {
    posX = 0;
  }

  if (posY < 0) {
    posY = 0;
  }

  if (posX + magnifierWidth > imageWidth) {
    posX = imageWidth - magnifierWidth;
  }

  if (posY + magnifierHeight > imageHeight) {
    posY = imageHeight - magnifierHeight;
  }

  magnifier.style.left = posX + 'px';
  magnifier.style.top = posY + 'px';
  magnifier.style.backgroundImage = 'url(' + image.querySelector('img').src + ')';
  magnifier.style.backgroundPositionX = -posX * ratioX + 'px';
  magnifier.style.backgroundPositionY = -posY * ratioY + 'px';
});

image.addEventListener('mouseenter', function() {
  magnifier.style.visibility = 'visible';
});

image.addEventListener('mouseleave', function() {
  magnifier.style.visibility = 'hidden';
});

上述代码中,我们创建了一个包含原始图像、放大镜和缩略图的容器。我们使用 JavaScript 代码为每个缩略图添加了一个点击事件监听器,以便在单击缩略图时更改原始图像。我们使用 CSS 样式为缩略图添加了一些样式,以使其更具交互性。我们使用 JavaScript 代码实现了放大镜特效。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生js简单实现放大镜特效 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 详解Angular结合zTree异步加载节点数据

    详解Angular结合zTree异步加载节点数据 简介 在使用zTree进行数据展示时,如果数据量比较大,需要异步加载节点数据,这时结合Angular可以方便地对节点数据进行管理和展示。 步骤 步骤1:引入zTree及相关插件 在HTML文件中引入zTree及其相关依赖JS和CSS文件。 <link rel="stylesheet"…

    css 2023年6月9日
    00
  • css实现虚线边框滚动效果的实例代码

    在网页设计中,边框是一个常见的元素,可以用来突出显示某个区域或者元素。虚线边框是一种常见的边框样式,可以用来实现一些特殊的效果,比如滚动效果。本文将提供一些关于如何使用 CSS 实现虚线边框滚动效果的方法,包括一些常见的 CSS 属性和示例说明。 CSS 属性 在 CSS 中,可以使用 border-style 属性来设置边框的样式。其中,dashed 表示…

    css 2023年5月18日
    00
  • 详解JS浏览器事件循环机制

    详解JS浏览器事件循环机制 什么是事件循环机制 事件循环是指JavaScript在运行过程中对各种事件进行处理的一种机制。它主要用来处理异步任务,比如定时器、事件监听等,以及它们的回调函数。 事件循环的四个主要组成部分 事件循环机制主要由以下四个部分组成: 调用栈(call stack) – 用于存储当前正在执行的代码,遵循先进先出(FIFO)的原则。如果当…

    css 2023年6月10日
    00
  • IDEA快捷键大全 快速页面重构

    IDEA快捷键大全 快速页面重构 为什么需要快捷键 在日常的开发工作中,大部分的时间都是在敲击键盘,不可避免地遇到了大量的重复操作。如果每次都用鼠标去慢慢点,效率自然是低下的。而快捷键可以帮助我们快速完成一些常用操作,提高开发效率,减少重复劳动。 IDEA快捷键大全 以下列出一些常用的 IDEA 快捷键,相关操作请自行了解。 快捷键 描述 Ctrl + Al…

    css 2023年6月10日
    00
  • 详解CSS3 弹性布局快速入门

    详解CSS3 弹性布局快速入门 弹性布局的概念 弹性布局是一种基于盒子模型的格式化布局模式,主要用于解决传统布局中的一些问题,如自适应宽度、水平居中、竖直居中等。 在弹性布局中,容器被分为两个部分:弹性容器(flex container) 和 弹性项目(flex item)。 弹性容器是一个包含了所有弹性项目的容器,类似于传统布局中的元素容器。而弹性项目则是…

    css 2023年6月10日
    00
  • 日常收藏的jquery技巧

    下面我会详细讲解“日常收藏的jquery技巧”的完整攻略。 日常收藏的jquery技巧 选择器 基本选择器 在jQuery中,选择器可以帮助我们找到HTML页面中指定的元素。在使用选择器时,我们可以使用以下几个基本选择器: * (星号):选择所有元素 element:选择指定元素名的元素,例如p、h1、div #id:选择指定id的元素,例如#header …

    css 2023年6月11日
    00
  • js实现点击向下展开的下拉菜单效果代码

    实现点击向下展开的下拉菜单效果可以使用HTML和JavaScript来完成,下面是详细步骤: HTML 首先,在HTML中需要创建一个下拉菜单的结构,包含一个触发下拉菜单的按钮和一个下拉菜单框,如下所示: <div class="dropdown"> <button class="dropbtn"&g…

    css 2023年6月10日
    00
  • 兼容firefox,chrome的网页灰度效果

    实现网页灰度效果的方法一般有以下两种: 方法一:使用CSS3滤镜 CSS3提供了一种filter属性来实现图像的处理效果,其中的grayscale()函数可以将彩色图像转换为灰度图像。 以下是实现灰度效果的CSS代码: .grayscale { filter: grayscale(100%); -webkit-filter: grayscale(100%);…

    css 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部