javascript - Fabric.js canvas.setHeigth 或 setWidth 推送后如何设置 div?

标签 javascript html css image canvas

我打算使用 Fabric.js 为我的学校制作一个类似 twibbon 的网站,这样学生就可以发布图片并下载图片,上面印有我学校的事件图片,然后分享到 Instagram。

要以高分辨率下载图像并保持 Canvas 足够小以适合屏幕,我正在使用从另一个 stackoverflow 问题中找到的解决方案 here

问题是 Canvas 仍然很小,但它会插入我的 div 或按钮 远离 canvas.setWidth 或 setHeigth 的值。 here我的页面看起来像。 我该如何解决这个问题并恢复我的按钮?

这是我的代码:

.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;
}
    <!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>

最佳答案

我建议您简化设计...

将所有信息和操作按钮保留在顶部, Canvas 在下面,这是一个示例:

.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);
}
    <!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>

关于javascript - Fabric.js canvas.setHeigth 或 setWidth 推送后如何设置 div?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51677382/

相关文章:

javascript - 如何使用 java 脚本 window.location 将参数传递给 play 框架中的 java 方法?

html - JSF-<table> 标签不应用背景图像

html - 在 Bootstrap 3 中切换两个字段

CSS3 transitions 想要添加颜色并将其淡化

javascript - 提交/输入后将焦点保持在同一输入字段

javascript - 在 2 个 div 之间设置动画

css - 拉伸(stretch) div 以填充主体

html - 使用过渡打开一个简单的下拉菜单我有基础但不能适应我的设计

javascript - Angular 表达式的解析方式与控制台不同

javascript - 为什么let点的值没有被重新分配