1 scroll家族——scrollTop、scrollLeft
1.1 scrollTop 和 scrollLeft
scrollTop本身含义:被卷去的头部,它就是当你滑动滚轮浏览网页的时候网页隐藏在屏幕上方的距离。scrollLeft:同理scrollTop。
1.2 怎么得到scollTop
我们学习一个事件 : 页面滚动事件window.onscroll = function() { 页面滚动语句 }
各种浏览器下获得scollTop
1. 谷歌浏览器和没有声明 DTD <DOCTYPE > :
document.body.scrollTop;
2. 火狐和其他浏览器
document.documentElement.scrollTop;
3. ie9+和 最新浏览器都认识
window.pageXOffset(scrollLeft); pageYOffset(scrollTop)
兼容性写法:
var scrollTop = window.pageYOffset || document.documentElement.scrollTop
|| document.body.scrollTop || 0;
1.3 代码示例
CSS代码:
body {
height: 3000px;
}
javascript代码:
<script>
window.onscroll = function() {
console.log(11);
var scrollTop = window.pageYOffset || document.documentElement.scrollTop
|| document.body.scrollTop || 0;
document.title = scrollTop;
console.log(scrollTop);
}
</script>
2 封装自己的scollTop函数
2.1 简单介绍javascript对象字面量
javascript有基本的数据类型,同样也可以表示对象。 `var obj = {属性名:值,属性名:值}`访问对象中的属性 `obj.属性名`
代码示例
CSS代码:
body {
height: 3000px;
}
javascript代码:
<script>
function scroll() {
if(window.pageYOffset != null) // ie9+ 和其他浏览器
{
return {
left: window.pageXOffset,
top: window.pageYOffset
}
}
else if(document.compatMode == "CSS1Compat") //判断页面中是否声明的了DTD<!DOCTYPE html>,没有声明为BackCompat
{
return {
left: document.documentElement.scrollLeft,
top: document.documentElement.scrollTop
}
}
return { // 剩下的肯定是怪异模式的
left: document.body.scrollLeft,
top: document.body.scrollTop
}
}
window.onscroll = function() {
console.log(scroll().top);
}
</script>
看看结果是什么?
接下来我们再完成一个示例——固定导航栏
CSS代码:
*{margin:0;padding:0}
img{
vertical-align: top;
}
.main{
margin:0 auto;
width:1000px;
margin-top:10px;
}
.fixed {
position: fixed;
top: 0;
left: 0;
}
html代码:
<div class="top" id="top">
<img src="images/top.png" alt=""/>
</div>
<div class="nav" id="Q-nav">
<img src="images/nav.png" alt=""/>
</div>
<div class="main">
<img src="images/main.png" alt=""/>
</div>
javascript代码:
my.js代码
function $(id) {return document.getElementById(id);}
function scroll() {
if(window.pageYOffset != null) // ie9+ 和其他浏览器
{
return {
left: window.pageXOffset,
top: window.pageYOffset
}
}
else if(document.compatMode == "CSS1Compat")
{
return {
left: document.documentElement.scrollLeft,
top: document.documentElement.scrollTop
}
}
return { // 剩下的肯定是怪异模式的
left: document.body.scrollLeft,
top: document.body.scrollTop
}
}
<script src="my.js" type="text/javascript"></script>
<script>
var nav = $("Q-nav");
var navTop = nav.offsetTop; // 得到导航栏距离顶部的距离
console.log(navTop);
window.onscroll = function() {
// console.log(nav.offsetTop);
if(scroll().top >= navTop)
{
//alert("到位置了");
nav.className = "nav fixed";
}
else
{
nav.className = "nav";
}
}
</script>
2.3 案例
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
img{
position: absolute;
left:0;
top:50px;
}
#demo{
width:1000px;
margin:0 auto;
}
</style>
<script src="my.js" type="text/javascript"></script>
<script type="text/javascript">
window.onload = function(){
var img = document.getElementById("pic");
var offsetTop = img.offsetTop;
var target=offsetTop;
window.onscroll = function(){
var t = scroll().top;
target = offsetTop+t;
//img.style.top = offsetTop + t +"px";
}
var begin = offsetTop;
setInterval(function(){
begin = begin + (target - begin)/10;
img.style.top = begin+"px";
},10);
}
</script>
</head>
<body>
<img src="images/aside.jpg" alt="" id="pic"/>
<div id="demo">
<p>天王盖地虎,小鸡炖蘑菇</p>
<p>天王盖地虎,小鸡炖蘑菇</p>
<p>天王盖地虎,小鸡炖蘑菇</p>
<p>天王盖地虎,小鸡炖蘑菇</p>
<p>天王盖地虎,小鸡炖蘑菇</p>
</div>
</body>
</html>
3 scroll家族——scollTo方法
3.1 scollTo(x,y)方法
scrollTo(xpos,ypos) 方法可把内容滚动到指定的坐标。xpos 必需。要在窗口文档显示区左上角显示的文档的 x 坐标。
ypos必需。要在窗口文档显示区左上角显示的文档的 y 坐标。
因为我们的网页大部分都没有水平滚动条,所以,这个x 不太常用。
3.2 案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
html,body{
width: 100%;
height: 100%;
}
#ul{
width: 100%;
height: 100%;
list-style: none;
}
#ul li{
width: 100%;
height: 100%;
}
#ol{
position: fixed;
top: 0px;
left: 50px;
list-style: none;
}
#ol li{
width: 50px;
height: 50px;
border: 1px solid black;
}
</style>
</head>
<body>
<ul id="ul">
<li>首页</li>
<li>关注</li>
<li>动态</li>
<li>风格</li>
<li>作品</li>
</ul>
<ol id="ol">
<li>首页</li>
<li>关注</li>
<li>动态</li>
<li>风格</li>
<li>作品</li>
</ol>
</body>
</html>
<script type="text/javascript">
var colors = ["red","green","blue","pink","purple"];
var ulbox = document.getElementById("ul");
var olbox = document.getElementById("ol");
var time=null,target,begin=0;
for (var i = 0; i < colors.length; i++) {
ulbox.children[i].style.backgroundColor = colors[i];
olbox.children[i].style.backgroundColor = colors[i];
olbox.children[i].index = i;
olbox.children[i].οnclick=function(){
var li = ulbox.children[this.index];
target = li.offsetTop;
clearInterval(time);
time = setInterval(function(){
begin = begin + (target-begin)/10;
window.scrollTo(0,begin);
if(begin == target){
clearInterval(time);
}
},10);
}
}
</script>
# 3.4 放大镜效果实现 #
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.box {
width: 350px;
height: 350px;
margin: 100px;
border: 1px solid #ccc;
position: relative;
}
.small{
position: relative;
}
.big{
position: absolute;
left: 360px;
top: 0;
width: 400px;
height: 400px;
border: 1px solid #ccc;
overflow: hidden;
display: none;
}
.mask {
width: 175px;
height: 175px;
background: rgba(255, 255, 0, 0.4);
position: absolute;
top: 0;
left: 0;
cursor: move;
display: none;
}
#bigImg{
position: absolute;
left:0;
top: 0;
}
</style>
</head>
<body>
<div class="box" id="box">
<div class="small">
<img src="images/001.jpg" width="350" alt=""/>
<div class="mask"></div>
</div>
<div class="big">
<img id="bigImg" src="images/0001.jpg" width="800" alt=""/>
</div>
</div>
</body>
</html>
<script type="text/javascript" scr="my.js"></script>
<script type="text/javascript">
var small = document.getElementById("box").children[0];
var mask = small.children[1];
var big = document.getElementById("box").children[1];
var box = document.getElementById("box");
var bigImg = document.getElementById("bigImg");
var masktop ,maskleft;
small.onmousemove = function(event){
var event = event || window.event;
//获得鼠标在small盒子中的位置
var pageY = event.pageY || event.clientY + scroll().top;
var pageX = event.pageX || event.clientX + scroll().left;
masktop = pageY - box.offsetTop- mask.offsetWidth/2;
maskleft =pageX - box.offsetLeft - mask.offsetWidth/2;
//防止遮罩层超过小盒子
if(masktop<0){
masktop=0;
}
else if(masktop>this.offsetHeight - mask.offsetHeight)
{
masktop=this.offsetHeight - mask.offsetHeight;
}
if(maskleft<0){
maskleft=0;
}
else if(maskleft> this.offsetWidth - mask.offsetWidth){
maskleft=this.offsetWidth - mask.offsetWidth;
}
mask.style.top = masktop +"px";
mask.style.left = maskleft+ "px";
//移动距离的倍数
var maskToMove = small.offsetHeight - mask.offsetHeight;
var bigImgToMove = 800 - big.offsetHeight;
var moveB = bigImgToMove / maskToMove;
//移动大图片
bigImg.style.left = -maskleft * moveB + "px";
bigImg.style.top = -masktop * moveB + "px";
}
small.οnmοuseοver= function(){
mask.style.display = "block";
big.style.display="block";
}
small.οnmοuseοut= function(){
mask.style.display = "none";
big.style.display="none";
}
</script>
# 总结 #
学习了scollTo家族的属性,综合上述知识及上节课的内容完成放大镜和固定导航栏等案例。
# 预习 #
学习了scollTo家族的属性和事件的冒泡机制。