含有滚动条元素的getBoundingClientRect等属性的值

问题1:首先我们给出iScroll的一个官方的demo,你可以把这个demo拷贝到本地然后运行,或者去github下载

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<title>iScroll demo: scrollbars</title>
<script type="text/javascript" src="../../build/iscroll.js"></script>
<script type="text/javascript">
var myScroll;

function loaded () {
	myScroll = new IScroll('#wrapper', {
		scrollbars: true,
		mouseWheel: true,
		interactiveScrollbars: true,
		shrinkScrollbars: 'scale',
		 fadeScrollbars: false,
		 momentum:true,
		 shrinkScrollbars:'clip',
		 keyBindings:true
	});
}

document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);

</script>

<style type="text/css">
* {
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
}

html {
	-ms-touch-action: none;
}

body,ul,li {
	padding: 0;
	margin: 0;
	border: 0;
}

body {
	font-size: 12px;
	font-family: ubuntu, helvetica, arial;
	overflow: hidden; /* this is important to prevent the whole page to bounce */
}
.iScrollIndicator{
	background-color:red!important;
}
.iScrollVerticalScrollbar{
	background-color:blue!important;
}
#header {
	position: absolute;
	z-index: 2;
	top: 0;
	left: 0;
	width: 100%;
	height: 45px;
	line-height: 45px;
	background: #CD235C;
	padding: 0;
	color: #eee;
	font-size: 20px;
	text-align: center;
	font-weight: bold;
}

#footer {
	position: absolute;
	z-index: 2;
	bottom: 0;
	left: 0;
	width: 100%;
	height: 48px;
	background: #444;
	padding: 0;
	border-top: 1px solid #444;
}

#wrapper {
	position: absolute;
	z-index: 1;
	top: 145px;
	border:1px solid red;
	bottom: 48px;
	width: 500px;
	background: #ccc;
	overflow: hidden;
	left:400px;
	height:600px;
}

#scroller {
	position: absolute;
	z-index: 1;
	-webkit-tap-highlight-color: rgba(0,0,0,0);
	width: 100%;
	-webkit-transform: translateZ(0);
	-moz-transform: translateZ(0);
	-ms-transform: translateZ(0);
	-o-transform: translateZ(0);
	transform: translateZ(0);
	-webkit-touch-callout: none;
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
	-webkit-text-size-adjust: none;
	-moz-text-size-adjust: none;
	-ms-text-size-adjust: none;
	-o-text-size-adjust: none;
	text-size-adjust: none;
}

#scroller ul {
	list-style: none;
	padding: 0;
	margin: 0;
	width: 100%;
	text-align: left;
}

#scroller li {
	padding: 0 10px;
	height: 40px;
	line-height: 40px;
	border-bottom: 1px solid #ccc;
	border-top: 1px solid #fff;
	background-color: #fafafa;
	font-size: 14px;
}

</style>
</head>
<body onload="loaded()">
<div id="header">iScroll</div>

<div id="wrapper">
	<div id="scroller">
		<ul>
			<li>Pretty row 1</li>
			<li>Pretty row 2</li>
			<li>Pretty row 3</li>
			<li>Pretty row 4</li>
			<li>Pretty row 5</li>
			<li>Pretty row 6</li>
			<li>Pretty row 7</li>
			<li>Pretty row 8</li>
			<li>Pretty row 9</li>
			<li>Pretty row 10</li>
			<li>Pretty row 11</li>
			<li>Pretty row 12</li>
			<li>Pretty row 13</li>
			<li>Pretty row 14</li>
			<li>Pretty row 15</li>
			<li>Pretty row 16</li>
			<li>Pretty row 17</li>
			<li>Pretty row 18</li>
			<li>Pretty row 19</li>
			<li>Pretty row 20</li>
			<li>Pretty row 21</li>
			<li>Pretty row 22</li>
			<li>Pretty row 23</li>
			<li>Pretty row 24</li>
			<li>Pretty row 25</li>
			<li>Pretty row 26</li>
			<li>Pretty row 27</li>
			<li>Pretty row 28</li>
			<li>Pretty row 29</li>
			<li>Pretty row 30</li>
			<li>Pretty row 31</li>
			<li>Pretty row 32</li>
			<li>Pretty row 33</li>
			<li>Pretty row 34</li>
			<li>Pretty row 35</li>
			<li>Pretty row 36</li>
			<li>Pretty row 37</li>
			<li>Pretty row 38</li>
			<li>Pretty row 39</li>
			<li>Pretty row 40</li>
			<li>Pretty row 41</li>
			<li>Pretty row 42</li>
			<li>Pretty row 43</li>
			<li>Pretty row 44</li>
			<li>Pretty row 45</li>
			<li>Pretty row 46</li>
			<li>Pretty row 47</li>
			<li>Pretty row 48</li>
			<li>Pretty row 49</li>
			<li>Pretty row 50</li>
		</ul>
	</div>
</div>
<div id="footer" style="background-color:yellow"></div>
</body>
</html>

问题2:计算getBoundingClientRect的值?

如果你随意滚动一下iScroll,然后运行下面的代码:

document.getElementById('wrapper').getBoundingClientRect()
document.getElementById('scroller').getBoundingClientRect()
注意:这时候你就会发现wrapper的值就是到文档顶部距离的高度;而scroller的值=iScroll滚动的距离(向上为负数)+wrapper到文档的距离。其中iScroll滚动的距离可以在控制台中看到。就是下面的scroller元素的transform的translate的值:

<div id="scroller" style="transition-timing-function: cubic-bezier(0.1, 0.57, 0.1, 1); transition-duration: 0ms; 
transform: translate(0px, -603px) translateZ(0px);">	
	</div>
问题3:iScroll中的offsetTop/offsetLeft如何变化?

首先我们看看iScroll的配置项:

myScroll = new IScroll('#wrapper', {
		scrollbars: true,
		mouseWheel: true,
		interactiveScrollbars: true,
		shrinkScrollbars: 'scale',
		 fadeScrollbars: false,
		 momentum:true,
		 shrinkScrollbars:'clip',
		 useTransform:true,//默认为true
		 keyBindings:true
	});
注意:因为iScroll默认使用了transform:translate这种方式,所以其不会修改scroller元素和wrapper元素间距,所以scroller元素的offsetLeft/offsetTop的值都是0。
document.getElementById('scroller').offsetTop
document.getElementById('scroller').offsetTop
但是,如果你把上面的useTransform设置为false,你就会发现这时候就是通过修改top/left值来导致滚动的。scroller元素的offsetTop/offsetLeft都会有值。

<div id="scroller" style="transition-timing-function: cubic-bezier(0.1, 0.57, 0.1, 1); transition-duration: 0ms; 
left: 0px; top: -340px;"></div>
总结:如果使用了translate来产生滚动,这时候的offsetTop/offsetLeft等都是不会发生变化的

你可能感兴趣的:(含有滚动条元素的getBoundingClientRect等属性的值)