【问题标题】:Canvas resize with Flexbox and Enyo使用 Flexbox 和 Enyo 调整画布大小
【发布时间】:2016-12-09 20:22:24
【问题描述】:

我在使用 Flexbox 和 Enyo 时调整画布坐标系的大小时遇到​​问题。参见示例:http://jsfiddle.net/g7MLS/1989/

当你第一次运行它时,一切都很好。缩小框的宽度,文本行保持 1 行,直到画布达到最小宽度,然后文本开始换行。

要查看问题,请取消注释以下行:

c.width = b.width;
c.height = b.height;

Flexbox 现在似乎正在使用内部坐标宽度来安排事物……或其他东西。现在,文本将在画布缩小到最小宽度之前开始换行。

如果没有 Enyo,我无法复制确切的设置,但这很接近并且似乎没有做同样的事情:https://jsfiddle.net/ez6b2q8v/103/

按照我的理解,设置画布宽度/高度应该只影响内部坐标,而不是画布本身的大小。我错过了什么?

var ready = require('enyo/ready'),
  kind = require('enyo/kind'),
  Toolbar = require('onyx/Toolbar'),
  Application = require('enyo/Application'),
  Button = require('enyo/Button');


ready(function() {
  var MySample = kind({
    name: "MySample",
    rendered: function() {
      this.inherited(arguments);
      c = this.$.myCanvas.hasNode();
      b = this.$.myCanvas.getBounds()
      //c.width = b.width;
      //c.height = b.height;
      console.log(c.width);
    },
    buttonTapped: function(inSender, inEvent) {
      this.render();
      return true;
    },

    components: [{
      classes: "main",
      components: [{
        classes: "content",
        components: [{
          classes: "canvas",
          tag: "canvas",
          name: "myCanvas"
        }, {
          classes: "label",
          content: "This text should be on 1 line, but wrap when canvas == min-width"
        }]
      }, {
        kind: Button,
        ontap: "buttonTapped",
        content: "Render",
      }]
    }],

  });

  app = new Application({
    view: MySample
  });
});
.main {
  position: relative;
  margin: 0px;
  padding: 0px;
  box-sizing: border-box;
  background: red;
}

.content {
  order: 0;
  display: flex;
  background: yellow;
  flex: 1 1 auto;
}

.canvas {
  padding: 4px;
  margin: auto;
  min-width: 100px;
  flex: 1 1 auto;
  height: 40px;
  background: blue;
  box-sizing: border-box;
}

.label{
  flex: 0 1 auto;
}

【问题讨论】:

    标签: javascript canvas resize flexbox enyo


    【解决方案1】:

    在没有 CSS 尺寸的情况下,画布的 heightwidth 也将用作尺寸。如果您指定的 CSS 尺寸与属性不同,画布将被扭曲以固定指定的大小。见Canvas width and height in HTML5

    如果您希望使用 flex 布局调整画布内部坐标,则必须按照您在小提琴中演示的那样处理调整大小。在 Enyo 中,您可以将 handleResize 方法添加到 MySample 以更新画布的属性。

    kind({
      name: "MySample",
      rendered: function () {
        this.inherited(arguments);
        this.setupCanvas();
      },
      handleResize: function () {
        this.inherited(arguments);
        this.setupCanvas();
      },
      setupCanvas: function() {
        var c = this.$.myCanvas.hasNode();
        var b = this.$.myCanvas.getBounds()
        c.width = b.width;
        c.height = b.height;
      },
      buttonTapped: function(inSender, inEvent) {
        this.render();
        return true;
      },
    
      components: [{
        classes: "main",
        components: [{
          classes: "content",
          components: [{
            classes: "canvas",
            tag: "canvas",
            name: "myCanvas"
          }, {
            classes: "label",
            content: "This text should be on 1 line, but wrap when canvas == min-width"
          }]
        }, {
          kind: Button,
          ontap: "buttonTapped",
          content: "Render",
        }]
      }],
    
    });
    

    【讨论】:

    • 我知道handleResize,但在实际项目中,它从来没有被这些控件调用过。有问题的控件有 6 或 7 层深,我正在使用拆分器类型的控件来允许水平调整两个主要区域的大小。在试图弄清楚为什么它从未被调用时,我意识到拆分器没有在两个主要区域调用 resize() 。我将其修改为调用 resize(),但仍然从未在此控件上调用 handleResize。但是,它现在可以正常工作。不知何故,调用 resize 它的伟大,伟大,......,祖父母使它工作。
    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多