size watcher v2
Triggering the scroll event by increasing wrapper size
by smnh
HTML
<div id="stage" class="preserve3d">
<div id="contentShadow" class="preserve3d">
<div class="bottomLayer preserve3d">
<div class="bottomLayer">
<div id="innerContentShadow">
<div id="innerScrollTopBrace" class="scrollTopBrace">
<div class="scrollTopLabelWrapper">
<div class="scrollTopLabel">
scrollTop: <span id="innerScrollTopValue"></span>
</div>
</div>
</div>
<div class="label">
</div>
</div>
</div>
<div id="innerWrapper" class="wrapper"><div id="innerContent"></div></div>
<div id="innerScrollLabel" class="scrollLabel">scrolled</div>
<div class="label">inner wrapper</div>
</div>
<div id="decreaseHeightButton">▲ -40px</div>
<div id="increaseHeightButton">▼ +40px</div>
<div class="label">content</div>
</div>
</div>
CSS
#stage {
position:absolute;
top:50px;
left:300px;
font-size: 20px;
/* for browsers not supporting 3d transforms fallback to this */
-webkit-transform: rotate(-30deg) skew(10deg);
-moz-transform: rotate(-30deg) skew(10deg);
-ms-transform: rotate(-30deg) skew(10deg);
transform: rotate(-90deg) skew(30deg);
/* for browsers supporting 3d transforms */
-webkit-transform: rotateX(-45deg) rotateZ(-55deg);
-moz-transform: rotateX(-45deg) rotateZ(-55deg);
-ms-transform: rotateX(-45deg) rotateZ(-55deg);
transform: rotateX(45deg) rotateZ( 35deg);
}
#contentShadow {
position:absolute;
width: 200px;
height: 300px;
background-color: #999999;
}
#decreaseHeightButton, #increaseHeightButton {
position: absolute;
left: -104px;
width: 100px;
height: 38px;
line-height: 38px;
text-align: center;
border: 1px solid #999999;
background-color: #cccccc;
cursor: pointer;
}
#decreaseHeightButton {
bottom: 1px;
}
#increaseHeightButton {
bottom: -41px;
}
#innerContent {
height: 400px;
}
#innerContentShadow {
position: absolute;
width: 100%;
height: 400px;
background-color: #cccccc;
}
.scrollTopBrace {
position: absolute;
top: 0;
width: 10px;
border: 2px solid #333333;
}
#innerScrollTopBrace {
left: -15px;
border-right-width: 0;
}
.scrollTopLabelWrapper {
position: absolute;
top: 50%;
}
.scrollTopLabel {
position: absolute;
white-space: nowrap;
}
#innerScrollTopBrace .scrollTopLabel {
-webkit-transform: translate(-105%, -50%);
-moz-transform: translate(-105%, -50%);
-ms-transform: translate(-105%, -50%);
transform: translate(-105%, -50%);
}
.wrapper {
position: absolute;
overflow: auto;
top: 0;
bottom: 0;
left: 0;
right: 0;
box-shadow: 0 0 8px 4px #333333 inset;
border: 2px solid #333333;
}
.label {
position: absolute;
right: 5px;
bottom: 5px;
/* chrome bug...
JavaScript
var decreaseHeightButton = document.getElementById("decreaseHeightButton"),
increaseHeightButton = document.getElementById("increaseHeightButton"),
contentShadow = document.getElementById("contentShadow"),
innerWrapper = document.getElementById("innerWrapper"),
innerScrollLabel = document.getElementById("innerScrollLabel"),
innerContentShadow = document.getElementById("innerContentShadow"),
innerScrollTopBrace = document.getElementById("innerScrollTopBrace"),
innerScrollTopValue = document.getElementById("innerScrollTopValue"),
innerScrollLabelHideTimeout = null;
function updateInnerScrollTop() {
innerContentShadow.style.top = -innerWrapper.scrollTop + "px";
innerScrollTopBrace.style.height = innerWrapper.scrollTop + "px";
innerScrollTopValue.textContent = innerWrapper.scrollTop + "px";
}
function showInnerScrollLabel() {
innerScrollLabel.className = "scrollLabel show";
window.clearTimeout(innerScrollLabelHideTimeout);
innerScrollLabelHideTimeout = window.setTimeout(hideInnerScrollLabel, 500);
}
function hideInnerScrollLabel(e) {
innerScrollLabel.className = "scrollLabel hide";
innerScrollLabelHideTimeout = null;
}
innerWrapper.scrollTop = innerWrapper.scrollHeight - innerWrapper.clientHeight;
updateInnerScrollTop();
decreaseHeightButton.addEventListener("click", function() {
contentShadow.style.height = (contentShadow.offsetHeight - 40) + "px";
}, false);
increaseHeightButton.addEventListener("click", function () {
contentShadow.style.height = (contentShadow.offsetHeight + 40) + "px";
updateInnerScrollTop();
}, false);
innerWrapper.addEventListener("scroll", function() {
updateInnerScrollTop();
showInnerScrollLabel();
}, false);