美文网首页
js配合html2canvas和canvas2image将dom

js配合html2canvas和canvas2image将dom

作者: 努力努力再努力_g | 来源:发表于2018-12-03 15:32 被阅读0次

    最近遇到一个需求,是关于运势测试的,将用户信息保存在底部图上,在微信中长按保存信息会与图片一起被保留下来。
    图示:

    静态页面

    image.png

    保存下来的图片

    image.png

    我们需要用到的资源

    心路历程

    从完全不懂这个技术到做出来大约花了一天的时间,参考网上的资源大体完成了功能

    代码

    <!DOCTYPE html>
    <html>
    <head>
        <title>运势结果</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, minimal-ui">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <link rel="stylesheet" type="text/css" href="css/result.css">
        <style type="text/css">
            #view{
                width:100%;
                height:100%;
                background-size:100% 100%;
                z-index: 99;
                /*position: relative;*/
                position: fixed;
                top: 0;
                left: 0;
                /*right: 0;
                bottom: 0;*/
                display: flex;
            }
            #thecanvas{
                position: absolute;
                top: 0;
                left: 0;
                z-index: 1;
                opacity:0;
            }
            #finalImg{
                position: absolute;
                top: 0;
                left: 0;
                z-index: 500;
                opacity: 0;
                display: flex;
                width: 100%;
            }
            #content{
                /*position: relative;*/
            }
            .content-button {
                z-index: 501
            }
            .shu{
                z-index: 101
            }
            .share-text{
                z-index: 101
            }
            .lottory{
                z-index: 101
            }
            .imgSrc{
                position: absolute;top: 0;
                z-index: 1000;
            }
        </style>
    </head>
    <body>
        <div id="content">
            <div id="view">
                <img src="img/result0.png" style="width: 100%;height: 100%" class="bc">
                <div class="user">
                    2019年 <span>&nbsp;用户名&nbsp;</span> 您的
                </div>
            </div>
            <!-- <div class="imgSrc"></div> -->
            <!--分享、保存  -->
            <div class="share">
                <img src="img/share3.png">
            </div>
            <div class="content-button"></div>
            <!-- <div class="share-text"></div> -->
        </div>
        <div class="lottory"> 
              <img src="img/start.png" style="width: 100%;z-index: 99" >
        </div>
    
    
        <!-- 真正的抽奖点击处 -->
        <div class="real-lottory" style="z-index:501"></div>
        
    
    
    
        <div class="result-mask">
            <img src="img/share.png" style="width: 100%">
        </div>
        <img src="" id="finalImg">
    </body>
    
    <script src="js/jquery-2.1.4.js"></script>
    <script src="js/base64.js"></script>
    <script src="js/canvas2image.js"></script>
    <script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.js"></script>
    <script type="text/javascript">
    
        var height = $("#view").height() || 650;
        var width = $("#view").width();
        console.log(height,width)
        var scale = 2;
        function changeBg(callback){
            var random = parseInt(Math.random()*5,10);
            var sex = sessionStorage.getItem("sex");
            $(".share img").attr("src","img/share"+ random + ".png")
    
            console.log(random,sex)
            if(random == 2){
                if(sex == 1){
                    random = 5
                }
            }
            $(".bc").attr("src","img/result"+ random + ".png")
            callback()
        }
    
        $(".content-button").click(function(){
            $(".result-mask").show();
        })
        $(".result-mask").click(function(){
            $(".result-mask").hide();
        })
    
    function takeScreenshot(callback) {
        var canvas = document.createElement("canvas")
        canvas.setAttribute('id','thecanvas');
        canvas.width = width * 2;
        canvas.height = height * 2;
        canvas.style.width = width + "px";
        canvas.style.height = height + "px";
        var context = canvas.getContext("2d");
        context.scale(2,2);
    
        console.log('test');
        html2canvas(document.getElementById('view'), {
            canvas:canvas,
            onrendered: function(canvas) {
                document.body.appendChild(canvas);
                callback()
            },
        });
        // console.log("a完成")
    }
    $(".real-lottory").click(function(){
        console.log("抽奖")
    })
    $(".save").click(function(e){ 
       setTimeout(canvastoImg(document.getElementsByTagName("canvas")[0],'finalImg'),2000)
    })
    
    function canvastoImg(canvas,id){
      // console.log(canvas,"b开始")
     
        var image = new Image();
        image.src = canvas.toDataURL("image/png");
        $("#" + id).attr('src',image.src)
        $(".imgSrc").text(image.src)
        return image;
      
    }
    
    $(function(){
        changeBg(function(){
            setTimeout(takeScreenshot(function(){
                canvastoImg(document.getElementsByTagName("canvas")[0],'finalImg')
                
              }),2000)
            
        })
        
    
    })
    
    </script>
    </html>
    

    如果你要使用

    把动态生成的canvas和最后生成的img的opcity都设为0,绝对定位到顶端,把canvas的index设置为-1,img高于dom的index,如页面中的 style ---> #thecanvas,#finalImg

    注意

    • 如果你发现你本地的图片无法动态生成到canvas中,你需要把这些图片资源放到服务器中,最好不要跨域(我同事测试说不启动服务也可以,我没有测过,有兴趣可以试试)
    • 发现有时候定位也会导致canvas的生成没有图片只有文字,我把定位改成fixed就能正常出现图(后来发现问题原因:可能是因为图片没有加载出来,用户名信息是absolute定位上去,图片加载慢会导致var height = $("#view").height() = 0,canvas就没有高度,最后导致不能生成要保存的图片啦)
    • 想法:可以看图片长宽比与手机窗口长宽比,计算出canvas需要的高度

    git

    https://github.com/gyn894654492/js-html2canvas-canvas2image-dom-

    相关文章

      网友评论

          本文标题:js配合html2canvas和canvas2image将dom

          本文链接:https://www.haomeiwen.com/subject/asmycqtx.html