普及知识:放大镜特效涉及到的几个值
offsetWidth    获取元素的宽度
offsetHeight  获取元素的高度
offsetLeft父元素没有定位时,获取元素距离页面的左边距,父元素有定位时,获取元素距离父元素的左边距
offsetTop父元素没有定位时,获取元素距离页面的上边距,父元素有定位时,获取元素距离父元素的上边距
clientX  离视口左边的距离
clientY  离视口上边的距离
onmousemove  鼠标移动事件
onmouseover  鼠标划过事件

主要思路:

1.点击缩略图,中图和大图一块切换
    2.鼠标移动到中图时显示大图,并显示放大镜阴影部分
    3.当在中图上移动时 阴影部分的放大镜跟着移动,大图也跟着移动
    4.鼠标从中图移除时,大图隐藏   阴影部分的放大镜也隐藏。
    5.处理边界值

* {
margin: 0;
padding: 0;
list-style: none;
} .container {
width: 1000px;
height: 600px;
margin: 50px auto;
font-size: 0;
} .left-img {
width: 490px;
height: 510px;
margin-right: 16px;
border: 1px solid #eee;
display: inline-block;
/* 图片 */
background-image: url(./images/imgA_2.jpg);
background-repeat: no-repeat;
background-position: center;
background-size: cover;
/* 遮罩层相对我进行定位 */
position: relative;
}
.mask {
width: 230px;
height: 230px;
background-image: url(./images/bg.png);
position: absolute;
top: 0;
left: 0;
opacity: 0;
}
.right-img {
width: 490px;
height: 510px;
border: 1px solid #eee;
display: inline-block;
background-image: url(./images/imgA_3.jpg);
background-repeat: no-repeat;
opacity: 0;
} .img-list-wrapper {
width: 490px;
text-align: center;
margin-top: 10px;
}
.img-list {
display: inline-block;
}
.img-list li {
display: inline-block;
width: 60px;
height: 60px;
margin: 0 5px;
cursor: pointer;
/* background-image: url(./images/imgA_1.jpg); */
background-repeat: no-repeat;
/* border: 2px solid #000; */
border: 1px solid #eee;
}
.img-list li.active{
border: 1px solid #000;
}
//数据逻辑  界面逻辑 事件逻辑
// 单一元素
function $(selector) {
return document.querySelector(selector);
} // 多个元素
function $$(selector) {
return document.querySelectorAll(selector);
} // 初始化数据图片
var imgs = {
// 小图
small: ['imgA_1.jpg', 'imgB_1.jpg', 'imgC_1.jpg'],
// 中图
middle: ['imgA_2.jpg', 'imgB_2.jpg', 'imgC_2.jpg'],
// 大图
large: ['imgA_3.jpg', 'imgB_3.jpg', 'imgC_3.jpg']
}
var smallImge = $('.img-list');
var minddleImage = $('.left-img');
var bigImage = $('.right-img');
var mask = $('.mask');
function initSmall(){
var html='';
for(var i = 0;i<imgs.small.length;i++){
html+='<li style="background-image:url(./images/'+imgs.small[i]+') "></li>';
}
smallImge.innerHTML=html;
//默认选中第一个
$('.img-list li').className = 'active';
} function init(){
initSmall();
bindEvent();
}
var bindEvent = function(){
//事件委托绑定事件 其原理是用事件的冒泡实现的
//小图切换大图事件
smallImge.addEventListener('click', smallImgeHandle);
//放大镜事件
//鼠标移动 和 鼠标 离开
minddleImage.addEventListener('mousemove', mouseHandle);
minddleImage.addEventListener('mouseleave',leaveHandle)
}
var smallImgeHandle = function(e){
console.dir(e.target.tagName)
if(e.target.tagName === 'LI'){
//将之前选中的项的状态取消掉
var selected = $('.img-list .active');
if(selected){
selected.className = '';
}
e.target.className = 'active'; //切换中图和大图
//先取到 目标元素在列表中的下标
var lis = smallImge.querySelectorAll('li');
var index = [].indexOf.call(lis,e.target);
minddleImage.style.backgroundImage = 'url(./images/'+imgs.middle[index]+')';
bigImage.style.backgroundImage = 'url(./images/'+imgs.large[index]+')';
}
}
var mouseHandle = function(e){
console.log(123);
mask.style.opacity = 1;
bigImage.style.opacity = 1;
var cx = e.clientX;//鼠标点离视口的左边距离
var cy = e.clientY;//鼠标点离视口的上边距离
var mcx = minddleImage.offsetLeft;//中图的容器离视口的左边距离
var mcy = minddleImage.offsetTop;//中图的容器离视口的上边距离
var left = cx - mcx - mask.offsetWidth / 2; //mask离中图的容器的左边距离
var top = cy - mcy - mask.offsetHeight / 2;//mask离中图的容器的上边距离
// 注意点:设置元素的尺寸和位置会导致浏览器reflow 浏览器为了优化性能不会立马reflow 会等到最后都设置完之后 会进行一次reflow
var maxLeft = minddleImage.offsetWidth - mask.offsetWidth;//最大左侧偏移量
var maxTop = minddleImage.offsetHeight - mask.offsetHeight;//最大头部偏移量
console.log('left:'+left)
console.log('top:'+top) //处理边界条件
if(left<=0){
left = 0;
}
if(top<=0){
top = 0;
}
if(left>=maxLeft){
left = maxLeft;
}
if(top>=maxTop){
top = maxTop;
}
mask.style.left = left + 'px';
mask.style.top = top + 'px';
//移动大图的偏移量
bigImage.style.backgroundPositionX = -left + 'px';
bigImage.style.backgroundPositionY = -top + 'px';
}
var leaveHandle = function(){
mask.style.opacity = 0;
bigImage.style.opacity = 0;
}
init();

手撸原生js放大镜效果的更多相关文章

  1. 原生js放大镜效果

    效果: 1.  鼠标放上去会有半透明遮罩.右边会有大图片局部图 2.  鼠标移动时右边的大图片也会局部移动 放大镜的关键原理: 鼠标在小图片上移动时,通过捕捉鼠标在小图片上的位置,定位大图片的相应位置 ...

  2. 原生js动画效果(源码解析)

    在做页面中,多数情况下都会遇到页面上做动画效果,大部分都是用jquery来实现动画,今天正好看到一篇原生js实现动画效果的代码,特分享在此. 原文地址:http://www.it165.net/pro ...

  3. 最全js 放大镜效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 基于canvas的原生JS时钟效果

    概述 运用html5新增画布canvas技术,绘制时钟效果,无需引用任何插件,纯js. 详细 代码下载:http://www.demodashi.com/demo/11935.html 给大家介绍一个 ...

  5. jS放大镜效果

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="demo4.aspx.cs& ...

  6. 手机端原生js实现下拉刷新数据

    HTML结构如下: <div class="outerScroller comment"> <div class='scroll comment'> < ...

  7. 原生js手风琴效果

    //js代码 //获取li var list = document.getElementsByTagName("li")[0]; //遍历  排他 for( var i=0;i&l ...

  8. 原生js实现的放大镜效果

    这是我用原生js写的放大镜效果,与各种各样的框架技术相比,我喜欢使用原生的js,在这里,想和大家一起谈谈原生和框架技术的理解与个人喜好. <!DOCTYPE HTML><html&g ...

  9. js 动画效果实现

    1. 实现方式 - 应用场景 自己写 - 简单的.不用 jq 的项目 jq - 普通动画 成熟插件 - 复杂动画 2. 相关文章 JavaScript基于时间的动画算法 九种原生js动画效果 Twee ...

  10. JS里关于事件的常被考察的知识点:事件流、事件广播、原生JS实现事件代理

    1.JS里面的事件流 DOM2级事件模型中规定了事件流的三个阶段:捕获阶段.目标阶段.冒泡阶段,低版本IE(IE8及以下版本)不支持捕获阶段 捕获事件流:Netscape提出的事件流,即事件由页面元素 ...

随机推荐

  1. 2个月搞定计算机二级C语言——真题(10)解析

    1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题10 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> #pragma warning ...

  2. GIt分布式管理工具

    Git(分布式版本控制工具) Git的学习是不依赖我们前面学习的知识,就算没有学习java也可以学习 Git就是一个类似于百度云盘的仓库 重点是要掌握使用idea操作Git,企业用的最多,一般不会去使 ...

  3. 2025年前端面试准备css篇

    1.css 盒子模型 css包含了内容(content) ,内边距(padding),边框(border),外边距(margin) 等因素. css 标准盒子模型宽包括:margin+border+p ...

  4. excel/xlsx 空值判断NaN

    从numpy导入nan类型,以此判断NaN类型

  5. Graylog之告警

    官方文档:https://docs.graylog.org/en/3.0/index.html 前面我们已经了解了Graylog的搭建,以及日志的接入方法.我们知道graylog可以将收集的的日志通过 ...

  6. Windows下的终端工具-Terminal

    文档:https://docs.microsoft.com/zh-cn/windows/terminal/ Windows 终端是一个面向命令行工具和 shell(如命令提示符.PowerShell ...

  7. Python之pandas读取Excel

    #! -*- coding utf-8 -*- """ 模块功能:读取当前文件夹下的Source里的Excel文件,显示其相关信息 说明:默认把Excel的第一行当做列名 ...

  8. Codeforces Round 732 (Div

    AquaMoon and Strange Sort 有 \(n\) 个人从左到右站成一排,从左数第 \(i\) 个人的衣服上印着 \(a_i\).每个人的朝向可以是朝左.朝右.一开始所有人的方向都是朝 ...

  9. offline RL · PbRL | LiRE:构造 A>B>C 的 RLT 列表,得到更多 preference 数据

    论文标题:Listwise Reward Estimation for Offline Preference-based Reinforcement Learning,ICML 2024. arxiv ...

  10. 使用 Jmeter进行压测

    一.环境配置 因为jmeter需要java环境,所以需要下载Jdk和Jmeter.需要注意jdk的版本和jmeter的匹配问题 推荐大家观看Furion的作者百小僧的视频来学习,讲的很细 https: ...