Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to position canvas using relative/absolute positioning

I am having trouble setting the location of a canvas relative to another, so I wrote the following test harness.

I would expect that the positioning specified by "top" amd "left" in the div's at the top of the harness would move the origin of the canvases relative to each other.

What am I doing wrong?

<!DOCTYPE html>
<html>
<head>
<form id='form1' style="position:relative">
  <div id='d1' style="position:absolute; top:0; left:0; z-index:1">  
      <canvas id='canvas1' width='200' height='100'>
            Your browser does not support HTML5 Canvas.
      </canvas>
  </div>
  <div id='d2' style="position:absolute; top:50; left:50; z-index:2">
      <canvas id='canvas2' width='100' height='200'>
            Your browser does not support HTML5 Canvas.
      </canvas>
  </div>
  <div id='d3' style="position:absolute; top:75; left:75; z-index:3">
      <canvas id='canvas3' width='50' height='50'>
            Your browser does not support HTML5 Canvas.
      </canvas>
  </div>
</form>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<input id='btn1' type="button" onClick="demoDisplay()" value="Hide canvas with display property">
<input id='btn2' type="button" onClick="demoVisibility()" value="Hide canvas with visibility property">
<input id='btn3' type="button" onClick="demoOrder()" value="Place blue over red">

</head>
<body onLoad="loadMe()">


<script>
function loadMe()
{
    var canvas = document.getElementById("canvas1");
    if (canvas.getContext) { // Canvas Support
       var ctx = canvas.getContext("2d");
       // Work with context
       var grd=ctx.createLinearGradient(0,0,ctx.canvas.height,ctx.canvas.width);
       grd.addColorStop(0,'#8ed6ff');
       grd.addColorStop(1,'#004cb3');
       ctx.fillStyle=grd;
       ctx.rect(0,0,ctx.canvas.width,ctx.canvas.height);
       ctx.fill();
    }   
    var canvas = document.getElementById("canvas2");
    if (canvas.getContext) { // Canvas Support
       var ctx = canvas.getContext("2d");
       // Work with context
       var grd=ctx.createLinearGradient(0,0,ctx.canvas.height,ctx.canvas.width);
       grd.addColorStop(0,'#C00');
       grd.addColorStop(1,'#D00');
       ctx.fillStyle=grd;
       ctx.rect(0,0,ctx.canvas.width,ctx.canvas.height);
       ctx.fill();
    }   
    var canvas = document.getElementById("canvas3");
    if (canvas.getContext) { // Canvas Support
       var ctx = canvas.getContext("2d");
       // Work with context
       var grd=ctx.createLinearGradient(0,0,ctx.canvas.height,ctx.canvas.width);
       grd.addColorStop(0,'#00C');
       grd.addColorStop(1,'#00D');
       ctx.fillStyle=grd;
       ctx.rect(0,0,ctx.canvas.width,ctx.canvas.height);
       ctx.fill();
    }   
}

function demoVisibility()
{
    btn = document.getElementById('btn2')
    if (btn.value==='Hide canvas with visibility property') {
        btn.value = 'Show canvas with visibility property';
        document.getElementById("d2").style.visibility="hidden";
    } else {
        btn.value = 'Hide canvas with visibility property';
        document.getElementById("d2").style.visibility="visible";
    }
}

function demoDisplay()
{
    btn = document.getElementById('btn1')
    if (btn.value==='Hide canvas with display property') {
        btn.value = 'Show canvas with display property';
        document.getElementById("d1").style.display="none";
    } else {
        btn.value = 'Hide canvas with display property';
        document.getElementById("d1").style.display="inline";
    }
}

function demoOrder()
{
    btn = document.getElementById('btn3')
    if (btn.value==='Place blue over red') {
        btn.value = 'Place red over blue';
        document.getElementById("d1").style.zIndex=2;
        document.getElementById("d2").style.zIndex=1;
    } else {
        btn.value = 'Place blue over red';
        document.getElementById("d1").style.zIndex=1;
        document.getElementById("d2").style.zIndex=2;
    }
}
</script>

</body>
</html>
like image 835
Vic Fanberg Avatar asked Jun 23 '13 22:06

Vic Fanberg


People also ask

How do you position position absolute and relative?

An element with position: absolute; is positioned relative to the nearest positioned ancestor (instead of positioned relative to the viewport, like fixed). However; if an absolute positioned element has no positioned ancestors, it uses the document body, and moves along with page scrolling.

How do you position an element with an absolute position?

In position: relative , the element is positioned relative to itself. However, an absolutely positioned element is relative to its parent. An element with position: absolute is removed from the normal document flow. It is positioned automatically to the starting point (top-left corner) of its parent element.

What is an example of absolute position?

Absolute-positioned elements are completely taken out of the regular flow of the web page. They are not positioned based on their usual place in the document flow, but based on the position of their ancestor. In the example above, the absolutely positioned square is inside a statically positioned parent.


2 Answers

Add "px" to your style measurements. E.G top:50; => top:50px;

<form id='form1' style="position:relative">
    <div id='d1' style="position:absolute; top:0px; left:0px; z-index:1">  
        <canvas id='canvas1' width='200' height='100'>
              Your browser does not support HTML5 Canvas.
        </canvas>
    </div>
    <div id='d2' style="position:absolute; top:50px; left:50px; z-index:2">
        <canvas id='canvas2' width='100' height='200'>
              Your browser does not support HTML5 Canvas.
        </canvas>
    </div>
    <div id='d3' style="position:absolute; top:75px; left:75px; z-index:3">
        <canvas id='canvas3' width='50' height='50'>
              Your browser does not support HTML5 Canvas.
        </canvas>
    </div>
  </form>
like image 159
Jarrod Avatar answered Sep 19 '22 05:09

Jarrod


I will make your life simple. Here is the javascript code for the same.

var can = document.querySelector('canvas');
  can.style.position = 'absolute';
  can.style.top = "100px";
  can.style.left = "100px";

Well enjoy styling the page....

like image 22
Vinod Kumar Avatar answered Sep 21 '22 05:09

Vinod Kumar