现在手机上的文本阅读app已经非常丰富,良好的阅读体验与海量的书库常常令我感到无比兴奋。
我想到8年前用一点几寸屏幕的mp3看电子书的情景,顿生一种淡淡的温馨。再久远一些,小的时候,我也经常和小伙伴们组团去书店看白书,也就是白看书。古老的木质书架上那一叠叠厚重的黄皮小说书,在年幼的我眼里仿佛是比盘子里的午餐肉更加美味可口的东西。
而在当今这个信息化的时代,看书变得空前的便利,可是儿时那种期待和兴奋的感受却消失在了时间的长河。
岁月在流逝,时代在进步。
愿放下所有的浮躁,在新的时代愉快地生活,无所谓明天怎样,我都相信肯定比今天更好。
本文以一个网页版阅读器作为案例,展示JavaScript中,对滚动条的一些处理,这是完成以后的样子:
当我滚动条往上滚动的时候,屏幕右下角会出现一个向上的箭头:
而往下滚动的时候,又自动消失。
当我点击这个半透明的箭头按钮,就会自动滑动到章节的最顶端。
本章就实现这个小功能。
开发工具:HBuilder(个人喜欢,顺从潮流放弃了使用大半年的EditPlus,不过EditPlus确实锻炼了我拼写单词的能力)
测试环境:谷歌浏览器
1. 页面布局与绘制
我们写一个基本的html模板
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>TextReader</title>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<style type="text/css">
*{
padding: 0;
margin: 0;
}
</style>
</head>
<body>
</body>
</html>
接着,我们把背景图片引入进来(尺寸略有调整):
body{
background: url(bg.jpg) no-repeat;
background-size: 100%;
}
我们先写一个div,作为盛放整个手机的父容器。
在它的css样式中,我们做了居中定位(水平)。
.phone {
width:322px ;
height:550px;
position:relative;
left:35%;
top:35px;
background: #66CC00;
}
<div>接下来,引入上下两端的样式图片。
其实,手机的顶部和底部就是两张图片:
我们先把顶部图片引入进来,在引入图片之前,先画两个div来盛放图片。
<body>
<div>然后,通过背景图的方式把图片贴进来。
.phone .phone_top {
background: url(phone_top.png);
height:42px;
}
.phone .phone-bottom {
background: url(phone_bottom.png);
position: absolute;
height: 42px;
width: 100%;
bottom: 0;
}
这样一来,一个手机的大概模子就出来了,接下来,我们把屏幕区域加上去。
.phone .container{
overflow-x: hidden;
overflow-y: auto;
width:90%;
background:#ccc;
height:456px;
font-size:14px;
text-align:left;
background:#dcf3dc;
font-family:微软雅黑;
color:#555;
line-height:28px;
padding:16px;
text-indent: 2em;
padding: 16px 16px 0px 16px;
}
<body>
<div>OK,现在可以把父容器的背景色给去掉了。
background: #66CC00; //去掉
为了把手机模型做得更像一点,我们手动给它加一个按钮,额,就手动画一个吧。
.back {
width: 30px;
height: 30px;
position: absolute;
left: 50%;
margin-left: -15px;
border: 2px solid #c7bcbc;
top: 4px;
border-radius: 50%;
}
<div>虽然span是行内元素,但是因为我们给它设置了 position: absolute , 所以宽度和高度依然是起作用的。
我也是在写这个案例的时候无意中发现的,我以前一直以为需要手动给行内元素升级为块级元素才行。
这样,我们的页面布局差不多久完成啦。
2. 文字部分设计与美化
接下来,我们给阅读器模拟一些数据。
<body>
<div>滚动条的样式不太美观,我们将其美化一下
/** 滚动条样式美化 */
::-webkit-scrollbar{width:5px;height:6px;background:#ccc;}
::-webkit-scrollbar-button{background-color:#e5e5e5;}
::-webkit-scrollbar-track{background:#999;}
::-webkit-scrollbar-track-piece{background:#ccc}
::-webkit-scrollbar-thumb{background:#666;}
::-webkit-scrollbar-corner{background:#82AFFF;}
::-webkit-scrollbar-resizer{background:#FF0BEE;}
scrollbar{-moz-appearance:none !important;background:rgb(0,255,0) !important;}
scrollbarbutton{-moz-appearance:none !important;background-color:rgb(0,0,255) !important;}
scrollbarbutton:hover{-moz-appearance:none !important;background-color:rgb(255,0,0) !important;}
这样就好看多了。
标题部分有一点突兀,我们给出四条美化的建议:
1. 标题居左对齐
2. 底部画一条线,与小说正文分开,并且空开一些。
3. 字体颜色稍微淡一些,不要太黑
4. 字间稍微距大一些
于是
.phone .container h4 {
text-indent: 0;
margin-bottom: 1em;
color:#736357;
border-bottom:1px solid #736357;
letter-spacing: 2px;
}
这样好看一些了吧,当然,每个人审美观不同啦,你也可以调成自己喜欢的样式。
段落之间和文字间距都太小了,我们也调一下,不要那么小气嘛,哈哈。
.phone .container p {
margin-bottom: 15px;
letter-spacing: 2px;
}
恩,好多了。
3. 引入向上的箭头图标
我们准备了一张半透明的箭头图标,现在将其引入。
<body>
<div>样式如下:
.phone .container #toTop {
width: 40px;
height: 60px;
display: inline-block;
position: absolute;
background: url(top.png) no-repeat;
background-size: 100%;
bottom:80px;
right: 15px;
opacity: 0.7;
}
引进来了。
4. js控制
我们通过jQuery的animate方法来实现回到顶部的动画,实现该功能的核心逻辑就是控制滚动条距离顶部的高度,也就是scrollTop,让它变为0就可以了。
//单机图标直接返回顶部
$('#toTop').on('click',function(){
$('.phone .container').eq(0).stop(true, true).animate({ scrollTop: 0},500,function(){
$('#toTop').css({'opacity' : 0});
});
return false;
});
最后,我们还希望实现的一个效果就是,只有在滚动条往上拖动的时候,才把按钮显示出来,否则就隐藏该按钮。毕竟,我们在阅读的时候都不希望一直有个小图标吧。
实现思路也很简单,就是判断当前滚动条到底是向上滚动呢,还是向下滚动?
然后设置按钮的透明度就行了,这时候,我们需要对滚动条进行监听,如果向上滚动就显示按钮,否则隐藏按钮,实现代码如下:
var justScrollTop = 0; //记录上一次滚动条距离顶部的位置
//滚动条监听事件
$('.phone .container').on('scroll',function(e){
if(e.target.scrollTop > justScrollTop){
$('#toTop').css({'opacity' : 0}); //隐藏
}else{
$('#toTop').css({'opacity' : 0.8}); //显示
}
justScrollTop = e.target.scrollTop;
});
效果: