首先按照标准流布好局,然后用jq设置scrollTop;设置当scrollTop等于顶部到模块A时让模块A的css改变为固定定位。如果你不知道写再说吧,我觉得代码要自己写一遍才能记得住,别人使不上劲的。
可用的方法比较多,比较常见的是使用CSS。
1、使用CSS
CSS让DIV固定位置不随滚动条而滚动,fixed元素的绝对位置是相对于HTML元素来说,滚动条是body元素的。
(1)我们需要做的是,让body保持其原有高度,让html只有一个窗口那么高。代码我们可以这样写:
html{overflow:hidden}
body{height:100%overflow:auto}
(2)我们可以利用绝对定位来定位我们想要固定在窗口某个位置的模块。假设我们要固定的内容在右上。
html{overflow:hidden}
body{height:100%overflow:auto}
#rightformform{position:absoluteright:30pxtop50px}
(3)页面由左侧菜单和右侧主体内容构成,右侧内容可能会很多,会出现翻屏。现在是要无论页面怎么翻屏滚动,左侧的菜单始终在左侧。请看CSS解决方案。
#site_nav{position:fixedwidth:160pxpadding:6px10pxheight:100%
background:#ffcoverflow-y:auto}
#content{padding:10px10px10px190px}
(4)我设置左侧div#site_nav的样式,将其位置固定,即position:fixed,并且设置固定宽度,高度为100%,为了区分右侧内容,我设置了背景颜色background:#ffc。
接着,我将内容部分div#content设置其padding值,注意关键是padding-left:190px,只有大于左侧菜单宽度的padding值,才能使右侧主体内容部分不会与左侧菜单重叠。
2、不使用JS:
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<metahttp-equiv="Content-Type"content="text/htmlcharset=utf-8"/>
<title>无标题文档</title>
<styletype="text/css">
ul{
margin:0
padding:0}
li{
list-style-type:nonefloat:leftmargin-left:10pxline-height:30px}
</style>
</head>
<body>
<divstyle="width:100%height:30pxbackground-color:#093position:fixedleft:0pxtop:0px">
<ul>
<li>sd</li>
<li>dsda</li>
<li>dsa</li>
</ul>
</div>
<divstyle="height:10000pxborder:1pxsolidred"></div>
<divstyle="width:100%height:30pxbackground-color:#093position:fixedleft:0pxbottom:0"></div>
</body>
</html>
3、<html>
<head>
<title></title>
<style type="text/css">
html,body {
overflow:hidden
margin:0px
width:100%
height:100%
}
.virtual_body {
width:100%
height:100%
overflow-y:scroll
overflow-x:auto
}
.fixed_div {
position:absolute
z-index:2008
bottom:20px
left:40px
width:800px
height:40px
border:1px solid red
background:#e5e5e5
}
</style>
</head>
<body>
<div class="fixed_div">I am still here!</div>
<div class="virtual_body">
<div style="height:888px">
I am content !
</div>
</div>
分析:
1、html,body:将默认可能会随机出现的滚动条,完全地隐藏了,这样不管您放了啥内容,它们都不会出来了。
2、.virtual_body:顾名思义,就是一个假的body了,它被设置为长宽都为100%的,意思就是它利用了所有可视的浏览器窗体显示所有的内容,并垂直允许出现滚动条。
3、.fixed_div:这下它可以利用绝对值进行定位了,因为在这个场景下,这个页面100%地被那个假冒的body给独霸了,而滚动条反正也出不来,您就可以自认为是在某个点蹲坑了,绝对安全。
何为滚动视差
视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验。 作为网页设计的热点趋势,越来越多的网站应用了这项技术。
通常而言,滚动视差在前端需要辅助 Javascript 才能实现。但是使用background-attachment也可以做到这样的效果。
要了解background-attachment的作用可以参考我的另一篇关于它的简单介绍:
什么是background-attachment
使用background-attachment: fixed实现滚动视差
首先,我们使用background-attachment: fixed来实现滚动视差。fixed 此关键字表示背景相对于视口固定。即使一个元素拥有滚动机制,背景也不会随着元素的内容滚动。
这里的关键在于,即使一个元素拥有滚动机制,背景也不会随着元素的内容滚动。也就是说, 背景图从一开始就已经被固定死在初始所在的位置。
我们使用,图文混合排布的方式,实现滚动视差,HTML 结构如下, .g-word表示内容结构,.g-img表示背景图片结构 :
关键 CSS:
效果如下:
嗯?有点神奇,为什么会是这样呢?可能很多人会和我一样,第一次接触这个属性对这样的效果感到懵逼。
我们把上面background-attachment: fixed注释掉,或者改为background-attachment: local,再看看效果:
这次,图片正常跟随滚动条滚动了,按常理,这种效果才符合我们大脑的思维。
而滚动视差效果,正是不按常理出牌的一个效果,重点来了:
当页面滚动到图片应该出现的位置,被设置了background-attachment: fixed的图片并不会继续跟随页面的滚动而跟随上下移动,而是相对于视口固定死了。
好,我们再来试一下, 如果把所有.g-word内容区块都去掉 ,只剩下全部设置了background-attachment: fixed的背景图区块,会是怎么样呢?
效果如下:
结合这张 GIF,相信能对background-attachment: fixed有个更深刻的认识,移动的只有视口,而背景图是一直固定死的。
综上,就是 CSS 使用background-attachment: fixed实现滚动视差的一种方式,也是相对而言比较容易的一种。
参考文章: 滚动视差?CSS 不在话下