The vertical-align property specifies the alignment of text relative to surrounding text and the alignment of table cell content; it cannot be used to vertically align an entire block.
One way to vertically center a block on the page is to make it absolutely positioned, with margin-top and margin-bottom of auto. However, for this to work you also need to specify a non-auto value for "top", "bottom" and "height":
<html>
<head>
<style>
@page {
border: solid cyan 1px
}
#foo {
position: absolute;
margin: auto;
text-align: center;
left: 0;
right: 0;
top: 0;
bottom: 0;
height: 3cm;
border: solid red thin;
}
</style>
</head>
<body>
<div id="foo">Hello, world!</div>
</body>
</html>
There does not appear to be any way in CSS to vertically center a block with an automatically determined height. However, I believe that the CSS working group is considering adding "position: center" or some other property for this purpose.