position: absolute, top and left

This commit is contained in:
Christopher Chedeau
2014-04-21 18:34:28 -07:00
parent 39cc1e9b01
commit 756babcdb7
2 changed files with 24 additions and 3 deletions

View File

@@ -102,6 +102,10 @@ var computeLayout = (function() {
return !isUndefined(node.style[dim[axis]]); return !isUndefined(node.style[dim[axis]]);
} }
function isPosDefined(node, pos) {
return !isUndefined(node.style[pos]);
}
function getPosition(node, pos) { function getPosition(node, pos) {
if (pos in node.style) { if (pos in node.style) {
@@ -226,7 +230,11 @@ var computeLayout = (function() {
var/*float*/ mainPos = getPadding(node, leading[mainAxis]) + leadingMainDim; var/*float*/ mainPos = getPadding(node, leading[mainAxis]) + leadingMainDim;
for (var/*int*/ i = 0; i < node.children.length; ++i) { for (var/*int*/ i = 0; i < node.children.length; ++i) {
var/*css_node_t**/ child = node.children[i]; var/*css_node_t**/ child = node.children[i];
child.layout[pos[mainAxis]] += mainPos; if (getPositionType(child) === 'absolute' && isPosDefined(child, leading[mainAxis])) {
child.layout[pos[mainAxis]] = getPosition(child, leading[mainAxis]);
} else {
child.layout[pos[mainAxis]] += mainPos;
}
if (getPositionType(child) === 'relative') { if (getPositionType(child) === 'relative') {
mainPos += getDimWithMargin(child, mainAxis) + betweenMainDim; mainPos += getDimWithMargin(child, mainAxis) + betweenMainDim;

View File

@@ -535,7 +535,7 @@ describe('Layout', function() {
); );
}); });
it('should layout node with specified width', function() { it('should layout node with padding and child with position absolute', function() {
testLayout( testLayout(
{style: {padding: 5}, children: [ {style: {padding: 5}, children: [
{style: {position: 'absolute'}} {style: {position: 'absolute'}}
@@ -546,6 +546,19 @@ describe('Layout', function() {
); );
}); });
it('should layout node with position absolute, top and left', function() {
testLayout(
{style: {}, children: [
{style: {height: 100}},
{style: {position: 'absolute', top: 10, left: 10}}
]},
{width: 0, height: 100, top: 0, left: 0, children: [
{width: 0, height: 100, top: 0, left: 0},
{width: 0, height: 0, top: 10, left: 10}
]}
);
});
it('should layout randomly', function() { it('should layout randomly', function() {
function RNG(seed) { function RNG(seed) {
this.state = seed; this.state = seed;
@@ -559,7 +572,7 @@ describe('Layout', function() {
var rng = new RNG(0); var rng = new RNG(0);
function randMinMax(node, chance, attribute, min, max) { function randMinMax(node, chance, attribute, min, max) {
if (rng.nextFloat() < chance) { if (rng.nextFloat() < chance) {
if (attribute === 'left' || attribute === 'top' || attribute === 'right' || attribute === 'bottom') { if (attribute === 'right' || attribute === 'bottom') {
return; return;
} }
node.style[attribute] = Math.floor(rng.nextFloat() * (max - min)) + min; node.style[attribute] = Math.floor(rng.nextFloat() * (max - min)) + min;