摘要:啥是淘宝放大镜这个,当你的鼠标移动到左边的主图上时,右边会出现一个放大的图,暂且就把这个叫做放大镜吧。
啥是淘宝放大镜
这个,当你的鼠标移动到左边的主图上时,右边会出现一个放大的图,暂且就把这个叫做放大镜吧。
大概的做法第一种,左边一个小图,右边一个原图,当鼠标在小图上移动的时候,通过更改left和top的值来实现同步移动(原图的position属性设置为absolute)
第二种,鼠标在小图上移动的时候,通过改变原图的background-position的值来同步移动。
关键操作第一步,获取鼠标在小图上的位置,并且定位好跟随鼠标的方块(你应该知道是哪个方块吧。。)的位置。
//e.offsetX ,offsetY是鼠标的位置
//方块的left top在你的鼠标的左上方(网页左上角是原点),因此是减去一个方块的一半。
var x = e.offsetX - 方块.offsetWidth / 2;
var y = e.offsetY - 方块.offsetHeight / 2;
方块.style.left = x + "px";
方块.style.top = y + "px";
这明显是不足够的!
还需要考虑极端位置/情况
如果只用上面的设置,那么当你的鼠标移动到图片边缘的时候,方块有一半会出现在图片外。
正确的应该是 当你的方块触碰到边缘的时候,你的方块就不能在移动了,尽管你的鼠标还在往下图中“鼠标的有效活动区域”外移动。
那么得加点代码
if (x < 0) {
x = 0;
}
if (y < 0) {
y = 0;
}
if (x > 小图.offsetWidth - 方块.offsetWidth) {
x = 小图.offsetWidth - 方块.offsetWidth;
}
if (y > 小图.offsetHeight - 方块.offsetHeight) {
y = 小图.offsetHeight - 方块.offsetHeight;
}
第二步,控制大图里的left - top或者background-position
//第一种方法:需要注意的是这里的left 和 top得反过来,你鼠标在小图上往下移的时候,对应的大图其实是往上移的。
//所以:大图上的left = -小图上的left * 他们的缩放倍率
大图.style.display = "block";
大图.style.left = -x * 大图.offsetWidth / 小图.offsetWidth + "px";
大图.style.top = -y * 大图.offsetHeight / 小图.offsetHeight + "px";
//第二种方法,这里需要注意 backgroundPosition的值是从0 - 100%的(得用百分比表示);
//需要注意的是何时为百分百,从上面的极端情况判定我们可以知道
//x 是从0 到 mask.offsetWidth - rect.offsetWidth;
//因此这就是0 - 100%;y同理
大图.style.display = "block";
大图.style.backgroundPosition =`${x/(mask.offsetWidth - rect.offsetWidth)*100}% ${y/(mask.offsetHeight- rect.offsetHeight)*100}%`;
注意事项
我们上面说在小图img上绑定mousemove事件来定位方块,其实实际操作上,我们不能直接用img来绑定,而是得用一个和img一样大小遮罩层来绑定,不然在你鼠标移动的时候,图片会疯狂闪烁,疯狂!crazy!
还有 就是函数节流,这个想节流就节流吧。
还有个很重要的,就是右边那个显示大图的div的大小,一定得是小图上的方块大小 * 缩放倍率 的大小,如果过大,则会多出空白,过小,显示不完全。下面有代码,你可以带回家疯狂测试。
再详细一点我知道我可能说的不是很详细,所以。。
后语
tb放大镜
- window.onload = function () {
- var mask = document.getElementsByClassName("mask")[0];
- //为什么要用mask呢?不直接用选中small-pic。
- //如果直接选择图片标签来绑定下面的mouseover事件,图片会一直闪烁!所以我们得给他一个和图片一样大小的遮罩层
- var rect = document.getElementsByClassName("rect")[0];
- var bPic = document.getElementsByClassName("big-pic")[0];
- var bPic2 = document.getElementsByClassName("big-pic2")[0];
- mask.addEventListener("mousemove", throttle(magnifier,100))
- function magnifier(e){
- //方块的left top在你的鼠标的左上方(网页左上角是原点),因此是减去一个方块的一半。
- var x = e.offsetX - rect.offsetWidth / 2;
- var y = e.offsetY - rect.offsetHeight / 2;
- //极端情况,也就是当你的鼠标上的方块到四个边的边缘的时候。
- if (x < 0) {
- x = 0;
- }
- if (y < 0) {
- y = 0;
- }
- if (x > mask.offsetWidth - rect.offsetWidth) {
- x = mask.offsetWidth - rect.offsetWidth;
- }
- if (y > mask.offsetHeight - rect.offsetHeight) {
- y = mask.offsetHeight - rect.offsetHeight;
- }
- //方块定位
- rect.style.display="block";
- rect.style.left = x + "px";
- rect.style.top = y + "px";
- //第一种方法:需要注意的是这里的left 和 top得反过来,你鼠标在小图上往下移的时候,对应的大图其实是往上移的。
- //所以:大图上的left = -小图上的left * 他们的缩放倍率
- bPic.style.display = "block";
- bPic.style.left = -x * bPic.offsetWidth / mask.offsetWidth + "px";
- bPic.style.top = -y * bPic.offsetHeight / mask.offsetHeight + "px";
- //第二种方法,这里需要注意 backgroundPosition的值是从0 - 100%的(得用百分比表示);
- //需要注意的是何时为百分百,从上面的极端情况判定我们可以知道
- //x 是从0 到 mask.offsetWidth - rect.offsetWidth;
- //因此这就是0 - 100%;y同理
- bPic2.style.display = "block";
- bPic2.style.backgroundPosition =`${x/(mask.offsetWidth - rect.offsetWidth)*100}% ${y/(mask.offsetHeight- rect.offsetHeight)*100}%`;
- }
- mask.addEventListener("mouseout",function(){
- rect.style.display = "none";
- bPic.style.display = "none";
- bPic2.style.display = "none";
- })
- //函数节流
- function throttle(fn, delay) {
- var pre = new Date().getTime();
- return function () {
- var context = this;
- var args = arguments;
- var now = new Date().getTime();
- if (now - pre > delay) {
- fn.apply(this,arguments);
- }
- }
- }
- }
有错误的地方请指出,谢谢啦
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/102019.html
摘要:再谈移动端适配百分比解决方案的缺点在我们的项目中大量的使用百分比来解决页面在宽度上的自适应,其实在高度上并没有很好的自适应。 前言 这篇文章的内容如题目一样,主要分为两个部分, 谈谈业内主流的移动端适配解决方案 点5像素的由来和实现方法 建议在读这篇文章的时候先读下这篇文章《高清屏概念解析与检测设备像素比的方法_20161005》,因为这些文章涉及的很多概念在这篇文章中都会提到。 ...
阅读 1733·2021-10-12 10:11
阅读 3869·2021-09-03 10:35
阅读 1522·2019-08-30 15:55
阅读 2221·2019-08-30 15:54
阅读 1059·2019-08-30 13:07
阅读 1129·2019-08-30 11:09
阅读 682·2019-08-29 13:21
阅读 2728·2019-08-29 11:32