:after render inside a container and <input> can not contain other elements.
Pseudo-elements can only be defined (or better said are only supported) on container elements. Because the way they are rendered is 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: