I just wonder if it is ok to have a empty tag?
For example:
<div id="header"></div>
It validates fine so that isn't a problem.
Since it validates fine (as it should; the content model for div is
"(%flow
*" which explicitly allows empty content), it's definitely valid,
which was the question you asked in your Subject: line. If you're asking
whether it's harmful, I'm not aware of any circumstances where it is.
However, if you're going to set properties like background color, height,
and width on it in order to get colored areas or the like, IIRC some
browsers will refuse to acknowledge its existence until you put *some*
content (just an will usually work) in it. IOW,
div#header {background-color: red; height: 10px; width: 100%;}
might not give you a 10-pixel high red bar unless you put some content in.