用js怎样做手机端触屏滚动选择效果啊

JavaScript017

用js怎样做手机端触屏滚动选择效果啊,第1张

先说下实现的思路:

1 页面布局,一堆等待滚动选择的列表 先实现一个竖排的列表,触屏能滚动,也就是说先不考虑选择的问题 写一个固定高度的盒子 把一堆待选择的列表放里面 触屏滚动大概就实现了 简单代码:

<div style="height:300px" id=“box”>

<li style="height:100px"></li>

<li style="height:100px"></li>

...

</div>

2: 滚动选择  第一步监控触屏滚动 onmousedown onmousemove onmouseup 监控鼠标触屏在box里的上下移动距离  也就是说滚动屏幕了多远  然后box scrollTop定位的减去移动的距离也就可以算出当前box距离顶部的距离 例如 mousemove -300px 原来的scrollTop为0 那现在0-(-300)=300px 那么每个li 100px 然后定位当前选中的 li标签 300/100 = 3 当前为选中了 列表中的第三个

3 以上只是提供了一个简单的实现思路  下面是别人的案例你可以看下 大体上就是这种思路实现的

网页链接

目标描述:多个图片排列下来,按右边的小按钮,抵达相应位置,鼠标滑动,抵达下一图,或者上一图

知识点:onmousewheel,addEventListener,scrollTo,setTimeout

过程:

1.body 宽,高钉死,100vw,100vh,overflow:hidden 使得不出现滚动条,不然不好看

2.图片放进去,排起来,(注意:默认空隙的处理,可以使用flex布局,空隙就不见了)

3.制作相对于视窗的按钮,几张图片就几个按钮,(position: fixed计算一下高度,可以利用calc计算top使得上下居中)

4.美化一下,css写写

5.先写简单的按钮事件

6.写监听滑动事件(onmousewheel在火狐无效,DOMMouseScroll只在火狐有效)

react在componentDidMount的时候监听

7.补充写一下火狐的

9.测试检查一下。

完成啦,啦啦啦~

我的截图:

缺点:这里我是一直对页面进行监听,导致滑动过快对时候动画效果开始执行对时间延后。体现为滑动对轻,整个就流畅一点。

ps:写这种带计算带页面,我觉得是考验思维的,你可以对这里的知识点不熟练,但是你必须得能理解每一步的加加减减。

在父页面直接滚子页面的屏也是可以的。

frames["iframe"].document.body.scrollTop

你一直给这个对象累加数字也是滚屏的效果了

main.htm:

<html>

<head>

<meta http-equiv='Content-Type' content='text/html charset=gb2312' />

<meta name='author' content='F.R.Huang(meizz梅花雪)//www.meizz.com' />

<title>iframe自适应加载的页面高度</title>

</head>

<body>

<div><iframe src="child.htm"></iframe></div>

</body>

</html>

child.htm:

<html>

<head>

<meta http-equiv='Content-Type' content='text/html charset=gb2312' />

<meta name='author' content='F.R.Huang(meizz梅花雪)//www.meizz.com' />

<title>iframe 自适应其加载的网页(多浏览器兼容)</title>

<script type="text/javascript">

<!--

function iframeAutoFit()

{

try

{

if(window!=parent)

{

var a = parent.document.getElementsByTagName("IFRAME")

for(var i=0i<a.lengthi++) //author:meizz

{

if(a[i].contentWindow==window)

{

var h1=0, h2=0, d=document, dd=d.documentElement

a[i].parentNode.style.height = a[i].offsetHeight +"px"

a[i].style.height = "10px"

if(dd &&dd.scrollHeight) h1=dd.scrollHeight

if(d.body) h2=d.body.scrollHeight

var h=Math.max(h1, h2)

if(document.all) {h += 4}

if(window.opera) {h += 1}

a[i].style.height = a[i].parentNode.style.height = h +"px"

}

}

}

}

catch (ex){}

}

if(window.attachEvent)

{

window.attachEvent("onload", iframeAutoFit)

//window.attachEvent("onresize", iframeAutoFit)

}

else if(window.addEventListener)

{

window.addEventListener('load', iframeAutoFit, false)

//window.addEventListener('resize', iframeAutoFit, false)

}

//-->

</script>

</head>

<body>

<table border="1" width="200" style="height: 400pxbackground-color: yellow">

<tr>

<td>iframe 自适应其加载的网页(多浏览器兼容:IE5.5+、Mozilla、Firefox、Opera、Netscape7.2+、Safari3等,支持XHTML)</td>

</tr>

</table>

</body>

</html>

很多人反应在IE7里使用它会死机,那是因为在自适应高度时触发了 window.onresize 事件,而这个事件又去调用这个调整 <iframe>高度的函数,产生了死循环调用。

这段代码里我对 iframe 所在的父元素也设定了一个高度,以防止iframe 高度变化时页面跳动的太厉害,在调用的时候可酌情使用这个设置。