Edit in JSFiddle

var SIDE_LENGTH_THRESHOLD = 1;
var PADDING = 20;

var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");

window.addEventListener('resize', resizeCanvas, false);
function resizeCanvas() {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
}

resizeCanvas();
var settings = initialSettings();
var initialSideLength = settings.sideLength;
drawArt();

var settings = initialSettings();
var initialSideLength = settings.sideLength;
function animate() {
    drawArt();
    settings.sideLength *= 1.01;
    if(settings.sideLength / 4 > initialSideLength) {
        settings.sideLength = settings.sideLength / 2;
    }
}
$(window).keypress(startAnimation);
var animating = false;
function startAnimation(event) {
    if(event.keyCode != 32)
        return;
    
    if(animating)
        return;
    
    animating = true;
    window.setInterval(animate, 1000 / 30);
}

function initialSettings() {
    var x = canvas.width / 2;
    var sideLength = Math.min(canvas.width - PADDING * 2, (canvas.height - PADDING * 2) / Math.sin(Math.PI / 3));
    var y = canvas.height / 2 - Math.sin(Math.PI / 3) * sideLength / 2;
    
    return {
        topPoint: { x: x, y: y},
        sideLength: sideLength
    };
}

function drawArt() {
    canvas.width = canvas.width;
    context.strokeStyle = "#000000";
    sierpinskiTriangle(settings.topPoint, settings.sideLength);
    context.stroke();
}

function sierpinskiTriangle(topPoint, sideLength) {
    context.moveTo(topPoint.x, topPoint.y);
    
    var xOffset = Math.cos(Math.PI / 3) * sideLength;
    var yOffset = Math.sin(Math.PI / 3) * sideLength;
    
    context.lineTo(topPoint.x + xOffset, topPoint.y + yOffset);
    context.lineTo(topPoint.x - xOffset, topPoint.y + yOffset);
    context.lineTo(topPoint.x, topPoint.y);
    
    sierpinskiTriangle_aux({x: topPoint.x, y: topPoint.y + yOffset}, sideLength / 2);
}

function sierpinskiTriangle_aux(bottomPoint, sideLength) {
    context.moveTo(bottomPoint.x, bottomPoint.y);
    var xOffset = Math.cos(Math.PI / 3) * sideLength;
    var yOffset = Math.sin(Math.PI / 3) * sideLength;
    
    context.lineTo(bottomPoint.x + xOffset, bottomPoint.y - yOffset);
    context.lineTo(bottomPoint.x - xOffset, bottomPoint.y - yOffset);
    context.lineTo(bottomPoint.x, bottomPoint.y);
    
    var newSideLength = sideLength / 2;
    if(newSideLength < SIDE_LENGTH_THRESHOLD)
        return;
    
    if(bottomPoint.y - yOffset < canvas.height) {
        sierpinskiTriangle_aux({x: bottomPoint.x - xOffset, y: bottomPoint.y}, newSideLength);
        sierpinskiTriangle_aux({x: bottomPoint.x + xOffset, y: bottomPoint.y}, newSideLength);
    }
    sierpinskiTriangle_aux({x: bottomPoint.x, y: bottomPoint.y - yOffset}, newSideLength);
}
<div>
    <b>Sierpinski Triangle</b>
    <br/>Press "space" to zoom.
</div>
<canvas id="canvas"></canvas>
* { margin:0; padding:0; }

html, body { width:100%; height:100%; }

canvas { display:block; }

div {
    position: absolute;
    top: 10px;
    left: 10px;
    font-family: helvetica;
}