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

实现放大镜特效可以为网站或应用程序增加一些交互性和视觉吸引力。下面是一个完整攻略,包含了如何使用原生 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日

相关文章

  • JS原生双栏穿梭选择框的实现示例

    要实现一个JS原生的双栏穿梭选择框,我们需要做如下的步骤: 步骤一:准备HTML结构 首先,我们需要创建一个HTML结构,包含两个选择框和一些操作按钮。示例如下: <div class="transfer-container"> <div class="transfer-left"> <h…

    css 2023年6月10日
    00
  • JS仿QQ好友列表展开、收缩功能(第一篇)

    下面我将详细讲解 “JS仿QQ好友列表展开、收缩功能(第一篇)” 的完整攻略。 简介 本篇文章主要是介绍如何使用 JavaScript 编写一个仿 QQ 好友列表的展开、收缩功能,实现点击好友分组,可以收缩或展开该分组中的好友。 HTML结构 我们先来看一下需要实现的 HTML 结构: <div class="friend-list&quot…

    css 2023年6月10日
    00
  • 浏览器全屏显示背景图片的css样式与html结构

    要实现浏览器全屏显示背景图片,需要使用CSS的background-size属性和HTML的一些结构布局。 以下是具体的步骤: 首先,创建一个div元素,作为要设置背景图片的容器。可以使用如下代码: <div class="container"></div> 接着,在CSS样式表中设置该容器的宽度、高度、背景图片、…

    css 2023年6月9日
    00
  • CSS中的四种定位区别详解

    CSS中的四种定位区别详解 在CSS中,常见的定位方式有四种:静态定位、相对定位、绝对定位和固定定位。这些定位方式的选择取决于布局的需要和效果的要求。 静态定位 静态定位是默认的定位方式,元素总是处于文档流中的正常位置。使用静态定位时,top、right、bottom、left属性将不会起作用,也不支持z-index属性。静态定位可以使用以下方式来设置: p…

    css 2023年6月9日
    00
  • 浅谈css双飞翼布局和圣杯布局

    CSS双飞翼布局和圣杯布局都是常见的网页布局方式,它们都是基于盒子模型的布局方式。下面我们将详细讲解这两种布局的实现方法和优缺点。 CSS双飞翼布局 简介 CSS双飞翼布局是一种三栏布局方式,它使用了相对定位和自身的负边距来实现。与传统的三栏布局方式不同,CSS双飞翼布局没有使用浮动或者定宽度的方式来实现。 实现方法 HTML结构 <div class…

    css 2023年6月9日
    00
  • r.js来合并压缩css文件的示例

    我们来详细讲解一下如何使用r.js来合并压缩CSS文件。在开始前,需要先确认以下两点: 确保已经安装了Node.js和r.js 准备好需要合并压缩的CSS文件 流程大致如下: 创建一个配置文件 运行r.js进行压缩合并 下面我们将具体讲解这两个步骤。 1.创建一个配置文件 在命令行中进入包含CSS文件的目录,输入以下命令: r.js -cssIn=style…

    css 2023年6月9日
    00
  • jQuery的animate函数学习记录

    jQuery的animate函数学习记录 本文将详细介绍 jQuery 的 animate 函数的使用方法和注意事项。 简介 animate() 方法是 jQuery 核心库中最常用的方法之一,它通常用于实现页面元素的动态效果。通过使用 animate() 方法,我们可以在一定的时间段内(如1000毫秒)逐步地改变一个元素的属性(如位置、大小、背景色等),从…

    css 2023年6月11日
    00
  • Vue浅析axios二次封装与节流及防抖的实现

    Vue浅析axios二次封装与节流及防抖的实现 1. axios二次封装 在我们的Vue项目中,使用axios进行网络请求已经成为了非常常见的做法。为了更好的维护代码、方便复用,我们需要对axios进行二次封装,使其使用更方便、简洁。 在这个过程中,我们可以实现一些公共的功能,比如统一处理错误请求、设置请求头、拦截请求等等。例如: import axios …

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