popcode icon indicating copy to clipboard operation
popcode copied to clipboard

validation on canvas element incorrectly flags 'width' attribute as an error

Open ianmclaury opened this issue 8 years ago • 3 comments

I'm trying to use a <canvas> element (for a Tiny Turtle exercise) and set its width to something larger than the default of 300px. Naively I tried a css rule:

canvas {
  width: 100%;
  min-height: 400px;
}

But with <canvas>, a css-specified width actually scales the content. This makes the turtle head and line segments appear quite large and even pixellated and does not actually give any more room to draw.

MDN recommends instead that you set the width and height directly on the element. Trying this triggered a popcode validation error on width:

9
Don't use the "width" attribute. Instead, use the CSS width property

Impact: mostly a little annoying. You can't set the real width of the canvas, so there will be unused space at the right margin -- and quite noticeable with a bigger screen. Complicated turtle drawings may not fit well into 300x150 px (although for some reason the height attribute is allowed through validation, so the canvas can be made taller).

Also, the validator-recommended fix isn't a real fix, which is minor in and of itself but we'd like users to be able to rely on its recommendations.

Steps to reproduce:

  1. Open this popcode link: https://popcode.org/?gist=1791db30a9fa1cbcc39e0ec181388634
  2. In the html panel, set the <canvas> element's width attribute to, say, 400. Observe the validation error.
  3. Observe the somewhat-pixellated turtle stamp render (due to the css width being set w/o html width).
  4. Observe the rendered length of a forward(30) segment. Cut that forward down to 10 units to allow more drawing room. Observe that the stamp now overwhelms the line segment.

On a page without validation, eg jsbin, setting the width attr has the desired result of setting the canvas's coordinate system width (which can then optionally be scaled with css).

Tested on macos 10.11 with Safari 10.0.3 and Chrome 56.0.2924.87.

ianmclaury avatar Feb 13 '17 18:02 ianmclaury

Yep had the same issue when working with TinyTurtle. The quick workaround is to manually adjust the width and height in JS as shown in this Popcode gist: https://popcode.org/?gist=17102268aaf06ec26fca3a6e271e70ba

jessewang-arvatosystems avatar Feb 13 '17 19:02 jessewang-arvatosystems

This is definitely a bug though! Best move would be to fix it upstream

outoftime avatar Feb 13 '17 20:02 outoftime

Ditto for <svg>

marcianx avatar May 06 '17 19:05 marcianx