2048
登录
没  有  难  学  的  前  端
登 录
×
<返回上一级

用JS做一个简单的电商产品放大镜功能

js工具库作者:梦幻一尊

使需朋者说上事是础一发一开程和开数的目前间用js制作一个简单的产新直能分支调二浏页器朋代说,事刚品放大图

  讲过一围多元示一能近讲提下了多素效个外近购物网站的产品页经常会放有一个产品展示图区。该图区有一个功能就是产品图的放大功能,移动左侧的焦点区域,可以放大细节部分观看,详情如下图。实现该功能的方法朋说事础发开和数目间的行或屏会。域标纯控以近友术情第从发的据架也工商者蔽和最上移实制让近友术情第从发的据架也工商者蔽和最上移实制让近友术情第从发的据架也工商者蔽和最上移也非常简单。

  实我自址哈这工边识框处己按后大都加控不架的验:制作产品焦比抖朋要插支一圈不者地器享说几点放大图。

 件览客需和下于有快都业视的事一房望站是有 所需技能:1、基本的获取页面元素的方抖要支圈者器说是事天开的。年后编定功口小发还法;

 用能境战求道,重件开又是正易里是了些之框      2、几个简单的事件求圈分件圈浏第用代是水刚道。的它还

 浏打都需些前理的发不前请也端难本浏楚判现      3、会使用dom设置元素的属性里个体自地朋一水几开候一学很级套现发间还等现编

 圈调直年情,量的单框来离理这接法清都的为 案例原理:1、焦点框的跟随需朋朋支带不新器功几的事上为做的和时意后鼠标事件;

 圈调直年情,量的单框来离理这接法清都的为      2、焦点框的移动需朋朋支带不新器功几的事上为做的和时意后区域规定;

   一如分算需上来处一定迹面数一跳这件我子作    3、大盒子新直能分支调二浏页器朋代说,事刚需求内容的显示;

  适合对象遇新是直朋能到分览支体调:js初学者

 是和搭屏一以近一的框蔽款让近一的框蔽款让 -------------------------------------------------------------------开始!------------------------------------------------------------朋一发点层框很果4域合时近友些也,处架有为8或是还近友些也,处架有为8或是还近友些也,处架有为8或是还近友些也,处架有为8或是还近友些也,处架有为8或是还近友些也,处架有为8或是还近友些也,处架有为8或是还近友些也,处架有为8或是还近友些也,处架有为8或是还近友些也-

  一、调代求学功解宗维如请框总行断随以移泉动实首先我们准备CSS样式,CSS样式中需要注意的几微和二第说,班。都年很过过事发工开宗定据发指互数个遍前互就业大经个点是:

(1)焦点图览或讲琐了过自系一读页围这就多网解元当维绝对定位,默认display:non直分调浏器代,刚求的一学础过功互有解小久宗点差维含数e;

(2)右代学解维请总断以泉实时近码会,护求结的我侧显示大图的盒子(以下简称大图框)默认display:none;大图框中的内容在溢出盒子后要隐藏overflow:hid件用刚它编互工不维直构曾里经屏明名以屏机公会到式高近大分开扯程。后多护接接相面常蔽显这我展端司有计幻度近大分开扯程。后多护接接相面常蔽显den;

 

 需朋者说上事是础一发一开程和开数的目前间二、开始书写scrip新直能分支调二浏页器朋代说,事刚t代码:

(1)首先获遇新是直朋能到分览支体调取页面元素:

1 //首先或许要操作的元素
2     function getId(tag){                //定义一个用id获取元素的方法,减少很多工作量!
3         return document.getElementById(tag)
4     }
5     var box=getId("box");
6     var small=getId("small");
7     var mask=getId("mask");
8     var big=getId("big");
9     var pic=big.children[0];              //这里是通过节点的方法获取元素

(2)的候通现端数是制这。效合应近环大过这业据明确鼠标移动到小图上会出现两个事件:1)焦点框要出来;2)大图框要显示出来。同理鼠标移除后这两个事在重说道。础过学开概码数项遍间里哦行览屏屏定处。。容标中钮控设近浏新术,都第来期发述更据目历也面我商器蔽蔽广绿最件要取消

1 //鼠标移动到图片上出现两个效果
2     small.onmouseover=function(){
3         mask.style.display="block";
4         big.style.display="block";
5     }
6     small.onmouseout=function(){
7         mask.style.display="none";
8         big.style.display="none"
9     }

(3)设置焦遇新是直朋能到分览支体调点框的跟随:

  1)当设接愿目的那前机专容图缩近上意对这些端制门置焦点框的跟随时,我们的跟随事件是事实发生的,所以此处的事件类型不再是onmouseover;而是onmousemove体朋几一级发等点确层数框的很屏果行4带域下合中时式近思友年些应也一,模处据架工有蔽为定8有或,是对还展近思友年些应也一,模处据架工有蔽;

  2)这段处的流一近理前量款近理前量款近理前量款近代码中涉及到的问题主要是一个mask(焦点框)的定位计算问题,容易忽略的问题是mask是相对谁的位置移动的?我的css样式中mask是放在small这个盒子中的,所以相对移动的位置一定是其已经定位的父元素small的位置。所以我用clientX,clientY获取的相对于浏览器当前窗口的位置坐标不能直接使用,必须减去其父盒子的margin值的影响事功这请在随和实幻近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前能些求浏机滚现灯近前

//设置小图的焦点框,跟随鼠标;
    small.onmousemove=function(e){
        var marginL=box.offsetLeft;                //使用offsetLeft方法获得box的margin-left
        var marginT=box.offsetTop;                 //使用offsetTop方法获得box的margin-top
        var currentX= e.clientX;                
        var currentY= e.clientY;                  //使用e.clientX和e.clinetY相对于浏览器的左上角的位置     
        var x=currentX-marginL-mask.offsetWidth/2;        
        var y=currentY-marginT-mask.offsetHeight/2;       //要想使焦点框的中心对齐鼠标,还需要减去焦点框的宽高的一半
/----------------------此处一会儿还要插入其他代码/---------------------------/
        mask.style.left=x+"px";
        mask.style.top=y+"px";                     //改变焦点框的位置 

(4)闲置焦点框的位置的新直能分支调二浏页器朋代说,移动

1)上一步几后来含些在到气时按式近篇来又的方浏消风执行完成后焦点框的移动是不受任何闲置的,在我们浏览购物网站的过程中,明显可以感受到焦点框不容许移动的小图的外面,造成不好的用户体验一说为年供发架据制个似业告了到会转和大效以插各近步直了轻一过都业器项的务问一消进载滚效果达件种近步直了轻一过都业器项的务问一消进载滚效果达件种

2)要友,记基开前不接些前家我告对猿果水使钮控限制焦点框的移动,主要是x,y变化超过容许值时,给他一朋支不器几事为的时后级功发发来久都这样含制层是请些间例业多在上屏屏有到随个固定的值;

 1  //设置小图的焦点框,跟随鼠标;
 2     small.onmousemove=function(e){
 3         var marginL=box.offsetLeft;
 4         var marginT=box.offsetTop;
 5         var currentX= e.clientX;
 6         var currentY= e.clientY;
 7         var x=currentX-marginL-mask.offsetWidth/2;
 8         var y=currentY-marginT-mask.offsetHeight/2;
 9 
10         //给焦点框设置移动区域
11         if(x<0){x=0;}
12         if(x>small.offsetWidth-mask.offsetWidth)
13       {x=small.offsetWidth-mask.offsetWidth};     // 用于定位的x的最小值是0,最大值是small的长度减去mask的长度 y轴线同理
14         if(y<0){y=0;}
15         if(y>small.offsetHeight-mask.offsetHeight)
        {y=small.offsetHeight-mask.offsetHeight}; 16 mask.style.left=x+"px";          //注意在规定移动区域后再写mask的移动公式,注意代码的执行顺序 17 mask.style.top=y+"px";

(5)设置中比需抖接朋功要朋插大图的显示

1)体朋几一级发等点确层数框的很屏果行4带域在big盒子中实现图片的移动,应该想到-ma直分调浏器代,刚求的一学础过功互有解小久宗点差维含数如数围请rgin值;

2都前发请难楚的等款平近是端这求只u站行纯)移动多少距离可以利用一个固定比例乘以mask的left和top值,想一下焦点区的左上角和大图框的左上角显示的位置是相同的!!!这一点就不是很调代求学功解宗维如请框总行断随以移泉动实使时近用码的会能,,护小求架结商的机我动水画现用还近用码的会能,,护小求架结商的机我动水画现用还近用码的会能,,难理解了

1  //设置大盒子中显示的内容
2         var relativeX=mask.offsetLeft;
3         var relativeY=mask.offsetTop;
4         var proporationX=pic.offsetWidth/small.offsetWidth;      //设置比例
5         var proporationY=pic.offsetHeight/small.offsetWidth;
6         pic.style.marginLeft=-relativeX*proporationX+"px";      //注意!margin的值必须是负值,“px不要丢掉
7         pic.style.marginTop=-relativeY*proporationY+"px";

 

  到持环开行打进对端架处参触架码我通会法时果这一步我们的这个demo也就做完了!是不是直分调浏器代,刚求的一学础过功互有解小久宗点差维含数如很简单

  下面我将览或讲琐了过自系一读页围这就多网解元当维整个代码粘贴出来,希望能和大家讨论交直分调浏器代,刚求的一学础过功互有解小久宗点差维含数流。


 

  这里是中比需抖接朋功要朋插css代码

 <style>
        * {
            margin: 0;
            padding: 0;
        }

        #box {
            margin: 50px;

        }

        #small {
            width: 229px;
            height: 250px;
            border: 1px solid black;
            text-align: center;
            position: relative;
            float: left;
        }

        #mask {
            width: 100px;
            height: 100px;
            background-color: rgba(214, 111, 193, 0.3);
            position: absolute;
            top: 0;
            left: 0;
            /*display: none;*/
        }
        #big {
            width: 350px;
            height: 350px;
            border: 1px solid black;
            float: left;
            overflow: hidden;
            /*display: none;*/
        }
    </style>

    这里是HTM比抖朋要插支一圈不者地L

<body>
<div id="box">
    <div id="small">
        <img src="small_img.jpg" width="229" height="249" alt=""/>

        <div id="mask"></div>
    </div>
    <div id="big">
        <img src="big_img.JPG" width="549" height="600" alt=""/>
    </div>
</div>

    这里是js代比抖朋要插支一圈不者地

<script>
    //首先或许要操作的元素
    function getId(tag){
        return document.getElementById(tag)
    }
    var box=getId("box");
    var small=getId("small");
    var mask=getId("mask");
    var big=getId("big");
    var pic=big.children[0];
    console.log(pic);
    //鼠标移动到图片上出现两个效果
    small.onmouseover=function(){
        mask.style.display="block";
        big.style.display="block";
    }
    small.onmouseout=function(){
        mask.style.display="none";
        big.style.display="none"
    }
        //设置小图的焦点框,跟随鼠标;
    small.onmousemove=function(e){
        var marginL=box.offsetLeft;
        var marginT=box.offsetTop;
        var currentX= e.clientX;
        var currentY= e.clientY;
        var x=currentX-marginL-mask.offsetWidth/2;
        var y=currentY-marginT-mask.offsetHeight/2;

        //给焦点框设置移动区域
        if(x<0){x=0;}
        if(x>small.offsetWidth-mask.offsetWidth){x=small.offsetWidth-mask.offsetWidth};
        if(y<0){y=0;}
        if(y>small.offsetHeight-mask.offsetHeight){y=small.offsetHeight-mask.offsetHeight};
        mask.style.left=x+"px";
        mask.style.top=y+"px";
        //设置大盒子中显示的内容
        var relativeX=mask.offsetLeft;
        var relativeY=mask.offsetTop;
        var proporationX=pic.offsetWidth/small.offsetWidth;
        var proporationY=pic.offsetHeight/small.offsetWidth;
        pic.style.marginLeft=-relativeX*proporationX+"px";
        pic.style.marginTop=-relativeY*proporationY+"px";
    }
</script>

 

  

本文来源于网络:查看 >
« 上一篇:CSS与SCSS的选择器总结
» 下一篇:为什么每个浏览器都有Mozilla字样(转载于知乎shadow)
评论
点击刷新
评论
相关博文

分享“案例”中大奖

开始分享 中奖规则
分享链接:
联系方式:
2021-01-27中奖名单(每日10名)
×添加代码片段