9

我正在尝试创建一个从 Canvas 元素扩展的“视口”类型元素。我打算让它填充父容器,但这似乎不是很简单。

canvas 元素不适用于 style="width:100%; height:100%" (如果未设置特殊的 Canvas 宽度和高度属性,它将恢复为 300x150 像素的默认值,否则将变为 100x100如果我尝试将这些属性设置为“100%”,则为像素。这让我不得不根据父元素的大小手动设置画布元素的宽度。但是当我试图找出一个访问调整大小事件的方法我可以从自定义元素的角度添加处理程序。我似乎无法从自定义元素中的任何位置访问 window.on.resize。我必须从外部执行此操作吗?

这是一个示例聚合物元素定义:

<polymer-element name="canvas-viewport">
  <template>
    <style>
      @host{
        :scope {
          margin:0px;
          padding:0px;
          display:block;
          position:relative;
          width:100%;
          height:100%;
          background:limegreen;
          overflow:visible;
          border:0;
        }
       }

      div {
        border:0;
        margin:0px;
        padding:0px;
        width:100%;
        height:100%;
      }

    </style>
<div id="container">
      <canvas width="{{wpWidth}}" height="{{wpHeight}}" id="theCanvas"></canvas>
    </div>
    </template>
  <script type="application/dart" src="canvas_viewport.dart"></script>
</polymer-element>

这是随附的聚合物类定义中的一些 dart 代码,用于尝试处理我根据对此问题的建议解决方案所做的调整大小。

@override
void attached() {
  super.attached();
  viewPortContainer = shadowRoot.querySelector("#container");
  window.onResize.listen(resizecontainer);
}


void resizecontainer(Event e){
  wpWidth = viewPortContainer.clientWidth;
  wpHeight = viewPortContainer.clientHeight;
  print("resizing Width:$wpWidth , Height:$wpHeight ");    
}

然而,这会导致在每个调整大小事件中高度增加三个像素的错误,即使边距和填充设置为零也是如此。

4

2 回答 2

5

OnResize 在自定义元素中为我工作。

@override
void attached() {
  super.attached();
  window.onResize.listen((e) {
    print(e.currentTarget.innerWidth); 
  });
}
于 2013-11-17T11:26:56.107 回答
1

这就是我将如何在 Polymer 中实现这一点。

 connectedCallback() {
    super.connectedCallback();
    this._onResize = this.onResize.bind(this);
    window.addEventListener("resize", this._onResize);
 }

 onResize(e) {
    console.log('width', e.currentTarget.innerWidth);
 }

 disconnectedCallback() {
    super.disconnectedCallback();
    window.removeEventListener("resize", this._onResize);
 }
于 2019-09-16T12:46:41.463 回答