放大镜

一、多种图片放大镜

1.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box11{
            width: 1200px;
            display: flex;
        }

        .enlarge{
            margin-left: 20px;
        }
        .middle{
            width: 352px;
            height: 352px;
            margin-top: 20px;
            border: 1px solid #cccccc;
            position: relative;
        }
        .middle>img{
            width: 350px;
            height: 350px;
        }
        .middle .mask{
            width: 100px;
            height: 100px;
            background-color: rgba(255, 255, 0, .6);
            position: absolute;
            top: 0;
            left: 0;
            display: none;
        }
        .middle .mask:hover{
            cursor: move;
        }
        .middle .big{
            width: 350px;
            height: 350px;
            border: 1px solid #cccccc;
            position: absolute;
            left:105%;
            top: 0;
            overflow: hidden;
            display: none;
        }
        .middle .big img{
            width: 1600px;
            height: 1600px;
            position: absolute;
            top: 0;
            left: 0;
        }
        .small img{
            width: 52px;
            height: 52px;
            margin: 10px 5px;
            vertical-align: top;
            border: 2px solid transparent;
        }
        .small img.active{
            border-color: red;
        }
        .small img:hover{
            border: 2px solid red;
        }
    </style>
</head>
<body>
    <div class="enlarge">
        <div class="middle">
            <img src="./image/16.png" alt="">
            <div class="mask"></div>
            <div class="big">
                <img src="./image/16.png" alt="">
            </div>
        </div>
        <div class="small">
            <img class="active" src="./image/16.png" alt="">
            <img src="./image/17.png" alt="">
            <img src="./image/18.png" alt="">
            <img src="./image/19.png" alt="">
            <img src="./image/20.png" alt="">
        </div>
    </div>
    <script>
        //等待网页加载完成,在运行js文件
        window.onload = function() {
            !function fang(){
        function Enlarge(leiming) {
            //3.获取标签 - 作为对象属性
                this.container = document.querySelector('.'+leiming);
                //在指定的大盒子中获取标签元素
                this.middleBox = this.container.querySelector('.middle');
                this.mask = this.container.querySelector('.mask');
                this.bigBox = this.container.querySelector('.big');
                this.middleImg = this.container.querySelector('.middle>img');
                this.bigImg = this.container.querySelector('.middle .big>img');
                this.smallImgs = this.container.querySelectorAll('.small img');       
                this.init()
            }
            //4.将事件放在一个方法中
            Enlarge.prototype.init = function() {
                //点击小图切换中图和大图
                for(let i=0;i<this.smallImgs.length;i++) {
                    this.smallImgs[i].onmouseover = () => {
                        //换小图样式
                        for(let j=0;j<this.smallImgs.length;j++) {
                            this.smallImgs[j].className = ''
                        }
                        this.smallImgs[i].className = 'active'
            
                        //切换中图和大图
                        this.bigImg.src = this.middleImg.src = this.smallImgs[i].src 
                    }
                }              
                //鼠标移入显示
                this.middleBox.onmouseover = () => {
                    this.mask.style.display = this.bigBox.style.display = 'block'
                
                    //鼠标在中盒子中移动,让遮罩也跟着鼠标移动
                    this.middleBox.onmousemove = () => {
                        // console.log(111,this);
                        var x = window.event.pageX
                        var y = window.event.pageY
                        // console.log(x,y);
                        //计算遮罩的left和top的值
                        var l = x - this.middleBox.offsetLeft - this.mask.offsetWidth/2 - parseInt(getComputedStyle(this.middleBox)['border-left-width'])
                        var t = y - this.middleBox.offsetTop - this.mask.offsetHeight/2 - parseInt(getComputedStyle(this.middleBox)['border-top-width'])
                        //限制最小值和最大值
                        if(l < 0) {
                            l = 0
                        }
                        if(t < 0) {
                            t = 0
                        }
                        if(l > this.middleBox.clientWidth - this.mask.offsetWidth) {
                            l = this.middleBox.clientWidth - this.mask.offsetWidth
                        }
                        if(t > this.middleBox.clientHeight - this.mask.offsetHeight) {
                            t = this.middleBox.clientHeight - this.mask.offsetHeight
                        }
                        //设置遮罩的let和top的值
                        this.mask.style.left = l + 'px'
                        this.mask.style.top = t + 'px'
            
                        //调用图片移动的方法
                        this.bigImgMove(l,t)
                    }
                }
                //鼠标移出隐藏
                this.middleBox.onmouseout = () => {
                    this.mask.style.display = this.bigBox.style.display = 'none'
                }
            }
            //大盒子图片移动的方法
            Enlarge.prototype.bigImgMove = function(l,t) {
                //计算遮罩在中盒子中左边距离占据中盒子的宽度的比例
                var percentX = l / this.middleBox.clientWidth
                var percentY = t / this.middleBox.clientHeight
                //获取大图的宽高
                var bigImgWidth = this.bigImg.clientWidth
                var bigImgHeight = this.bigImg.clientHeight
                //根据比例计算大图应该移动的left和top的距离
                var bigLeft = percentX * bigImgWidth
                var bigTop = percentY * bigImgHeight
                //设置大图的位置
                this.bigImg.style.left = -bigLeft + 'px'
                this.bigImg.style.top = -bigTop + 'px'  
            }
            //2.new调用
            var e = new Enlarge('enlarge')//将放大镜的大盒子范围当做实参传入
        }();
        }
    </script>
</body>
</html>

二、单张图片放大镜

2.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .smallbox{
            position: relative;
            width: 400px;
            height: 600px;
            border: 1px solid #ccc;
        }
        .smallbox .small{
            width: 400px;
            height: 600px;
        }
        .mask{
            position: absolute;
            top: 0;
            left: 0;
            display: none;
            width: 100px;
            height: 100px;
            background-color: #000 ;
            opacity: .5;
        }
        .smallbox .big{
            position: absolute;
            left: 410px;
            top: 0;
            display: none;
            width: 500px;
            height: 500px;
            border: 1px solid #ccc;
            overflow: hidden;
        }
        .big .bigImg{
            position: absolute;
            top: 0;
            left: 0;
        }
    </style>
</head>
<body>
    <div class="smallbox">
        <img src="1.jpg" alt="" class="small">
        <div class="mask"></div>
        <div class="big">
            <img src="1.jpg" alt="" class="bigImg">
        </div>
    </div>
    <script>
        // 获取元素
        var smallbox=document.querySelector('.smallbox');
        var mask=document.querySelector('.mask');
        var big=document.querySelector('.big');
        var maskX=
        // 鼠标经过smallbox,遮挡层和big显示
        smallbox.addEventListener('mouseover',function(e){
            mask.style.display='block';
            big.style.display='block';
        })
        // 鼠标离开smallbox,遮挡层和big隐藏
        smallbox.addEventListener('mouseout',function(){
            mask.style.display='none';
            big.style.display='none';
        })
        smallbox.addEventListener('mousemove',function(e){
            var x = e.pageX - this.offsetLeft;
            var y = e.pageY - this.offsetTop;
            // mask移动的距离
            maskX=x - mask.offsetWidth / 2;
            maskY=y - mask.offsetHeight / 2;
            // 边界判断
            maskMaxW = smallbox.offsetWidth - mask.offsetWidth;
            maskMaxH = smallbox.offsetHeight - mask.offsetHeight;
            if(maskX <= 0){
                maskX = 0;
            }else if(maskX >= maskMaxW){
                maskX = maskMaxW;
            }
            if(maskY <= 0){
                maskY = 0;
            }else if(maskY >= maskMaxH){
                maskY = maskMaxH;
            }
            mask.style.left = maskX + 'px';
            mask.style.top = maskY + 'px';
            // 大图片的移动距离 = 遮挡层移动距离 *大图片最大移动距离 / 遮挡层最大移动距离
            var bigImg = document.querySelector('.bigImg');
            var small = document.querySelector('.small');
            // 大图片的最大移动距离
            var bigMaxW = bigImg.offsetWidth - big.offsetWidth;
            var bigMaxH = bigImg.offsetHeight - big.offsetHeight;
            // 大图片的移动距离
            var bigW = maskX * bigMaxW / maskMaxW;
            var bigH = maskY * bigMaxH / maskMaxH;
            // 大图移动
            bigImg.style.left = -bigW + 'px';
            bigImg.style.top = -bigH + 'px';
            // 鼠标移出small隐藏mask和big
            if(e.pageX < this.offsetLeft || e.pageX > this.offsetLeft+this.offsetWidth || e.pageY < this.offsetTop || e.pageY > this.offsetTop+this.offsetHeight){
                mask.style.display='none';
                big.style.display='none';
            }
        })
    </script>
</body>
</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容