The cause of the problem is antialiasing in the limit (boundary) pixels. To make the circle border less pixelated, pixels that are only halfway inside the circle are displayed translucent.
The problem is that the circle under the top also displays translucent pixels. (in a different color, of course). Thus, a translucent white hue is obtained on top of the translucent red (which is displayed on top of the translucent green).
The end result is that the pixel is not pure white.
To solve the root of the problem, you need to turn off anti-aliasing that AFAIK cannot be with borders (only text and images are in development). In addition, such a decision would make the circle pretty ugly
To soften it, you can make several hacks, with sizes, shadows, etc.
For another way to solve your original CSS problem (besides the excellent one you already have with SVG) see this answer .
source share