| 1 |
lars |
1 |
<?php
|
|
|
2 |
|
|
|
3 |
class StrategyPositionAbsolute {
|
|
|
4 |
function StrategyPositionAbsolute() {
|
|
|
5 |
}
|
|
|
6 |
|
|
|
7 |
function apply(&$box) {
|
|
|
8 |
/**
|
|
|
9 |
* Box having 'position: absolute' are positioned relatively to their "containing blocks".
|
|
|
10 |
*
|
|
|
11 |
* @link http://www.w3.org/TR/CSS21/visudet.html#x0 CSS 2.1 Definition of "containing block"
|
|
|
12 |
*/
|
|
|
13 |
$containing_block =& $box->_get_containing_block();
|
|
|
14 |
|
|
|
15 |
$this->_positionAbsoluteVertically($box, $containing_block);
|
|
|
16 |
$this->_positionAbsoluteHorizontally($box, $containing_block);
|
|
|
17 |
}
|
|
|
18 |
|
|
|
19 |
/**
|
|
|
20 |
* Note that if both top and bottom are 'auto', box will use vertical coordinate
|
|
|
21 |
* calculated using guess_corder in 'reflow' method which could be used if this
|
|
|
22 |
* box had 'position: static'
|
|
|
23 |
*/
|
|
|
24 |
function _positionAbsoluteVertically(&$box, &$containing_block) {
|
|
|
25 |
$bottom = $box->get_css_property(CSS_BOTTOM);
|
|
|
26 |
$top = $box->get_css_property(CSS_TOP);
|
|
|
27 |
|
|
|
28 |
if (!$top->isAuto()) {
|
|
|
29 |
if ($top->isPercentage()) {
|
|
|
30 |
$top_value = ($containing_block['top'] - $containing_block['bottom']) / 100 * $top->getPercentage();
|
|
|
31 |
} else {
|
|
|
32 |
$top_value = $top->getPoints();
|
|
|
33 |
};
|
|
|
34 |
$box->put_top($containing_block['top'] - $top_value - $box->get_extra_top());
|
|
|
35 |
} elseif (!$bottom->isAuto()) {
|
|
|
36 |
if ($bottom->isPercentage()) {
|
|
|
37 |
$bottom_value = ($containing_block['top'] - $containing_block['bottom']) / 100 * $bottom->getPercentage();
|
|
|
38 |
} else {
|
|
|
39 |
$bottom_value = $bottom->getPoints();
|
|
|
40 |
};
|
|
|
41 |
$box->put_top($containing_block['bottom'] + $bottom_value + $box->get_extra_bottom() + $box->get_height());
|
|
|
42 |
};
|
|
|
43 |
|
|
|
44 |
// $bottom = $box->get_css_property(CSS_BOTTOM);
|
|
|
45 |
// $top = $box->get_css_property(CSS_TOP);
|
|
|
46 |
// if ($top->isAuto() && !$bottom->isAuto()) {
|
|
|
47 |
// $box->offset(0, $box->get_height());
|
|
|
48 |
// };
|
|
|
49 |
}
|
|
|
50 |
|
|
|
51 |
/**
|
|
|
52 |
* Note that if both 'left' and 'right' are 'auto', box will use
|
|
|
53 |
* horizontal coordinate calculated using guess_corder in 'reflow'
|
|
|
54 |
* method which could be used if this box had 'position: static'
|
|
|
55 |
*/
|
|
|
56 |
function _positionAbsoluteHorizontally(&$box, &$containing_block) {
|
|
|
57 |
$left = $box->get_css_property(CSS_LEFT);
|
|
|
58 |
$right = $box->get_css_property(CSS_RIGHT);
|
|
|
59 |
|
|
|
60 |
if (!$left->isAuto()) {
|
|
|
61 |
if ($left->isPercentage()) {
|
|
|
62 |
$left_value = ($containing_block['right'] - $containing_block['left']) / 100 * $left->getPercentage();
|
|
|
63 |
} else {
|
|
|
64 |
$left_value = $left->getPoints();
|
|
|
65 |
};
|
|
|
66 |
$box->put_left($containing_block['left'] + $left_value + $box->get_extra_left());
|
|
|
67 |
} elseif (!$right->isAuto()) {
|
|
|
68 |
if ($right->isPercentage()) {
|
|
|
69 |
$right_value = ($containing_block['right'] - $containing_block['left']) / 100 * $right->getPercentage();
|
|
|
70 |
} else {
|
|
|
71 |
$right_value = $right->getPoints();
|
|
|
72 |
};
|
|
|
73 |
|
|
|
74 |
$left = $containing_block['right'] - $right_value - $box->get_extra_right() - $box->get_width();
|
|
|
75 |
$box->put_left($left);
|
|
|
76 |
};
|
|
|
77 |
|
|
|
78 |
// $right = $box->get_css_property(CSS_RIGHT);
|
|
|
79 |
// $left = $box->get_css_property(CSS_LEFT);
|
|
|
80 |
// if ($left->isAuto() && !$right->isAuto()) {
|
|
|
81 |
// $box->offset(-$box->get_width(), 0);
|
|
|
82 |
// };
|
|
|
83 |
}
|
|
|
84 |
}
|
|
|
85 |
|
|
|
86 |
?>
|