(this is the draft page; I posted the final version here: https://simblob.blogspot.com/2016/10/outside-box.html)
I write interactive explanations; I'm always looking for simpler ways to explain things.
Think back to every technical paper you've read. The text connects to diagrams by using text such as "see figure 4". Maybe it's more specific and says "in figure 4 see circle 24". Maybe it's a hypertext link. However if I look at how I take notes on paper, I don't do that! I just draw an arrow to the thing I want to point to.
From an early age we have invisible boxes around text and diagrams, keeping them apart. It doesn't have to be this way. Pointing is the simplest way to direct attention to something. Why don't we do it more? I don't know, but these are the kinds of things I'm exploring on the web.
How did I implement this? The first guess would be that I'm using
a giant SVG overlay that covers the area between the pointer and
the target. I'm not! That's
the only SVG element on the page. What's the trick? By default, the overflow
for an SVG element is set to hidden
; in some versions of IE it was visible
and
I had to set it back to hidden. That keeps the content inside its
bounding box. But the IE situation made me wonder — if I set it to visible
,
what happens? It turns out you can draw outside the box! This
seems to work across the browsers I've tried.
The second thing I need to do is construct an arrow path. The
source and target of the arrow may be in different SVG elements,
or they might not be SVG at all. For this page I use
an invisible span
in the text as the anchor. I use getBoundingClientRect()
to
get the coordinates on the page. Then I pick the midpoint of one
side of the rectangle as the arrow source or target. I need to
translate all the coordinates into the coordinate space of the SVG
I'm drawing into.
For this demo I hard-coded the size, curvature, and directions of the arrows. I don't adjust them when the page is resized. For a reusable library, I think it'd be cleaner to have one svg per arrow anchor.