forked from dreamerslab/jquery.actual
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjs.actual.js
95 lines (77 loc) · 2.49 KB
/
js.actual.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*! Copyright 2022
* Licensed under the MIT License (LICENSE.txt).
*
* Version: 0.1.0
*/
HTMLElement.prototype.actual = function (method, options) {
const defaults = {
absolute: false,
clone: false,
display: 'block',
convertToNumber: false
};
const configs = Object.assign({}, defaults, options);
let target = this;
let fix, restore;
if (configs.clone === true) {
fix = function() {
const style = 'position: absolute !important; top: -1000 !important;';
// this is useful with css3pie
target = Object.assign(
{},
target,
{ style: style },
{ parentNode: document.body }
);
};
restore = function() {
// remove DOM element after getting the width
target.parentNode.removeChild(target);
};
} else {
let tmp = [];
let style = '';
let hidden;
fix = function() {
// get all hidden parents
hidden = Array.prototype.filter.call(target.parentElement.querySelectorAll(':scope *'), (el) => el.style.display === 'none').concat([target]);
if (window.getComputedStyle(target.parentElement).display === 'none') {
hidden.push(target.parentElement);
}
style += 'visibility: hidden !important; display: ' + configs.display + ' !important;';
if (configs.absolute === true) style += 'position: absolute !important;';
// save the origin style props
// set the hidden el css to be got the actual value later
for (let i = 0; i < hidden.length; i++) {
// Save original style. If no style was set, getAttribute() returns null
const elem = hidden[i];
const thisStyle = elem.getAttribute('style');
tmp.push(thisStyle);
// Retain as much of the original style as possible, if there is one
elem.setAttribute(
'style',
thisStyle ? thisStyle + ';' + style : style
);
}
};
restore = function() {
// restore origin style values
for (let i = 0; i < hidden.length; i++) {
const elem = hidden[i];
const _tmp = tmp[i];
if (_tmp === undefined) {
elem.removeAttribute('style');
} else {
elem.setAttribute('style', _tmp);
}
}
};
}
fix();
const actual = configs.convertToNumber ?
parseFloat(window.getComputedStyle(target)[method]) :
window.getComputedStyle(target)[method];
restore();
// IMPORTANT, this plugin only return the value of the first element
return actual;
};