Когда вы даете элементу "position: относительный", он сохраняет свое место в потоке документов, поэтому, когда вы изменяете его позицию на странице с верхом: 100px или чем-то другим, он перемещается, но пространство, которое он освобождает, не удаляется из документ. Следовательно, ничто не может занять его место, а z-index ничего не делает.
Попробуйте это:
<div class="action">
// Switch the two images in the document flow to make this easier, although you can ignore that if you want.
<img id="background" src="https://res.cloudinary.com/dytmcam8b/image/upload/v1561670551/virtual%20pet/little-board.png" alt="pin board image">
<img id="heart" src="https://res.cloudinary.com/dytmcam8b/image/upload/v1561725918/virtual%20pet/l1.png" alt="heart points image">
<div id="bennyNormal"></div>
</div>
Так что теперь #heart больше не находится «под» фоновым изображением в потоке документов. Элемент bennyNormal по-прежнему находится «над» всем внутри div #action, но потому что изображение #background идет первым (с относительной позицией (или даже если у него нет позиции) #background будет держать div под ним на странице в потоке документов Если вы также дадите #background display: block, это остановит перемещение div, если это когда-либо станет проблемой.
Тогда:
#heart {
z-index: 99999; <== this is irrelevant now. get rid of it.
left: 200px; <== change these to position over #background as you wish
top: 100px;
height: 100px;
width: 100px;
position: absolute; <== important bit.
}
#background {
width: 800px;
margin: 0 auto;
display: none; <== You want it invisible? Should be block.
z-index: -10; <= Same with this. Don't screw around with z-index if you can avoid it.
position: relative; <== This no longer matters, but you can still include it
}