size watcher v3
The final result
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">inner content</div>
</div>
</div>
<div id="innerWrapper" class="wrapper"><div id="innerContent"></div></div>
<div class="label">inner wrapper</div>
<div id="innerScrollLabel" class="scrollLabel">scrolled</div>
</div>
<div id="scrollTopBrace" class="scrollTopBrace"><div class="scrollTopLabelWrapper"><div class="scrollTopLabel">scrollTop: <span id="scrollTopValue"></span></div></div></div>
<div class="label">content</div>
<div id="decreaseHeightButton">▲ -40px</div>
<div id="increaseHeightButton">▼ +40px</div>
</div>
<div id="topLayerWrapper" class="topLayer">
<div id="wrapper" class="wrapper"><div id="content"></div></div>
<div class="label">wrapper</div>
<div id="scrollLabel" class="scrollLabel">scrolled</div>
</div>
</div>
CSS
#stage {
position:absolute;
top:180px;
left:230px;
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(-30deg) skew(10deg);
/* for browsers supporting 3d transforms */
-webkit-transform: rotateX(45deg) rotateZ(-35deg);
-moz-transform: rotateX(45deg) rotateZ(-35deg);
-ms-transform: rotateX(45deg) rotateZ(-35deg);
transform: rotateX(45deg) rotateZ(-35deg);
}
#topLayerWrapper {
position: absolute;
width: 200px;
height: 200px;
}
#content {
height: 300px;
}
#contentShadow {
position:absolute;
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;
}
#scrollTopBrace {
right: -15px;
border-left-width: 0;
}
#innerScrollTopBrace {
left: -15px;
border-right-width: 0;
}
.scrollTopLabelWrapper {
position: absolute;
top: 50%;
}
.scrollTopLabel {
position: absolute;
white-space: nowrap;
}
#scrollTopBrace .scrollTopLabel {
-webkit-transform: translate(20px, -50%);
-moz-transform: translate(20px, -50%);
-ms-transform: translate(20px, -50%);
transform: translate(20px, -50%);
}
#innerScrollTopBrace .scrollTopLabel {
-webkit-transform: translate(-105%, -50%);
-moz-transform: translate(-105%, -50%);
...
JavaScript
var content = document.getElementById("content"),
decreaseHeightButton = document.getElementById("decreaseHeightButton"),
increaseHeightButton = document.getElementById("increaseHeightButton"),
wrapper = document.getElementById("wrapper"),
scrollLabel = document.getElementById("scrollLabel"),
contentShadow = document.getElementById("contentShadow"),
scrollTopBrace = document.getElementById("scrollTopBrace"),
scrollTopValue = document.getElementById("scrollTopValue"),
scrollLabelHideTimeout = null,
innerWrapper = document.getElementById("innerWrapper"),
innerScrollLabel = document.getElementById("innerScrollLabel"),
innerContentShadow = document.getElementById("innerContentShadow"),
innerScrollTopBrace = document.getElementById("innerScrollTopBrace"),
innerScrollTopValue = document.getElementById("innerScrollTopValue"),
innerScrollLabelHideTimeout = null;
function updateScrollTop() {
contentShadow.style.top = -wrapper.scrollTop + "px";
scrollTopBrace.style.height = wrapper.scrollTop + "px";
scrollTopValue.textContent = wrapper.scrollTop + "px";
}
function updateInnerScrollTop() {
innerContentShadow.style.top = -innerWrapper.scrollTop + "px";
innerScrollTopBrace.style.height = innerWrapper.scrollTop + "px";
innerScrollTopValue.textContent = innerWrapper.scrollTop + "px";
}
function updateContentShadowSize() {
contentShadow.style.width = content.offsetWidth + "px";
contentShadow.style.height = content.offsetHeight + "px";
}
function showScrollLabel() {
scrollLabel.className = "scrollLabel show";
window.clearTimeout(scrollLabelHideTimeout);
scrollLabelHideTimeout = window.setTimeout(hideScrollLabel, 500);
}
function hideScrollLabel(e) {
scrollLabel.className = "scrollLabel hide";
scrollLabelHideTimeout = null;
}
function showInnerScrollLabel() {
innerScrollLabel.className = "scrollLabel show";
...