普及知识:放大镜特效涉及到的几个值
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. mysql 触发器阻止不合理数据插入

    今天看到有人问如何判断处理有不符合的数据阻止插入.比如这个数据只能在90天内存在一条,如果有了就拒绝插入. 当然大家都说用代码判断,判断一下90天内是否有数据,有就拒绝. 我这里说一个使用触发器的思路 ...

  2. Blazor 组件库 BootstrapBlazor 中EditorForm组件介绍

    组件介绍 EditorForm 组件是一个非常实用的组件,当进行数据编辑时,仅需要将 Model 属性赋值即可. 绑定模型默认自动生成全部属性,可以通过设置 AutoGenerateAllItem 更 ...

  3. SQL Server数据表模糊查询(like用法)详解

    在SQL Server Management Studio (SSMS) 中,进行模糊查询主要是通过使用like操作符来实现的.like操作符用于在where语句中搜索列中具有指定模式的数据.我们在简 ...

  4. javascript的一些API接口的使用

    1.blob http URL 在编辑器中,有的情况下插入图片,会讲图片转成 blob:http://localhost/*** 的这种形式.这种形式的URL实际数据是存放在浏览器的内存中. 这种情况 ...

  5. element-ui季度选择组件

    1.基于elementui开发的季度选择组件 2.调用 <el-quarter-picker v-model="start_time" :size="size&qu ...

  6. uni.showModel内容换行

    前情 最近在做小程序项目,选用有是当前比较火的uniapp技术栈,在产品项目中用到不少的需要引导用户确认后才继续操作的弹框. 为什么想到我去换行? 其实showModel弹框的content是支持自动 ...

  7. 【原创】ARM64 实时linux操作系xenomai4(EVL)构建安装简述

    目录 0 环境说明 1 内核构建 2 库编译 方式1 交叉编译 方式2 本地编译 3 测试 单元测试 hectic:EVL 上下文切换 latmus:latency测试 4 RK3588 xenoma ...

  8. axios 取消请求 (2023-10-10更新)

    axios 文档 配置局部取消请求 这种相当于局部的取消请求,作用于单个请求中 import axios from 'axios' const source = axios.cancelToken.s ...

  9. Mplus数据分析:性别差异gendergap的相关研究如何做?

    再出一篇用mplus做的多组比较和中介分析的文章,专门谈谈诸如性别差异的各种研究的分析方法,从本文中大家不止可以知道性别差异,各种差异,各种gap只要你感兴趣都可以套进来这个方法来进行你的研究设计. ...

  10. Alain 配置管理

    app/assets/tmp/app-data.json 中保存了默认的一些应用配置 app 应用配置 user 默认用户配置 menu 菜单配置信息 在 App.Module 中,使用 APP_IN ...