手撸原生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提出的事件流,即事件由页面元素 ...
随机推荐
- 2个月搞定计算机二级C语言——真题(10)解析
1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题10 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> #pragma warning ...
- GIt分布式管理工具
Git(分布式版本控制工具) Git的学习是不依赖我们前面学习的知识,就算没有学习java也可以学习 Git就是一个类似于百度云盘的仓库 重点是要掌握使用idea操作Git,企业用的最多,一般不会去使 ...
- 2025年前端面试准备css篇
1.css 盒子模型 css包含了内容(content) ,内边距(padding),边框(border),外边距(margin) 等因素. css 标准盒子模型宽包括:margin+border+p ...
- excel/xlsx 空值判断NaN
从numpy导入nan类型,以此判断NaN类型
- Graylog之告警
官方文档:https://docs.graylog.org/en/3.0/index.html 前面我们已经了解了Graylog的搭建,以及日志的接入方法.我们知道graylog可以将收集的的日志通过 ...
- Windows下的终端工具-Terminal
文档:https://docs.microsoft.com/zh-cn/windows/terminal/ Windows 终端是一个面向命令行工具和 shell(如命令提示符.PowerShell ...
- Python之pandas读取Excel
#! -*- coding utf-8 -*- """ 模块功能:读取当前文件夹下的Source里的Excel文件,显示其相关信息 说明:默认把Excel的第一行当做列名 ...
- Codeforces Round 732 (Div
AquaMoon and Strange Sort 有 \(n\) 个人从左到右站成一排,从左数第 \(i\) 个人的衣服上印着 \(a_i\).每个人的朝向可以是朝左.朝右.一开始所有人的方向都是朝 ...
- offline RL · PbRL | LiRE:构造 A>B>C 的 RLT 列表,得到更多 preference 数据
论文标题:Listwise Reward Estimation for Offline Preference-based Reinforcement Learning,ICML 2024. arxiv ...
- 使用 Jmeter进行压测
一.环境配置 因为jmeter需要java环境,所以需要下载Jdk和Jmeter.需要注意jdk的版本和jmeter的匹配问题 推荐大家观看Furion的作者百小僧的视频来学习,讲的很细 https: ...