As Harsh Patel has pointed out, the concept of an empty element comes from SGML, on which HTML is based.
In SGML, empty elements are those declared as follows:
<!ELEMENT x - - EMPTY>
<!ELEMENT x EMPTY>
- - characters are tag omission indicators, another feature of SGML not to be confused with empty elements; you can read more about it in any text on SGML, or in my attempt at a modern account on SGML).
SGML empty elements, when following traditional SGML parsing rules, must not have end-element tags. In the updated WebSGML (ISO 8879 Annex K) revision of SGML, end-element tags for elements with declared content
EMPTY are tolerated according to the
FEATURES MINIMIZE EMPTYNRM setting of the effective SGML declaration (a set of parsing flags and properties for an SGML parser).
ISO 8879 Annex K was published in 1999 to align SGML with XML, the then-new subset/profile of SGML introduced by W3C members to simplify parsing, with the intent to eventually replace SGML as basis for HTML. In XML, elements with declared content
EMPTY must either have end-element tags, or use the XML-style empty element syntax
<x/> which represents a sequence of a start-element tag immediately followed by an end-element tag (and which is also supported by WebSGML, but has no meaning in HTML, even though you often see markup such as
<p ... /> in an attempt to make markup parse as both HTML and XML/XHTML). The overriding goal of XML was to allow schema-less parsing of markup, eg. eliminating the need to tell a parser empty element, tag omission, attribute quoting and other short form rules via markup declarations such as the ones above.
But XHTML kindof failed as a widely supported standard for browsers (for whatever reason), and around 2005/2006, the Google-led WHATWG group of browser vendors started working on HTML 5, defining their own rules for HTML parsing which are normatively not based on SGML, much less on XML. Even though the HTML 5 specification doesn't normatively reference the SGML ISO 8879 standard, HTML 5 is of course still based on SGML, and modern HTML, with all its special rules, can be parsed cleanly as SGML (see DTD for HTML 5.1 and HTML 5 DTD reference; disclaimer: this is my project and the full paper of a talk I gave at the XML Prague 2017 conference).
In the W3C HTML 5.2 recommendation version (published yearly by W3C from WHATWG materials), the following elements are empty elements:
input. This is essentially a fixed set of elements which isn't ever going to change (save for removals, eg. in W3C HTML 5.2, the
keygen element which used to be an element with declared content
EMPTY in the HTML 5.1 version was removed).