由项目需要,原生写了个详情页图片放大镜的效果,扔上代码供学习分享,也作为日常笔记...
效果如图(例子中偷偷链了张天猫的图片,希望没啥事 -。-):
实现过程教简单,但我们还是从css开始分析,过程如下(图片已正方形为例):
css:
/* 图片容器 */ .imgBox{ width: 200px; /* 各位大老爷们看着办 */ height: 200px; /* 各位大老爷们看着办 */ position: relative; /* 必需 */ } /* 图片标签 */ .mainImg{ width: 100%; /* 各位大老爷们看着办,尽量100%好看些[斜眼笑] */ height: 100%; /* 各位大老爷们看着办,尽量100%好看些[斜眼笑] */ } /* 遮罩层-既放大区域 */ .glass{ position: absolute; /* 必需 */ width: 50px; /* 遮罩层宽度 此处是放大4倍,所以为200/4=50 */ height: 50px; /* 遮罩层高度 此处是放大4倍,所以为200/4=50 */ top: -9999px; /* 绝对位置,先放远些 */ left: -9999px; /* 绝对位置,先放远些 */ cursor: move; /* 鼠标样式,好看些 */ background: rgba(0,0,180,0.5); /* 遮罩层样式,好看些 */ } /* 大图所在的容器 */ .imgMax{ position: absolute; /* 必需 */ overflow: hidden; /* 必需,盖掉超出的大图[斜眼笑] */ left: 210px; /* 必需,此处为距原图左边10像素 */ top: 0; /* 必需,此处为距上边0像素 */ width: 200px; /* 放大图片容器的宽度 此处此处是放大4倍,为200,保持和原图容器一般大,若此处为400,则是放大2*4倍,那么相应的放大图片应该是200*4*2=1600 */ height: 200px; /* 放大图片容器的高度 此处此处是放大4倍,为200,保持和原图容器一般大,若此处为400,则是放大2*4倍,那么相应的放大图片应该是200*4*2=1600 */ display: none; /* 先隐藏 */ } .maxImg{ position: absolute; /* 必需 */ width: 800px; /* 此处是放大4倍,所以为200*4=800 受放大图片所在的容器影响,规则如上 */ height: 800px; /* 此处是放大4倍,所以为200*4=800 受放大图片所在的容器影响,规则如上 */ }
上面css中需要注意的就是几个position和缩放比例,注意调整下即可
写完样式,来看看布局:
html:
<!-- 图片容器 --> <div class="J_imgBox imgBox"> <!-- 需要放大的图片-原始图 --> <img class="J_mainImg mainImg" src="/UploadFiles/2021-04-02/TB1Xpe_NXXXXXXRXFXXGTq09XXX_035318.jpg_430x430q90.jpg">接下来是主要的js代码,一如既往的带注解:
js:
(function(){ /* 放大镜函数 ** @imgContainer 需要实现放大镜效果的图片容器 此处是 class 为 J_imgBox 的 div */ function imgZoom(imgContainer){ // 取大图url,不知道淘宝图片规则如何,反正看了详情页的大图和小图url对比,随便写了个替换 var imgUrl = imgContainer.querySelector('.J_mainImg').src.replace(/\.(jpg|jpeg|png|gif)(_)(\d+)(x)(\d+)(q90)"text-align: center">看完后是不是觉得简直不要太简单,接下来就来理一理以上代码中能够抽取出来在平常开发中比较实用的知识点:
Element.getBoundingClientRect()
Element.getBoundingClientRect()方法返回元素的大小及其相对于视口的位置
例子:
<body style="width:1400;height:1000"> <div id="testDiv" style="width:10px;height:20px;background:#f00"></div> <script> (function(){ var elem = document.getElementById('testDiv'); document.body.addEventListener('click',function(){ console.log(elem.getBoundingClientRect()) },false) })() </script> </body>效果如图:
从效果图上不难看出,当我移动视图后再点击body,打印的对象都能够正确返回元素的大小及其相对于视口的位置
这个方法也可以用于实现当某元素滚动到底/顶部时触发对应事件,相当方便。
Event
1.event.target 和 event.currentTarget
target:指向触发事件的元素
currentTarget:指向被绑定事件句柄的元素
只有当绑定的事件处理程序与触发该事件处理程序都为同一个对象的时候,两者相同
例子代码:
html:
<div id="aDiv"> 123 <div id="bDiv">456</div> </div>js:
document.getElementById('aDiv').addEventListener('click',function(e){ if(e.target === e.currentTarget) { console.log('target === currentTarget') }else{ console.log('target !== currentTarget') } console.log('target',e.target) console.log('currentTarget',e.currentTarget) },false)效果图:
从效果图中,我们可以看到,当点击456时,target指向的是456所在的bDiv,currentTarget则指向aDiv,因为事件是绑定在aDiv上,但触发是在bDiv上,而且bDiv又在aDiv内,当点击123时,则target与currentTarget一致,绑定和触发都在aDiv上。
2.event.preventDefault() & event.stopPropagation()
preventDefault:如果事件可取消,则取消该事件,而不停止事件的进一步传播
stopPropagation:阻止捕获和冒泡阶段中当前事件的进一步传播
3.event.stopPropagation() & event.stopImmediatePropagation()
stopPropagation:阻止捕获和冒泡阶段中当前事件的进一步传播
stopImmediatePropagation:阻止元素上调用相同事件的其他事件监听并阻止冒泡
两者区别的例子:
html:
<div id="aDiv"> 123 <div id="bDiv">456</div> </div>js:
document.getElementById('aDiv').addEventListener('click',function(){ console.log('click aDiv') },false) document.getElementById('bDiv').addEventListener('click',function(e){ e.stopImmediatePropagation(); console.log('click bDiv') },false) document.getElementById('bDiv').addEventListener('click',function(){ console.log('click me too') },false)上面代码执行结果为:
click bDiv
注释掉 e.stopImmediatePropagation(); 的结果为:
click bDiv
click me too
click aDIV虽然都是些简单的知识点,在平常开发中也是很实用的,希望能从细节出发,没事多复习复习 -。-~
后来一时兴起将放大镜写的更傻瓜式配置的插件了... 点我看代码(github地址)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。