让剁手党洞察物体细节,“放大镜”当之无愧
本文内容概要:
1.基本介绍
2.涉及到的主要知识
3.结构样式搭建
4.功能分析实现
5.小结
1、基本介绍
商城网站放大镜效果图:
从效果图中可以看出,无非就是操作两张内容相同,但大小不同的图片。通过控制比例来实现放大的效果。但是需要注意的是,两张照片的宽高比必须是成比例的。
原理结构图
大家可以先根据原理图给出的信息先思考一波,然后咱们接着继续。
2、涉及到的主要知识
offsetLeft: 获取当前对象与父元素的左距离
offsetTop: 获取当前对象与父元素的上距离
offsetWidth: 获取元素(含边框)的自身宽度
offsetHight: 获取元素(含边框)自身高度
scrollLeft: 获取元素的左滚距离
scrollTop: 获取元素的上滚距离
event.clientX: 元素的X坐标
event.clientY: 元素的Y坐标
onmouseover: 当鼠标指针位于元素上方时,会发生mouseover事件
onmouseout: 当鼠标指针从元素上移开时,发生mouseout事件
onmousemove: 当鼠标指针在指定的元素中移动时,就会发生mousemove事件
3、结构样式搭建
a).实现控制区.box,与显示区左右布局;
b).在控制区中,拖动块move使用position定位于box之上;
具体代码:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML5学堂 - H5course</title>
<meta name="viewport" content="width=device-width,user-scalable=no">
<link rel="stylesheet" href="../css/reset.css">
<style>
.wrap {
width: 850px;
height: 400px;
margin: 100px auto;
}
.box, .box-cop{
float: left;
width: 200px;
height: 200px;
border: 1px solid #39f;
}
.box {
position: relative;
margin-right: 45px;
}
.box-cop {
overflow: hidden;
}
.wrap .box-cop {
display: none;
}
.box .box-mov {
display: none;
}
.box-mov {
/*move块样式*/
position: absolute;
left: 0;
top: 0;
width: 50px;
height: 50px;
cursor: move;
background: #000;
opacity: 0.5;
}
</style>
</head>
<body>
<div class="wrap">
<div class="box" id="pic">
<img src="../images/mj.png" alt="" title="">
<div class="box-mov" id="mov"></div>
</div>
<div class="box-cop" id="pic-big">
<img src="../images/mj2.png" alt="" title="">
</div>
</div>
<body>
</html>
显示效果:
4、功能分析与实现
实现分析
1.首先,我们需一个显示框,显示框中需要一个img元素来显示原图对象;另外还需要一个容器作为显示框,用于存放大图对象。当鼠标移动到原图上时,通过对大图进行位置控制来显示对应的部位。
2. 当鼠标移动到box上方时,move块将显示,同时在放大区中显示大图的对应位置,所以我们在这里需要使用mousemove事件监听,当我们鼠标移入box时,就需要获取当前鼠标的相对坐标位置。
document.onmousemove = function (e) {
e.preventDefault();
newX = e.clientX; // 获取当前鼠标X轴位置
newY = e.clientY; // 获取当前鼠标Y轴位置
}
3.通过获取到的鼠标坐标位置,减去box左/上距视口的距离,再减去move块所展现出来的宽高的1/2,则得到获取到当前的move块位置。
var nowX = newX - pic.offsetLeft - (mov.offsetWidth / 2);
//获取移动时move块距父级左侧距离
var nowY = newY - pic.offsetTop - (mov.offsetWidth / 2);
//获取移动时move块距父级的顶部距离
4.临界值判断,当move的移动距离超出了box的范围时,需要限制其最大移动值与最小移动值。
//设置move块的X轴最大移动距离
var maxX = pic.offsetWidth - mov.offsetWidth;
//设置move块的Y轴最大移动距离
var maxY = pic.offsetHeight - mov.offsetHeight;
5.根据move块相对于box的占比与放大区相对于大图的占比进行比例计算,得到显示图片的显示位置。
bec.scrollLeft = nowX * 图片占比; // 大图横向显示位置
bec.scrollTop = nowY * 图片占比; // 大图纵向显示位置
6.根据实际需求,当鼠标移入时,使用mouseove触发,放大区显示,移出时,使用mouseout,move块与放大区消失。
pic.onmouseout = function () {
bec.style.display = 'none'; // 移出效果
mov.style.display = 'none';
}
具体代码:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML5学堂 - H5course</title>
<meta name="viewport" content="width=device-width,user-scalable=no">
<link rel="stylesheet" href="../css/reset.css">
<style>
.wrap {
width: 850px;
height: 400px;
margin: 100px auto;
}
.box, .box-cop{
float: left;
width: 200px;
height: 200px;
border: 1px solid #39f;
}
.box {
position: relative;
margin-right: 45px;
}
.box-cop {
overflow: hidden;
}
.wrap .box-cop {
display: none;
}
.box .box-mov {
display: none;
}
.box-mov {
/*move块样式*/
position: absolute;
left: 0;
top: 0;
width: 50px;
height: 50px;
cursor: move;
background: #000;
opacity: 0.5;
}
</style>
</head>
<body>
<div class="wrap">
<div class="box" id="pic">
<img src="../images/mj.png" alt="" title="">
<div class="box-mov" id="mov"></div>
</div>
<div class="box-cop" id="pic-big">
<img src="../images/mj2.png" alt="" title="">
</div>
</div>
<script>
var pic = document.getElementById('pic'),
bec = document.getElementById('pic-big'),
mov = document.getElementById('mov');
var newX = 0,
newY = 0,
nowDisX = 0,
nowDisY = 0;
pic.onmouseover = function (e) {
bec.style.display = 'block'; //移入效果
mov.style.display = 'block';
nowDisX = mov.offsetLeft; //当前move块距父级右侧距离
nowDisY = mov.offsetTop; //当前move块距父级顶部距离
e.preventDefault();
document.onmousemove = function (e) {
e.preventDefault();
newX = e.clientX; // 获取当前鼠标X轴位置
newY = e.clientY; // 获取当前鼠标Y轴位置
var nowX = newX - pic.offsetLeft - (mov.offsetWidth / 2);
//获取移动时move块距父级左侧距离
var nowY = newY - pic.offsetTop - (mov.offsetWidth / 2);
//获取移动时move块距父级顶部距离
var maxX = pic.offsetWidth - mov.offsetWidth;
//设置move块的X轴最大移动距离
var maxY = pic.offsetHeight - mov.offsetHeight;
//设置move块的Y轴最大移动距离
if (nowX <= 0) {
nowX = 0; //X轴最小值判断
};
if (nowX >= maxX) {
nowX = maxX;//X轴最大值判断
};
if (nowY <= 0) {
nowY = 0; //Y轴最小值判断
};
if (nowY >= maxY) {
nowY = maxY;//Y轴最大值判断
};
bec.scrollLeft = nowX * 4; // 大图横向显示显示位置
bec.scrollTop = nowY * 4; // 大图纵向显示位置
mov.style.left = nowX + 'px'; //当前的move块X轴位置
mov.style.top = nowY + 'px'; //当前的move块Y轴位置
}
}
pic.onmouseout = function () {
bec.style.display = 'none'; // 移出效果
mov.style.display = 'none';
}
</script>
</body>
</html>
实现效果:
5、小结:
因为在日常项目开发中,对拖拽功能的需求还是比较常见的,这几期从自定义滚动条到放大镜的效果都是基于拖拽原理上实现的,小匠在后面的分享中会继续为大家带来更加实用与有趣的功能效果,希望能够为大家在实际开发中带来一点帮助。
- ASP.NET Core的配置(4):多样性的配置来源[上篇]
- 37 个你必须知道的现代数据中心术语
- Python读书笔记7
- 2017年人工智能在游戏领域打败人类,未来我们将何去何从?
- 3杂再破市场行情 6位数结拍
- 将永久存储添加到Red Hat CDK Kit 3.0
- ASP.NET MVC的Razor引擎:RazorView
- 三分钟学会 Java 单元测试
- 革了短信的命之后,微信开始把枪口对准了应用市场
- 建构微服务的第一步: 微服务哪里来?
- 最新机器学习必备十大入门算法!都在这里了
- ASP.NET MVC的Razor引擎:IoC在View激活过程中的应用
- 深度学习笔记:深度学习在计算机视觉的应用
- 快速添加永久存储到到Minishift / CDK 3
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 大型项目技术栈第五讲 富文本编辑器
- weblogic 11g StuckThreadMaxTime 问题解决 以及 线程池、数据库连接池参数调优
- 大型项目技术栈第九讲 kaptcha的使用
- 大型项目技术栈第十讲 日志与性能监控
- Mybatis系列第三讲 Mybatis使用详解(1)
- Maven系列第二讲 安装、配置、mvn运行过程详解
- Maven第六讲 生命周期详解 高手必备!
- 鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)
- Maven 项目第七讲 Maven插件
- weblogic Schema validation schemaValidationEnabled=false 启动报错解决
- redis 反序列化deserialize异常问题解决
- redis 入门(二)——maven4.0 + Jedis2.9.0 + redis3.2.6 实战
- spring boot 启动报错Log4j2 could not find a logging implementation 解决
- spring boot 启动 NoClassDefFoundError: org/springframework/core/ErrorCoded 报错
- java.lang.NoSuchMethodError: org.springframework.core.ResolvableType.forInstance 错误解决