Hi @TonghuiMing
"... empty block ..."
Okay, a block with gap and padding set to zero, and height set to 0.01 px (ends up with bigger gap than 0.01 px, but that's the lowest value that sticks)
The block cannot be "empty" or it will disappear. It must contain a widget, so I used a Placeholder widget with height set to zero.
(Step 1, drag a new Placeholder widget from the Add Widget panel to the bottom of your page, and it is added there inside its own new block).
A series of screen groups, each containing only one screen, results in the same functionality as one screen group containing a series of screens. So, it is indeed possible to position a 'block-with-placeholder' immediately above each screen group containing only one screen.
Then, a list of contents with each item linked to an appropriate block will actually work very well.
The only compromise is that you get a small gap above the top screen and a small gap between each screen. This is not a disaster - your page still can look great and function well.
So, okay good fellow, you get a Kudo from me, too!
Another possible workaround if you don't need a dedicated Page Contents list in a text widget is to create a separate storymap app and then embed it into your Experience Builder page using an embed widget within an appropriate layout widget. Then you have the Heading anchor links with their # endings that work fine within the embed widget, but if you try to put same anchor links into buttons or text widget links outside the embed widget, then of course they link to the separate storymap app, so you gain some navigability within the embed widget but you cannot make a separate linkable page contents list text widget.