Pseudo elements can only be defined (or better said are only supported) on container elements. Because the way they are rendered are within the container itself as a child element.
input can not contain other elements hence they’re not supported. A
button on the other hand that’s also a form element supports them, because it’s a container of other sub elements.
If you ask me if some browser does display these two pseudo elements on non-container elements it’s a bug and a non-standard conformance. Specification directly talks about element content…
If we carefully read the specification it actually says that they are inserted inside a containing element:
Authors specify the style and location of generated content with the :before and :after pseudo-elements. As their names indicate, the :before and :after pseudo-elements specify the location of content before and after an element’s document tree content. The ‘content’ property, in conjunction with these pseudo-elements, specifies what is inserted.
See? an element’s document tree content. As I understand it this means** within** a container.