首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >被Fabric.js canvas.setHeigth或setWidth推送后,如何将div重新设置?

被Fabric.js canvas.setHeigth或setWidth推送后,如何将div重新设置?
EN

Stack Overflow用户
提问于 2018-08-04 01:19:13
回答 1查看 126关注 0票数 2

我打算用Fabric.js为我的学校做一个类似twibbon的网站,这样学生们就可以发布一张照片,下载上面有我的学校竞选图片,并分享到Instagram上。

为了下载高分辨率的图像并保持画布足够小以适应屏幕,我正在使用从另一个堆栈溢出问题here中找到的解决方案

问题是画布仍然很小,但它通过canvas.setWidth或setHeigth的值推开了我的div或按钮。here's我的页面看起来像这样。我怎样才能修复这个问题并带回我的按钮?

下面是我的代码:

代码语言:javascript
复制
.canvas-container canvas { 
  width: 400px !important; 
  height: 500px !important; 
  border: 1px solid blue;
}
body{
  font-family: 'Helvetica', Tahoma, Geneva, Verdana, sans-serif;   
}
h1{
  color: rgb(119, 214, 124);
}
.site{
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-gap: 1em;
}
代码语言:javascript
复制
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="cssTest.css">
    <title>Twibbon</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.3.3/fabric.min.js"></script>
    <script src="FileSaver.js"></script>
    <script src="canvas-toBlob.js"></script>
    </head>
    <body>
    <div class="site">
        <h1 class="title">Fortafaste Campaign</h1>
        <canvas id="c"></canvas>
        <input type="file" id="d" class="button">
        <input id="download" type="button" value="download" />
        <h2 class="contact">instagram</h2>
    </div>
    <script>
        var canvas = new fabric.Canvas('c');
        canvas.setWidth(1080);
        canvas.setHeight(1350);

        var canvasWrapper = document.getElementById('c');
        var canvasWrapperWidth = canvasWrapper.clientWidth;
        $(function () {
            $(":file").change(function () {
                if (this.files && this.files[0]) {
                    var reader = new FileReader();
                    reader.onload = imageIsLoaded;
                    reader.readAsDataURL(this.files[0]);
                }
            });
        });
        fabric.Image.fromURL('twibbon2 fortafaste.png',function(img){
            img.scaleToWidth(canvas.getWidth());
            canvas.setOverlayImage(img, canvas.renderAll.bind(canvas));
        });
        function imageIsLoaded(e) {
            fabric.Image.fromURL(e.target.result,function(img){
                var aspectRatio = 1350/1080;
                var factor = 1080 / img.width;
                img.set({
                    scaleX: factor,
                    scaleY: factor 
                });
                canvas.add(img);
                canvas.sendToBack(img);
            });
        };
       
        $("#download").click(function(){
            $("#c").get(0).toBlob(function(blob){
                saveAs(blob, "myIMG.png");
            });
        });
    </script>
</body>
</html>

EN

回答 1

Stack Overflow用户

发布于 2018-08-04 09:11:08

我建议你简化你的设计...

将所有信息和操作按钮放在顶部,画布放在下面,下面是一个示例:

代码语言:javascript
复制
.canvas-container canvas { 
  width: 400px !important; 
  height: 500px !important; 
  border: 1px solid blue;
}
body{
  font-family: 'Helvetica', Tahoma, Geneva, Verdana, sans-serif;   
}
h1{
  color: rgb(119, 214, 124);
}
代码语言:javascript
复制
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="cssTest.css">
    <title>Twibbon</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.3.3/fabric.min.js"></script>
    <script src="FileSaver.js"></script>
    <script src="canvas-toBlob.js"></script>
    </head>
    <body>
    <div class="site">
        <div>
          <h1 class="title">Fortafaste Campaign</h1>
          <input type="file" id="d" class="button">
          <input id="download" type="button" value="download" />
          <h2 class="contact">instagram</h2>
        </div>
        <canvas id="c"></canvas>
    </div>
    <script>
        var canvas = new fabric.Canvas('c');
        canvas.setWidth(1080);
        canvas.setHeight(1350);

        var canvasWrapper = document.getElementById('c');
        var canvasWrapperWidth = canvasWrapper.clientWidth;
        $(function () {
            $(":file").change(function () {
                if (this.files && this.files[0]) {
                    var reader = new FileReader();
                    reader.onload = imageIsLoaded;
                    reader.readAsDataURL(this.files[0]);
                }
            });
        });
        fabric.Image.fromURL('twibbon2 fortafaste.png',function(img){
            img.scaleToWidth(canvas.getWidth());
            canvas.setOverlayImage(img, canvas.renderAll.bind(canvas));
        });
        function imageIsLoaded(e) {
            fabric.Image.fromURL(e.target.result,function(img){
                var aspectRatio = 1350/1080;
                var factor = 1080 / img.width;
                img.set({
                    scaleX: factor,
                    scaleY: factor 
                });
                canvas.add(img);
                canvas.sendToBack(img);
            });
        };
       
        $("#download").click(function(){
            $("#c").get(0).toBlob(function(blob){
                saveAs(blob, "myIMG.png");
            });
        });
    </script>
</body>
</html>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51677382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档