It’s a pseudo-element, as defined by the CSS Selectors Level 3 spec:
The
::beforeand::afterpseudo-elements can be used to describe generated content before or after an element’s content.
It is effectively the same as the single-colon syntax defined by the level 2 spec. The level 3 spec introduces an extra colon to differentiate between pseudo-elements and pseudo-classes (which use a single colon).
Both syntaxes will work in newer browsers, but older browsers will not recognise the newer :: style.
For even more detail, you can look at the grammar from the level 3 spec, which states:
‘::’ starts a pseudo-element, ‘:’ a pseudo-class