W CSS'ie marginesy top i bottom mają tą właściwość, że nakładają się wzajemnie na siebie. Możesz to doskonale zaobserwować na takim przykładzie ("zbadaj" w przeglądarce i zobacz;) ):
<body>
<div class="rectangle"></div>
<div class="rectangle"></div>
<div class="rectangle"></div>
</body>
.rectangle{
width: 200px;
height: 140px;
background: #ddd;
margin: 10px;
}
body{
background-color: #000;
}
W twoim przypadku border "załamuje" ten proces i marginesy nie nałożą się na siebie, jednak gdy go usuniesz wszystko działa zwyczajnie. Natomiast gdybyś dodał np. jakiś tekst wewnątrz div'a to od niego będzie liczony margines.
Poza wspomnianą własnością wynika to z pozycji elementów, która domyślnie dla wszystkich jest statyczna. Jeżeli ustawiłbyś "position:relative" dla "wrappera" i "absolute" dla "haslo" mógłbyś z pomocą właściwości top, left, ... ustawić pozycję "haslo" względem "wrappera". "Wrapper" w skrócie stałby się punktem odniesienia.