Instead of creating a cell with side effects (i.e. code that modifies the contents of another cells), I would recommend to create a factory function that modifies the passed-in element (or even creates it).
If you position an image (or other element) on top, make sure to give it {pointer-events: none} so that it doesn't get in the way of interactions (and won't mouseover/-out events to trigger). You may also want to look into the mouseenter/mouseleave events, in combination with checks on event.target.
Ideally though all those animations would be driven by CSS. At first glance I don't see anything that wouldn't be possible with CSS animations, and this in turn will allow you to get away without using any JS at all.