模仿知乎的查看大图效果(JQuery)

模仿知乎的点击图片查看大图效果写了一个差不多的,记录一下代码.

//JavaScript
      $(function() {
        $('body').on('click', '.viewBigImg', function() {
            var windowWidth, windowHeight;
            windowHeight = window.innerHeight
            windowWidth = window.innerWidth
            $('.previewOverlay').remove()
            var boxWidth = $(this).width() //获取元素图片宽度
            var boxHeight = $(this).height() //获取元素图片高度
            var targetTop = $(this).offset().top
            var targetLeft = $(this).offset().left
            var viewOffset = {
                top: '',
                left: '',
            }
            var img = this
            var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
            var myPromise = new Promise(function(resolve, reject) {
                if (img.naturalWidth) {
                    var originalSize = {
                        width: img.naturalWidth > (windowWidth * 0.8) ? (windowWidth * 0.8) : img.naturalWidth, //获取图片原始宽度(不超过600)
                        height: img.naturalWidth > (windowWidth * 0.8) ? ((windowWidth * 0.8) / img.naturalWidth) * img.naturalHeight : img.naturalHeight, //获取图片原始高度
                    }
                } else {
                    var image = new Image()
                    image.src = img.src
                    image.onload = function() {
                        var originalSize = {
                            width: image.width > (windowWidth * 0.8) ? (windowWidth * 0.8) : image.width, //获取图片原始宽度(不超过600)
                            height: image.width > (windowWidth * 0.8) ? ((windowWidth * 0.8) / image.width) * image.height : image.height, //获取图片原始高度
                        }
                        resolve(originalSize)
                    }
                }
                resolve(originalSize)
            }).then(function(originalSize) {
                var imgProportion = {
                    x: originalSize.width / boxWidth, //计算宽度比例
                    y: originalSize.height / boxHeight, //计算高度比例
                }
                var targetSrc = $(img).attr('src')
                var preview = $('<div class="previewOverlay">' + '<div class="previewImgBox" >' + '![](' + targetSrc + ')' + '</div>' + '</div>')
                viewOffset.top = (windowHeight - originalSize.height) / 2 //计算出居中的位置坐标
                viewOffset.left = (windowWidth - originalSize.width) / 2 //计算出居中的位置坐标
                    // $('body').css('padding-left',window.innerWidth - document.body.clientWidth)
                document.body.style.setProperty('padding-right', window.innerWidth - document.body.clientWidth, 'important');
                $('body').css('overflow', 'hidden')
                $('body').append(preview) //插入放大图片
                $('.previewImgBox img').css('opacity', 0)
                $('.previewImgBox img').css('transform', 'translate3d(' + $(img).offset().left + 'px,' + ($(img).offset().top - scrollTop) + 'px, 0px)') //设置图片初始位置
                var timeOpen = setTimeout(function() {
                    $('.previewOverlay').addClass('prevActive')
                    $('.previewImgBox img').css('opacity', 1)
                    $('.previewImgBox img').css('transform', 'translate3d(' + viewOffset.left + 'px,' + viewOffset.top + 'px, 0px) scale3d(' + imgProportion.x + ',' + imgProportion.y + ', 1)')
                    $('.previewImgBox').addClass('activing')
                }, 0)

                $('body').on('click', '.previewImgBox img', function() {
                    $('.previewOverlay').removeClass('prevActive')
                    $('.previewImgBox img').css('transform', 'translate3d(' + targetLeft + 'px,' + (targetTop - scrollTop) + 'px, 0px)')
                    setTimeout(function() {
                        $('.previewOverlay').remove()
                        $('.previewImgBox').removeClass('activing')
                        $('body').css('overflow', '')
                        $('body').css('padding-right', '')
                    }, 300)
                    clearTimeout(timeOpen)
                })
            }).catch((err) => {
                console.log(err)
            })
        })
    })


//CSS
.previewOverlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 9999;
    overflow: hidden;
    transition: background-color 0.2s ease-in-out;
    &.prevActive {
        background-color: hsla(0, 0%, 100%, .9);
    }
}

.previewImgBox {
    width: 100%;
    height: 100%;
    overflow: auto;
    &.activing {
        img {
            transition: -webkit-transform .3s ease-in-out;
            transition: transform .3s ease-in-out;
            transition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out;
            cursor: zoom-out;
            transform-origin: top left;
        }
    }
}

.viewBigImg{
    cursor: zoom-in !important;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,035评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,089评论 4 62
  • 心情不好的时候 有人会去抽烟 可我不会啊 有人会去喝酒 可我不会啊 有人使劲的吃喝 这个我会 可我怕胖啊 于是坏心...
    萌大师阅读 198评论 0 0
  • 这本书是团队里优秀的总代,周顺溜分享的,猎手老师写的,娃娃写的序,还没有走心看完。 如何更好的发朋友圈? 如何更好...
    柠檬小姐o阅读 1,107评论 0 0
  • 看着身边熟睡的然然,妈妈怜惜又心疼,苦恼又无助。 然然打球坚持一年多了,每周五次的训练即考验然然又考验...
    piaochenlili阅读 187评论 0 0