Skip to content

Commit 74791b6

Browse files
committed
fixed resize sensor with elements that start hidden
1 parent 45334e9 commit 74791b6

File tree

2 files changed

+78
-19
lines changed

2 files changed

+78
-19
lines changed

src/ResizeSensor.js

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -153,21 +153,14 @@
153153
var expand = element.resizeSensor.childNodes[0];
154154
var expandChild = expand.childNodes[0];
155155
var shrink = element.resizeSensor.childNodes[1];
156-
var dirty, rafId, newWidth, newHeight;
156+
var dirty, rafId;
157157
var size = getElementSize(element);
158158
var lastWidth = size.width;
159159
var lastHeight = size.height;
160-
var initialHiddenCheck = true, resetRAF_id;
161-
162-
var reset = function() {
163-
//set display to block, necessary otherwise hidden elements won't ever work
164-
var invisible = element.offsetWidth === 0 && element.offsetHeight === 0;
165-
166-
if (invisible) {
167-
var saveDisplay = element.style.display;
168-
element.style.display = 'block';
169-
}
160+
var initialHiddenCheck = true;
161+
var lastAnimationFrame = 0;
170162

163+
var resetExpandShrink = function () {
171164
expandChild.style.width = '100000px';
172165
expandChild.style.height = '100000px';
173166

@@ -176,10 +169,30 @@
176169

177170
shrink.scrollLeft = 100000;
178171
shrink.scrollTop = 100000;
172+
};
179173

180-
if (invisible) {
181-
element.style.display = saveDisplay;
174+
var reset = function() {
175+
// Check if element is hidden
176+
if (initialHiddenCheck) {
177+
var invisible = element.offsetWidth === 0 && element.offsetHeight === 0;
178+
if (invisible) {
179+
// Check in next frame
180+
if (!lastAnimationFrame){
181+
lastAnimationFrame = requestAnimationFrame(function(){
182+
lastAnimationFrame = 0;
183+
184+
reset();
185+
});
186+
}
187+
188+
return;
189+
} else {
190+
// Stop checking
191+
initialHiddenCheck = false;
192+
}
182193
}
194+
195+
resetExpandShrink();
183196
};
184197
element.resizeSensor.resetSensor = reset;
185198

@@ -188,19 +201,17 @@
188201

189202
if (!dirty) return;
190203

191-
lastWidth = newWidth;
192-
lastHeight = newHeight;
204+
lastWidth = size.width;
205+
lastHeight = size.height;
193206

194207
if (element.resizedAttached) {
195208
element.resizedAttached.call(size);
196209
}
197210
};
198211

199212
var onScroll = function() {
200-
var size = getElementSize(element);
201-
var newWidth = size.width;
202-
var newHeight = size.height;
203-
dirty = newWidth !== lastWidth || newHeight !== lastHeight;
213+
size = getElementSize(element);
214+
dirty = size.width !== lastWidth || size.height !== lastHeight;
204215

205216
if (dirty && !rafId) {
206217
rafId = requestAnimationFrame(onResized);

tests/late-trigger.html

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
2+
<head>
3+
<style type="text/css">
4+
#test {
5+
border: 1px solid red;
6+
padding: 20px;
7+
text-align: center;
8+
font-size: 30px;
9+
}
10+
11+
#wrap {
12+
border: 1px solid green;
13+
padding: 20px;
14+
text-align: center;
15+
font-size: 30px;
16+
}
17+
</style>
18+
19+
<script src="../src/ResizeSensor.js"></script>
20+
</head>
21+
<body>
22+
<div id="wrap" style="display: none">
23+
<div id="test"><span id="title"></span></div>
24+
</div>
25+
26+
<script type="application/javascript">
27+
28+
var test = document.getElementById("test");
29+
var title = document.getElementById("title");
30+
31+
//we start hidden, and make it visible later on
32+
new ResizeSensor(test, function(size) {
33+
console.log('Triggered', size);
34+
title.innerHTML = size.width + "px X " + size.height + "px";
35+
});
36+
37+
setTimeout(function() {
38+
console.log('This should trigger a resize sensor event');
39+
document.getElementById("wrap").style.display = "block";
40+
}, 2000);
41+
42+
setTimeout(function() {
43+
console.log('Another trigger');
44+
document.getElementById("wrap").style.maxWidth = "500px";
45+
}, 4000);
46+
47+
</script>
48+
</body>

0 commit comments

Comments
 (0)