gpt4 book ai didi

responsive-design - 在 Fabric.js 中全屏显示 Canvas

转载 作者:行者123 更新时间:2023-12-04 23:52:49 29 4
gpt4 key购买 nike

我希望我的 Canvas 元素始终具有相同的大小 - 独立于客户端的屏幕分辨率。

如果用户使用浏览器进行缩放,则 Canvas 元素应始终具有相同的大小。

此外,纵横比应该始终相同 - 我想要一个 1920-1080 点的坐标空间。 (如果浏览器没有相同的比例,则 Canvas 元素的侧面可以有一个边框)。

我设法用 html + css 实现了这个:

  • with = 100% 的屏幕
  • 最大限度。坐标为 1920 x 1080

  • 但是当我实现 fabric.js 时,它改变了 Canvas 的大小。我不能把它设置回来,有一个响应式设计。

    我怎样才能用fabric.js 实现这个?

    最佳答案

    经过一番试验,我终于找到了一个只需要修改 css-properties 的解决方案。

    答案很简单,虽然很长。

    这是我的 html 正文:

    <body onload='init()'>
    <div id="canvasWrapper">
    <canvas id="canvas" width="100px" height="100px"></canvas>
    </div>
    </body>

    这是我的 css:
    *{
    padding: 0;
    margin: 0;
    border: 0;
    }

    body{
    overflow: hidden;
    }

    #canvasWrapper {
    background-color: red;
    display: inline-block;
    }

    重要的部分是我的 Canvas 包装器的“内联块”,以及主体元素的“溢出:隐藏”。似乎 Canvas 下方有一些像素,这会使两个滚动条都出现。

    经过一些实验,我得到了以下 js代码 :
    function init(){    
    resizeCanvas(); //resize the canvas-Element
    window.onresize = function() { resizeCanvas(); }
    }

    每当屏幕尺寸发生变化时,我的“调整大小”功能就会被调用。

    整个技巧在这个 resize-Function 中完成:
    function resizeCanvas() {
    var w = window,
    d = document,
    e = d.documentElement,
    g = d.getElementsByTagName('body')[0],
    x = w.innerWidth || e.clientWidth || g.clientWidth,
    y = w.innerHeight|| e.clientHeight|| g.clientHeight;

    var cv = document.getElementsByTagName("canvas")[0];
    //var cc = document.getElementsByClassName("canvas-container")[0]; //In case of non-Static Canvas will be used
    var cc = document.getElementById("canvasWrapper");

    var cx,cy; //The size of the canvas-Element
    var cleft=0; //Offset to the left border (to center the canvas-element, if there are borders on the left&right)
    if(x/y > sizeX/sizeY){ //x-diff > y-diff ==> black borders left&right
    cx = (y*sizeX/sizeY);
    cy = y;
    cleft = (x-cx)/2;
    }else{ //y-diff > x-diff ==> black borders top&bottom
    cx = x;
    cy = (x*sizeY/sizeX);
    }
    cc.setAttribute("style", "width:"+x+"px;height:"+y+"px;"); //canvas-content = fullscreen
    cv.setAttribute("style", "width:"+cx+"px;height:"+cy+"px;position: relative; left:"+cleft+"px"); //canvas: 16:9, as big as possible, horizintally centered
    }

    此函数计算窗口宽度,以及在不改变比例的情况下可能的最大 Canvas 尺寸。

    之后,我将 wrapper-div 设置为 fullscreen-size,并将 canvas-Element 的大小设置为之前计算的大小。

    一切正常,无需更改 Canvas 元素的内容,也无需重新绘制任何内容。

    它是跨浏览器兼容的(在 Firefox 25、Chrome 31 和 Internet Explorer 11 上测试过)

    关于responsive-design - 在 Fabric.js 中全屏显示 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19937397/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com