手撸原生js放大镜效果

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放大镜效果的更多相关文章
- 原生js放大镜效果
效果: 1. 鼠标放上去会有半透明遮罩.右边会有大图片局部图 2. 鼠标移动时右边的大图片也会局部移动 放大镜的关键原理: 鼠标在小图片上移动时,通过捕捉鼠标在小图片上的位置,定位大图片的相应位置 ...
- 原生js动画效果(源码解析)
在做页面中,多数情况下都会遇到页面上做动画效果,大部分都是用jquery来实现动画,今天正好看到一篇原生js实现动画效果的代码,特分享在此. 原文地址:http://www.it165.net/pro ...
- 最全js 放大镜效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 基于canvas的原生JS时钟效果
概述 运用html5新增画布canvas技术,绘制时钟效果,无需引用任何插件,纯js. 详细 代码下载:http://www.demodashi.com/demo/11935.html 给大家介绍一个 ...
- jS放大镜效果
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="demo4.aspx.cs& ...
- 手机端原生js实现下拉刷新数据
HTML结构如下: <div class="outerScroller comment"> <div class='scroll comment'> < ...
- 原生js手风琴效果
//js代码 //获取li var list = document.getElementsByTagName("li")[0]; //遍历 排他 for( var i=0;i&l ...
- 原生js实现的放大镜效果
这是我用原生js写的放大镜效果,与各种各样的框架技术相比,我喜欢使用原生的js,在这里,想和大家一起谈谈原生和框架技术的理解与个人喜好. <!DOCTYPE HTML><html&g ...
- js 动画效果实现
1. 实现方式 - 应用场景 自己写 - 简单的.不用 jq 的项目 jq - 普通动画 成熟插件 - 复杂动画 2. 相关文章 JavaScript基于时间的动画算法 九种原生js动画效果 Twee ...
- JS里关于事件的常被考察的知识点:事件流、事件广播、原生JS实现事件代理
1.JS里面的事件流 DOM2级事件模型中规定了事件流的三个阶段:捕获阶段.目标阶段.冒泡阶段,低版本IE(IE8及以下版本)不支持捕获阶段 捕获事件流:Netscape提出的事件流,即事件由页面元素 ...
随机推荐
- javascript正则获取a标签的href
js正则获取a标签的href let str = '<a href="https://www.test.com" >test</a>' let reg = ...
- Golang之学习资源参考
使用golang开发也有一段时间,在此总结一些自己从0入门到掌握所涉及一些资源,希望可以帮助其他人 [初级] 基础语法练习: https://gobyexample.com/ [中级] 1.gola ...
- Linux(ubuntu18)下 Qt linguist 在哪里 找不到
1.首先找到Qt安装目录. 2.通过命令查找linguist. find . -name linguist 3.制作桌面快捷方式. 在/usr/share/applications目录下新建lingu ...
- 题解:P11007 『STA - R7』Odtlcsu
有个很显然的结论,题目中的 $x$ 与 $y$ 奇偶性相同. 有个更简单的证明,奇数的平方为奇数,偶数的平方为偶数,所以 $x$ 与 $y$ 奇偶性相同. 思路就显而易见了,考虑构造一个长度为 $y$ ...
- jdk安装-windows和linux
下载:见此博客https://www.cnblogs.com/zn19961006/p/12857930.html 一.windows安装 1.很简单,运行exe,然后一直下一步 选安装路径. 注意: ...
- 构建模块化 CLI:Lerna + Commander 打造灵活的基础脚手架
在现代软件开发中,创建 定制化的命令行工具(CLI) 已成为满足公司业务需求的关键一环.这类工具可以辅助执行诸如代码检查.项目初始化等任务.为了提高开发效率并简化维护过程,我们将功能模块化,并通过多个 ...
- Mac下SSH Key配置
1 .检查.ssh文件夹是否存在 $ ls -al ~/.ssh 2.如果不存在新建.ssh文件平 $ mkdir ~/.ssh 3.生成KEY在命令行中输入,your_email@example.c ...
- Qt编写安防视频监控系统27-GPU显示
一.前言 之前用ffmpeg解码的时候,已经做了硬解码的处理,比如支持qsv.dxva2.d3d11va等方式进行硬解码处理,但是当时解码出来以后,还是重新转成了QImage来绘制,这样就大打折扣了, ...
- 将maven项目打包上传到私服
1. 配置私服账户密码 在maven 的setting.xml 中配置用户名和密码: <servers> <server> <username>deployment ...
- vue3 路由-导航守卫
假设用户登录,在地址栏输入了Login,人性化的设计应该自动回到home页面.或者用户输入不存在路由,也应该回到home页面. 这个时候需要用到vue-router的导航守卫功能. 在我们封装的rou ...