如何利用html和css实现一个下拉页面

html-css015

如何利用html和css实现一个下拉页面,第1张

只用html和css,确实可以实现。

在一个li或div内放两个块级元素,一个是下拉的button,一个是下拉出来的内容。

button始终显示,可以当它是li:hover的下级时,设置不同样式,也可以不设置。

下拉内容块正常设置为display:none,当它是li:hover的下级时,设置为display:block。

如果对悬停时出现,鼠标移开消失不满意,希望下拉页面的出现和点击挂钩,那就必须用js了,html和css无法实现的。

整体布局:

首先需要引入React基础库,dom库,jsx解析库和移动端Jquery库(用于动态请求异步加载数据),然后创建一个Div,引入自己的组建。

整个应用组件

解析:

1、首先对于组建进行初始化状态设置,当组建被加载后,默认加载第一页数据;

2、当进行下拉刷新时,设置状态为第一页并获取第一页数据;

3、当上拉加载更多时,状态为下一页,并获取下一页的数据。

通过Ajax获取新闻数据,对Data进行相应的处理,并进行对应的dom渲染。

** 渲染整个app**

** 静态常量**

子列表项组件,只负责渲染外面传递给他的数据(css设计样式)

** 列表组件**

列表组建下拉刷新解析:

1、通过refs找到滚动的容器scroller,给它添加监听事件,为了兼容电脑端和移动端,需要监听触摸事件和鼠标事件;

2、当触摸开始或鼠标按下时,回调touchstart函数,判断是否滚动到容器顶端,如果滚动到顶端,再判断是否是手机触摸事件,是就记录第一个触摸点的X,Y值,不是就记录电脑鼠标按下的位置;

3、当触摸移动或鼠标移动时,回调touchMove函数,判断是否是触摸状态,同时记录下触摸移动的距离(如果X方向上的位移大于Y方向,则认为是左右滑动并返回):

4、当触摸结束或鼠标抬起时,回调touchEnd函数。若滚动容器在下拉中,但还没到刷新阀值,经过0.3S位移回到0;若已经达到刷新阀值,经过0.1s位移为刷新阀值,显示“加载”,并触发冲外面传进来的刷新回调函数;

列表组建加载更多解析:

1、监听滚动加载:当滚动容器滚动时,回调滚动加载函数;

2、如果是滚动加载状态则返回;

3、当容器滚动总高度- 容器滚动可见高度-滚过的高度小于滚动加载阀值时,设置滚动加载状态,触发从外面传进来的加载更多回调函数。

列表下拉跟随解析:

transformScroller(time, translate)传入两个参数:时间和距离

利用 transition 和transform 改变位移,transition 属性设置 'all ' + time + 's ease-in-out'表示过渡阶段慢快慢

transform 属性设置'translate3d(0, ' + translate + 'px, 0)'位移过程更流畅

当有新的属性需要更新时,也就是网络数据回来之后,把新的数据填进列表;如果之前是下拉刷新状态,恢复;如果之前是滚动加载状态,恢复。

最后渲染列表组建,通过map循环把子列表数据展示出来。

效果图如下:

1、在options中加入如下参数代码(我的代码是在2470行):

//原本就有的部分

HWCompositing: true,

useTransition: true,

useTransform: true,

//我加入的部分

minScrollY : 0,

minScrollX : 0

2、在下面不远处(十行以内)加入如下参数:

//新加部分

this.minScrollY = this.options.minScrollY

this.minScrollX = this.options.minScrollX

原先就有的部分

this.translateZ = this.options.HWCompositing &&utils.hasPerspective ? ' translateZ(0)' : ''

3、最后一处修改,在resetPosition方法内,此处直接贴上更改之后的方法,其实真正的修改只是将this.minScrollX修改成了(代码在2830行左右):

resetPosition: function (time) {

var x = this.x,

y = this.y

time = time || 0

if ( !this.hasHorizontalScroll || this.x >this.minScrollX ) {

x = this.minScrollX

} else if ( this.x <this.maxScrollX ) {

x = this.maxScrollX

}

if ( !this.hasVerticalScroll || this.y >this.minScrollY ) {

y = this.minScrollY

} else if ( this.y <this.maxScrollY ) {

y = this.maxScrollY

}

if ( x == this.x &&y == this.y ) {

return false

}

this.scrollTo(x, y, time, this.options.bounceEasing)

return true

},

全部修改内容如上,调用的时候,只需要传入minScrollX、minScrollY参数便可实现下拉后回弹上面的预留位置了。

注:对于scroll的滚动区域小于包裹容器的,iscroll禁止滚动,会造成无法实现下拉刷新,这里有一个小技巧,就是给滚动区域加一个min-height:101%

最后附上此次修改的dome下载地址,由于dome最初也是从别处拿的(最初的dome不能满足需求),其中的css布局方面个人觉得有些不好,但由于最近工作紧张也没有去改,暂时就先这样吧,有空会优化一下的。