Javascript是个好东西。

Jquery是基于这个好东西的一个强大的库。

今天要实现的功能是基于这两个玩意儿的。

点击图片,在弹出层显示原图。

大概效果是这样的:

上代码:

先是html部分:

<div style="text-align:center;margin-top:200px;">
                   <img src="https://guanchao.site/uploads/atricle/5db3a72e49efd.jpeg" alt="" style="width:100px;" id="plus">
         </div>
 
                   <!-- 弹窗部分代码 -->
         <div id="outerdiv" style="position:fixed;top:0;left:0;background:rgba(0,0,0,0.7);z-index:2;width:100%;height:100%;display:none;">
             <div id="innerdiv" style="position:absolute;">
                 <img id="bigimg" style="border:5px solid #fff;" src="" />
             </div>
         </div>
         <!-- 弹窗部分代码 -->

Js部分:

$(function(){ 
        $("#plus").click(function(){
            var _this = $(this);//将当前的pimg元素作为_this传入函数 
            imgShow("#outerdiv", "#innerdiv", "#bigimg", _this); 
        }); 
    }); 
 
    function imgShow(outerdiv, innerdiv, bigimg, _this){ 
        var src = _this.attr("src");//获取当前点击的pimg元素中的src属性 
        $(bigimg).attr("src", src);//设置#bigimg元素的src属性 
     
            /*获取当前点击图片的真实大小,并显示弹出层及大图*/ 
        $("<img/>").attr("src", src).load(function(){ 
            var windowW = $(window).width();//获取当前窗口宽度 
            var windowH = $(window).height();//获取当前窗口高度 
            var realWidth = this.width;//获取图片真实宽度 
            var realHeight = this.height;//获取图片真实高度 
            var imgWidth, imgHeight; 
            var scale = 0.8;//缩放尺寸,当图片真实宽度和高度大于窗口宽度和高度时进行缩放 
             
            if(realHeight>windowH*scale) {//判断图片高度 
                imgHeight = windowH*scale;//如大于窗口高度,图片高度进行缩放 
                imgWidth = imgHeight/realHeight*realWidth;//等比例缩放宽度 
                if(imgWidth>windowW*scale) {//如宽度扔大于窗口宽度 
                    imgWidth = windowW*scale;//再对宽度进行缩放 
                } 
            } else if(realWidth>windowW*scale) {//如图片高度合适,判断图片宽度 
                imgWidth = windowW*scale;//如大于窗口宽度,图片宽度进行缩放 
                            imgHeight = imgWidth/realWidth*realHeight;//等比例缩放高度 
            } else {//如果图片真实高度和宽度都符合要求,高宽不变 
                imgWidth = realWidth; 
                imgHeight = realHeight; 
            } 
                    $(bigimg).css("width",imgWidth);//以最终的宽度对图片缩放 
             
            var w = (windowW-imgWidth)/2;//计算图片与窗口左边距 
            var h = (windowH-imgHeight)/2;//计算图片与窗口上边距 
            $(innerdiv).css({"top":h, "left":w});//设置#innerdiv的top和left属性 
            $(outerdiv).fadeIn("fast");//淡入显示#outerdiv及.pimg 
        }); 
         
        $(outerdiv).click(function(){//再次点击淡出消失弹出层 
            $(this).fadeOut("fast"); 
        }); 
    }

20220617补充:

PC端的图片放大使用上边的代码即可,但是在移动端的时候我们就需要用到两指放大缩小功能,然后还要加上单指移动的功能,

基础代码还是与上边一样,我就不废话了,直接上完整的代码:

<!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>
    <script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/2.2.0/jquery.min.js"
        type="application/javascript"></script>
</head>
<body>
    <div style="text-align:center;margin-top:200px;">
        <img src="https://resource.guanchao.site/uploads/atricle/5db513ccbe77f.png" alt="" style="width:100px;" class="plus">
    </div>
    <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
    
    <div style="text-align:center;margin-top:200px;">
        <img src="https://resource.guanchao.site/uploads/atricle/5db513ccbe77f.png" alt="" style="width:100px;"
            class="plus">
    </div>
    <!-- 弹窗部分代码 -->
    <div id="outerdiv"
        style="position:fixed;top:0;left:0;background:rgba(0,0,0,0.7);z-index:2;width:100%;height:100%;display:none;">
        <div id="innerdiv" style="position:absolute;">
            <img id="bigimg" style="border:5px solid #fff;" src="" />
        </div>
    </div>
    <!-- 弹窗部分代码 -->
</body>
</html>
<script src="https://dev.mools.net/lims/web/common/js/vconsole.min.js"></script>
<script>
    // 初始化
    var vConsole = new VConsole();
    $(function () {
        $(".plus").click(
            function () {
                var _this = $(this);//将当前的pimg元素作为_this传入函数 
                imgShow("#outerdiv", "#innerdiv", "#bigimg", _this);
                //移动端手指移动事件,如果不需要移动端手指事件,这一部分内容可以不加,只要上面两行代码以及imgShow()事件
                var eleImg = document.querySelector('#innerdiv');
                var store = {
                    scale: 1
                };
                //定义移动端的初始位置
                var position_top, position_left, pageX, pageY;
                // 缩放事件的处理
                //事件开始
                eleImg.addEventListener('touchstart', function (event) {
                    event.preventDefault();//阻止默认事件,防止底部内容滚动
                    //在触屏设备下,要判断是单指还是多指操作,可以通过event.touches数组对象的长度判断。
                    var touches = event.touches;
                    var events = touches[0];//单指
                    var events2 = touches[1];//双指
                    if (touches.length == 1) {   //单指操作                         
                        pageX = Number(events.pageX);
                        pageY = Number(events.pageY);
                        store.moveable = true;
                        var _obj = $('#innerdiv');
                        //  .css获取的值是字符串
                        position_left = parseFloat(_obj.css('left')
                            .split('px'));
                        position_top = parseFloat(_obj.css('top')
                            .split('px'));
 
                    } else {
                        // 第一个触摸点的坐标
                        store.pageX = events.pageX;
                        store.pageY = events.pageY;
                        store.moveable = true;
                        if (events2) {
                            store.pageX2 = events2.pageX;
                            store.pageY2 = events2.pageY;
                        }
                        store.originScale = store.scale || 1;
                    }
                }, { passive: false }); //passive: false必须加上,否则控制台报错
                //开始移动
                document.addEventListener('touchmove', function (event) {
                    // event.preventDefault();//阻止默认事件,防止底部滚动
                    if (!store.moveable) {
                        return;
                    }
                    var touches = event.touches;
                    var events = touches[0];
                    var events2 = touches[1];
                    if (touches.length == 1) 
                    {
                        var pageX2 = Number(events.pageX);
                        var pageY2 = Number(events.pageY);
                        //控制图片移动
                        $('#innerdiv').css({
                            'top': position_top   pageY2 - pageY   'px',
                            "left": position_left   pageX2 - pageX   'px'
                        })
                    } 
                    else 
                    {
                        // 双指移动
                        if (events2) {
                            // 第2个指头坐标在touchmove时候获取
                            if (!store.pageX2) {
                                store.pageX2 = events2.pageX;
                            }
                            if (!store.pageY2) {
                                store.pageY2 = events2.pageY;
                            }
 
                            // 获取坐标之间的距离
                            var getDistance = function (start, stop) {
                                //用到三角函数
                                return Math.hypot(stop.x - start.x,
                                    stop.y - start.y);
                            };
                            // 双指缩放比例计算
                            var zoom = getDistance({
                                x: events.pageX,
                                y: events.pageY
                            }, {
                                x: events2.pageX,
                                y: events2.pageY
                            }) / getDistance({
                                x: store.pageX,
                                y: store.pageY
                            }, {
                                x: store.pageX2,
                                y: store.pageY2
                            });
                            // 应用在元素上的缩放比例
                            var newScale = store.originScale * zoom;
                            // 最大缩放比例限制
                            if (newScale > 3) 
                            {
                                newScale = 3;
                            }
                            // 记住使用的缩放值
                            store.scale = newScale;
                            // 图像应用缩放效果
                            eleImg.style.transform = 'scale('
                                  newScale   ')';
                        }
                    }
                }, { passive: false });//*/
 
                document.addEventListener('touchend', function () {
                    store.moveable = false;
                    delete store.pageX2;
                    delete store.pageY2;
                });
                document.addEventListener('touchcancel', function () {
                    store.moveable = false;
                    delete store.pageX2;
                    delete store.pageY2;
                });
            });
        //移动端手指页面结束
    });
 
    //遮罩层图片位置
    function imgShow(outerdiv, innerdiv, bigimg, _this) {
        //这是刚才判断是否PC端的函数事件
        var flag = IsPC();
        console.log(flag);
        var src = _this.attr("src");//获取当前点击的pimg元素中的src属性 
        $(bigimg).attr("src", src);//设置#bigimg元素的src属性 
        /*获取当前点击图片的真实大小,并显示弹出层及大图*/
        $("<img/>").attr("src", src).load(function () {
            //注意在使用这种方法获取窗口高度和宽度的时候,
            //务必在html页面最上方加上一句<!DOCTYPE html>,否则获取屏幕高度时会出问题
            var windowW = $(window).width();//获取当前窗口宽度
            var windowH = $(window).height();//获取当前窗口高度  
            var realWidth = this.width;//获取图片真实宽度 
            var realHeight = this.height;//获取图片真实高度 
            var imgWidth, imgHeight;
            var scale = 0.8;//缩放尺寸,当图片真实宽度和高度大于窗口宽度和高度时进行缩放 
            if (realHeight > windowH * scale) {//判断图片高度 
                imgHeight = windowH * scale;//如大于窗口高度,图片高度进行缩放 
                imgWidth = imgHeight / realHeight * realWidth;//等比例缩放宽度
                if (imgWidth > windowW * scale) {//如宽度扔大于窗口宽度 
                    imgWidth = windowW * scale;//再对宽度进行缩放 
                }
            } else if (realWidth > windowW * scale) {//如图片高度合适,判断图片宽度 
                imgWidth = windowW * scale;//如大于窗口宽度,图片宽度进行缩放 
                imgHeight = imgWidth / realWidth * realHeight;//等比例缩放高度 
            } else {//如果图片真实高度和宽度都符合要求,高宽不变 
                if (flag == false) {
                    imgWidth = realWidth;
                    imgHeight = realHeight;
                } else if (realWidth >= 1000) {  //这里我怕图片太大又做了个判断
                    imgWidth = realWidth;
                    imgHeight = realHeight;
                } else {
                    imgWidth = realWidth * 2;
                    imgHeight = realHeight * 2;
                }
            }
            $(bigimg).css("width", imgWidth);//以最终的宽度对图片缩放 
            var w = (windowW - imgWidth) / 2;//计算图片与窗口左边距 
            var h = (windowH - imgHeight) / 2;//计算图片与窗口上边距 
            $(innerdiv).css({
                "top": h,
                "left": w
            });//设置#innerdiv的top和left属性 
            $(outerdiv).fadeIn("fast");//淡入显示#outerdiv及.pimg 
        });
        $(outerdiv).click(function () {//再次点击淡出消失弹出层 
            $(this).fadeOut("fast");
        });
    };
 
    function IsPC() 
    {
        var sUserAgent = navigator.userAgent;
        if (sUserAgent.indexOf('Android') > -1 || sUserAgent.indexOf('iPhone') > -1 || sUserAgent.indexOf('iPad') > -1 || sUserAgent.indexOf('iPod') > -1 || sUserAgent.indexOf('Symbian') > -1) {
            return false;
        }
        else {
            return true;
        }
    }
</script>

效果如下图所示:

到此这篇关于基于JS实现点击图片在弹出层显示大图效果的文章就介绍到这了,更多相关JS弹出层显示大图内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

基于JS实现点击图片在弹出层显示大图效果的更多相关文章

  1. html5 拖拽及用 js 实现拖拽功能的示例代码

    这篇文章主要介绍了html5 拖拽及用 js 实现拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. swift皮筋弹动发射飞机ios源码

    这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧。

  4. Swift与Js通过WebView交互

    开发环境:Swfit2.3XCode8.2基础概念jscontext,jscontext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码JSValue,JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等JSExport,JSExport是一个协议,遵守此协议,就可以定义我们自己的协议,在协议中声明的API都会在JS中暴露出来,才能调用Swif

  5. JSCore swift

    如果双方相互引用,会造成循环引用,而导致内存泄露。以上是Jscore的基本使用,比较简单

  6. Swift WKWebView的js调用swift

    最近项目需求,需要用到JavaScriptCore和WebKit,但是网上的资源有限,而且比较杂,都是一个博客复制另外一个博客,都没有去实际敲代码验证,下面给大家分享一下我的学习过程。

  7. Swift WKWebView的swift调用js

    不多说,直接上代码:在html里面要添加的的代码,显示swift传过去的参数:这样就实现了swift给js传参数和调用!

  8. 在 Swift 專案中使用 Javascript:編寫一個將 Markdown 轉為 HTML 的編輯器

    你有強烈的好奇心,希望在你的iOS專案中使用JavaScript。jscontext中的所有值都是JSValue對象,JSValue類用於表示任意類型的JavaScript值。因此,我們既需要寫Swift代碼也要寫JavaScript代碼。此外,我們還會在JavaScript中按照這個類的定義來創建一個對象并對其屬性進行賦值。從Swift中呼叫JavaScript就如介紹中所言,JavaScriptCore中最主要的角色就是jscontext類。一個jscontext對象是位於JavaScript環境和本

  9. swift - WKWebView JS 交互

    本文介绍WKWebView怎么与js交互,至于怎么用WKWebView这里就不介绍了HTML代码APP调JS代码结果JS给APP传参数首先注册你需要监听的js方法名2.继承WKScriptMessageHandler并重写userContentController方法,在该方法里接收JS传来的参数3.结果

  10. swift 开发UIWebView跟JS的交互

    前言作为小白的我,才开始入门IOS,选择了swift来进行入门学习,学习做着公司一个简单的小小项目,该项目需要进行跟H5进行交互,然后我就开始研究了UIWebView的使用,其实基本原理跟Android的一样,因为我是Android开发的,所以就顺水推舟了。))//这里设置你需要加载的地址}overridefuncdidReceiveMemoryWarning(){super.didReceiveMemoryWarning()//disposeofanyresourcesthatcanberecreate

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部