grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)) creates as many tracks as fit the container's width — even with only 3 items, a wide container might get 6 or 8 tracks, and the empty ones still claim their share of the 1fr space. The 3 real items stay near their minmax minimum, and the rest of the row is taken up by invisible empty tracks.
auto-fit builds the same tracks, but then collapses any track with nothing in it down to zero width. All that freed space flows to the tracks that actually hold items, so they share the 1fr and stretch to fill the full container width.
The rule of thumb: use fill when you want empty tracks to remain (so items keep a fixed size), use fit when you want the items you do have to fill the row. Once there are enough items to wrap onto multiple rows anyway, the two behave identically — the difference only shows up when there's leftover horizontal space.
When to use
Want a handful of cards to hug the left on a wide screen? Use auto-fill. Want them to fill the row completely? Use auto-fit — the default choice for most card grids.