普及知识:放大镜特效涉及到的几个值
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. 鸿蒙NEXT自定义组件:太极Loading

    [引言](完整代码在最后面) 本文将介绍如何在鸿蒙NEXT中创建一个自定义的"太极Loading"组件,为你的应用增添独特的视觉效果. [环境准备] 电脑系统:windows 10 ...

  2. Firefox无需第三方插件在关闭最后一个标签后也不退出程序

    about:config 输入lasttab 变成false

  3. Codeforces Round 971 (Div. 4) E 题解析

    # E题 Klee's SUPER DUPER LARGE Array!!! 题目描述 思路: 对于这道题,首先观察到题目求的是最小可能值,而且数据的范围是1e9范围,所以首先可以考虑的方法就是O(l ...

  4. Jx.Cms开发笔记(三)-Views主题动态切换

    效果展示 我们可以在后台动态切换主题 目前Jx.Cms有两个主题,其中一个是默认主题,另一个是仿的Blogs主题. 我们可以通过点击启用按钮来动态切换两个主题. 实现方法 首先写一个实现IViewLo ...

  5. S2P销讯通-SFE人才对企业管理层至关重要

    SFE这一概念,最初由外资企业引入,如今已逐渐被内资企业所采纳并融入其组织结构中,不少企业正积极构建这一部门. 1 我们观察到,近两年企业内对于SFE部门所需的人才需求急剧上升.这一部门,在外资企业中 ...

  6. css var实现网页换肤

    前情 最近在做需求开发,要求根据后台传来的配置对网页换肤,按以往的换肤思路应该是写好几套样式做切换达到换肤效果,但是现在想做到能根据后台配置动态修改. 原理 通过css3新增变量特性,把颜色定义为变量 ...

  7. OS之《CPU调度》

    CPU调度层次 高级调度:是作业调度.将外村的作业加载到内存里,分配对应的资源,然后加入就绪队列 低级调度:将就绪队列中的进程调度到CPU执行 中级调度:为了提高内存的利用率和系统的吞吐量,将暂时不能 ...

  8. Jetpack Compose学习(15)——Pager组件的使用(对标ViewPager)

    原文地址: Jetpack Compose学习(15)--Pager组件的使用(对标ViewPager)-Stars-One的杂货小窝 从名字可以看出,Pager这个就是ViewPager的替代产物 ...

  9. ABS函数:C语言与Excel中的绝对值计算

    ABS函数:C语言与Excel中的绝对值计算 ABS函数在不同的编程和计算环境中有着相似但又有所区别的用途.在本文中,我们将重点探讨ABS函数在C语言中的应用,同时也会结合Excel中的ABS函数进行 ...

  10. 在 ASP.NET Core 2.1 之后与 HttpClient 工厂一起使用 Polly

    在 ASP.NET Core 2.1 之后与 HttpClient 工厂一起使用 Polly 在 ASP.NET Core 2.1 中提供的 HttpClient factory 提供了一种预配置 H ...