O código abaixo mostra como criar uma janela pop-up baseada em CSS, que torna-se visível quando uma função em JavaScript altera o atributo display e uma DIV é exibida por cima da página. Por não precisar abrir uma nova janela ou aba, o código na realidade não gera um pop-up, e sim uma parte do código-fonte, que estava oculta pelo estilo CSS display:none;.

<!DOCTYPE html>
<html lang="pt-br">

<head>
<title>Exibindo pop-up na página HTML</title>

<style type="text/css">
.popup{
position: fixed;
top: 0; bottom: 0;
left: 0; right: 0;
margin: auto;
width: 300px;
height: 150px;
padding: 20px;
border: solid 1px #331;
background: #ffffd0;
display: none;
}
</style>

<script type="text/javascript">

function fechar(){
document.getElementById('popup').style.display = 'none';
}

function abrir(){
document.getElementById('popup').style.display = 'block';
setTimeout ("fechar()", 3000);
}

</script>

</head>

<body>

<DIV id="popup" class="popup">
<p>Conteúdo do pop-up aqui.</p>
<p><small class="fechar"><a href="javascript: fechar();">Fechar pop-up</a></small></p>
</DIV>

<p><a href="javascript: abrir();">Abrir POPUP</a>
<a href="javascript: fechar();">Fechar POPUP</a></p>

</body>

</html>

A propriedade CSS position:fixed manterá o conteúdo pop-up sempre visível, mesmo que o usuário role a página. O conteúdo é ocultado e omitido do processamento da página na linha diplay:none, que não serve apenas para ocultar o pop-up, mas garante que ele não afete o layout da página.

O programa javascript tem duas funções. A função fechar apenas retorna o pop-up ao seu estado original aplicando novamente o estilo CSS display:none;. A função abrir faz o inverso: muda a propriedade display para block, tornando o pop-up visível. Adicionalmente, coloquei um timeout na função que faz com que a função fechar() seja chamada após 3 segundo (3000 porque o tempo é passado em milissegundos).