I've done a few tests and provide links to them below the following
discussion.
Am .03.2015, 20:30 Uhr, schrieb Tab Atkins Jr. <jackalm...@gmail.com>:
SVG is highly accessible. Yes, SVG <a> elements are followed just
like HTML <a> elements, and yes, screenreaders do read out <desc>
elements when appropriate.
Nice!
Am .03.2015, 21:15 Uhr, schrieb Tab Atkins Jr. <jackalm...@gmail.com>:
On Fri, Mar 20, 2015 at 1:00 PM, Andrea Rendine
<master.skywalker...@gmail.com> wrote:
About SVG, I made a couple of tests and they are far from being
comprehensive, but this is the fact. SVG image "maps" need to define 2
elements for each "area", i.e. the element itself and its associated
hyperlink.
That's really not much:
<svg width=... height=...>
<image src=foo ... />
<a href=target1><polygon points="..." /></a>
<a href=target2><rect ... /></a>
...
</svg>
The markup complexity seems to be about the same as using
<img>/<map>/<area>, especially if you accompany it with prose like the
example in
<https://html.spec.whatwg.org/multipage/embedded-content.html#the-map-element>
shows.
While inline SVGs are somewhat more verbose and complex, I'd say it's
justifiable. They also bring advantages like being able to link multiple
disconnected areas to a single resource with a single hyperlink.
<svg> elements can be resized by the CSS 'width' and 'height'
properties just fine.
Yes, though my third test showed an inconsistency that might need to be
addressed.
.: Tests :.
I've done tests with Internet Explorer 9 (IE9), Opera 27 (Opera) on
Windows Vista and Firefox 36 (FF), Google Chrome 41 (Chrome), Safari 8
(Safari) on Mac OS 10.10. All test pages show a photograph of a dog and a
few items lying on the floor. The goal is to display the photo with 800px
× 600px in windows that are larger and have the photo resize automatically
in smaller windows, so that there's no horizontal scrolling necessary. The
dog and all the shoes in the photo are "active areas": they are supposed
to show tooltips when hovered and lead to the Wikipedia articles Dog and
Shoe when clicked.
Test 1: https://prlbr.de/2015/03/html-map.html
The first test uses just the classic <map> and <area> elements associated
with an <img>. It works in all browsers in big windows, but when the
window is resized to be small, it works in no browser as required, because
the coordinates in the <map>'s <area> elements don't scale with the image.
This test illustrates the problem that needs to be solved.
Test 2: https://prlbr.de/2015/03/html-map-with-javascript.html
This test uses the HTML code from the first test plus JavaScript code,
which manipulates the coordinates in the <map>'s <area>s after the page
has loaded and whenever the window is resized. This works in all browsers
as expected, if JavaScript is enabled, and demonstrates what needs to be
achieved. However, this does not work in any browser with JavaScript
disabled. This is not satisfactory. I'm not aware of a use case where you
don't want an image map associated with an image to be resized whenever
the image is resized. So resizing of image maps in accordance with their
associated image should really be possible without always adding a
JavaScript program.
Test 3: https://prlbr.de/2015/03/inline-svg.html
This test uses an inline SVG image with width='800px' and height='600px'
attributes specified. It's resized via CSS max-width:100%; height:auto
!important. This works in FF as required. Opera, Chrome and Safari do
something unexpected though: they resize the content of the SVG as
expected, but the "outer" height of the SVG doesn't scale and empty white
space is added above and below the photo. Is this a bug in these browsers?
Is there something ambiguous in the specs that causes inconsistent
behavior? IE9 doesn't get the size of SVG correct at all, unfortunately I
can't test it in a newer IE, as IE9 is the last one available for Vista.
Test 4: https://prlbr.de/2015/03/inline-svg-without-height.html
Test 5: https://prlbr.de/2015/03/inline-svg-without-size.html
Test 4 is almost identical to test 3, but I haven't specified a height on
the the SVG element this time. Test 5 has neither height nor width
specified for the SVG and always gets its size by fitting in the
surrounding <figure> element. Both tests work as expected in FF, Opera,
Safari and Chrome. IE9 doesn't get the size right.
Test 6: https://prlbr.de/2015/03/html-img-with-svg.html
Here I've referenced the SVG (as defined in test 5) with an <img> element
instead of including it inline. This doesn't work in any browser. Except
for IE9 the browsers don't even show the included photograph. IE9 shows
the photograph, but neither links nor tooltips work.
Finally, https://prlbr.de/2015/03/svg-without-size.svg is just the SVG
file that I had referenced in test 6. Its behavior is nice and consistent
in all browsers including IE9, but not a solution to the problem (unless
we drop HTML completely in favor of defining the whole webpage in SVG).
.: Conclusion :.
Test 4 and 5 show that inline SVG is a viable solution. I hope the
inconsistency from test 3 can be solved as well.
.: Final notes :.
I'm fine with inline SVG "image maps" in HTML5.
However, the HTML living standard features the <picture> element "to allow
authors to declaratively control or give hints to the user agent about
which image resource to use, based on the screen pixel density, viewport
size, image format, and other factors"
(https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element).
The SVG solution discussed above references the image by a different SVG
mechanism. That particular SVG solution is not an option for use cases
where the <picture> element's qualities are needed. It might be possible
to adapt the SVG solution to also work with <picture>, for example by
placing a transparent inline SVG on top of a HTML <picture>/<img> element,
possibly adding further complexities. Whether enhancing the native HTML
image <map>s is a better solution then might need to be discussed. I can't
provide useful feedback there, as I haven't used <picture> myself.
Martin