在这篇文章中http://www.javaeye.com/topic/83932, 我想讨论下google reader的这个功能是怎样实现的。

经过这几天的摸索,和同事的帮助。公司的rss reader已经基本实现了google reader的这种items的模式。

实现了点击某个item时会把这个item移到最顶端。

基本的思想还是通过子div的offsetTop 和 父div的scrollTop 计算出最近的一个div。

以下和附件都是源码。

代码
  1. <html>
  2. <head>
  3. <style type="text/css">
  4. body{
  5. margin:0px 30px 0px 30px;
  6. }
  7. #ttt{
  8. overflow:auto;
  9. height: 600px;
  10. }
  11. .noselect{
  12. width:450px;
  13. margin:5px;
  14. border:solid 1px #666666;
  15. background-color:#ffffff;
  16. }
  17. .selected{
  18. width:450px;
  19. margin:5px;
  20. border:solid 1px #666666;
  21. background-color:#cc0000;
  22. }
  23. </style>
  24. <script type="text/javascript">
  25. function clearAllSelection(){
  26. var posts = document.getElementsByName("item");
  27. for(var i=0; i<posts.length;i++){
  28. if(posts[i].nodeType == "1" && posts[i].tagName.toLowerCase() == "div"){
  29. posts[i].className = "noselect";
  30. }
  31. }
  32. }
  33. function makeTheElementAsCurrentElement(element){
  34. element.className = "selected";
  35. }
  36. function windowOnload(){
  37. var itemBody = document.getElementById("ttt");
  38. itemBody.onscroll = function(){
  39. var currentItem = getCurrentPostItem();
  40. if (currentItem != null){
  41. clearAllSelection();
  42. makeTheElementAsCurrentElement(currentItem);
  43. //markReadIfNess(currentItem);
  44. }
  45. };
  46. connectOnclickEventToPostDiv();
  47. }
  48. function connectOnclickEventToPostDiv(){
  49. var items = document.getElementsByName("item");
  50. for(var i=0;i<items.length;i++){
  51. items[i].onclick=function(){
  52. clearAllSelection();
  53. makeTheElementAsCurrentElement(this);
  54. //markReadIfNess(this);
  55. //move the current item to the top..
  56. document.getElementById("ttt").scrollTop = this.offsetTop;
  57. //this.scrollTo(0, 0);
  58. };
  59. }
  60. }
  61. var previousPostItem = null;
  62. function getCurrentPostItem(){
  63. var itemBody = document.getElementById("ttt");
  64. var items = document.getElementsByName("item");
  65. var tmp=10000;
  66. var nearestElement = null;
  67. for(var i=0;i<items.length;i++){
  68. if (items[i].nodeType == "1" && items[i].tagName.toLowerCase() == "div"){
  69. var x = items[i].offsetTop - itemBody.scrollTop;
  70. if (Math.abs(x) < tmp){
  71. tmp=Math.abs(x);
  72. nearestElement = items[i];
  73. }
  74. }
  75. }
  76. if (previousPostItem == null){
  77. previousPostItem = nearestElement;
  78. return nearestElement;
  79. }else if (previousPostItem != nearestElement){
  80. previousPostItem = nearestElement
  81. return nearestElement
  82. }else{
  83. return previousPostItem;
  84. }
  85. }
  86. </script>
  87. </head>
  88. <body onload="windowOnload();">
  89. <div id="ttt">
  90. <div id="item" name="item" class="noselect">1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  91. <div id="item" name="item" class="noselect">2<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  92. <div id="item" name="item" class="noselect">3<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  93. <div id="item" name="item" class="noselect">4<br/>1<br/>1<br/>1v</div>
  94. <div id="item" name="item" class="noselect">5<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  95. <div id="item" name="item" class="noselect">6<br/>1<br/>1<br/>1<br/>1</div>
  96. <div id="item" name="item" class="noselect">7<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  97. <div id="item" name="item" class="noselect">8<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  98. <div id="item" name="item" class="noselect">9<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  99. <div id="item" name="item" class="noselect">10<br/>1<br/>1<br/>1<br/>1</div>
  100. <div id="item" name="item" class="noselect">11<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  101. <div id="item"  name="item" class="noselect">12<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  102. <div id="item" name="item" class="noselect">13<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  103. <div id="item" name="item" class="noselect">14<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  104. <div id="item" name="item" class="noselect">15<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  105. <div id="item" name="item" class="noselect">16<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1</div>
  106. </div>
  107. </body>
  108. </html>

<script type="text/javascript">render_code();</script>

scorll.htm.zip
 描述:  
下载
 文件名:  scorll.htm.zip
 文件大小:  1 KB
 下载过的:  文件被下载或查看43 次

声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。


相关文章:    关于JavaScript的 貌似类(pseudo-classes)----不吐不快    css-dock-menu 超漂亮的仿MAC的菜单-本人收藏

实现google reader中的post自动聚焦(auto foucs) http://www.javaeye.com/topic/87379相关推荐

  1. 基于Google Reader的个人知识管理方案

    来源月光博客:http://www.williamlong.info/archives/2172.html. 先前我写的<基于Dropbox的个人知识管理平台>讲述了使用Dropbox在个 ...

  2. 转贴:Google Reader:信息背后的信息,无可替代的伟大

    转贴:Google Reader:信息背后的信息,无可替代的伟大 Google宣布将于7月1日关闭Google Reader!尽管是情理之中,甚至也有几次先召,但正式消息来临,依然引发了前所未有的关注 ...

  3. 告别 Google Reader,告别一个时代!

    告别 Google Reader,告别一个时代! 作者: 善用佳软 北京时间7月2日15:00, Google Reader 正式关闭!重发旧文,作为纪念.以下文章原发于2013年4月期 @CHIP ...

  4. google reader 和 抓虾

    每天晚上8.9点时我一般会看看自己收集的各种blog,本来一直使用google reader的聚集服务,今天兴起,看了看 zhuaxia的blog聚集服务,觉得很不错.主要是快,另外各种独特的信息服务 ...

  5. 红星加星红加星红等于爱星星_如何从Google Reader导出已加星标的项目

    红星加星红加星红等于爱星星 If your reaction to the announced demise of Google Reader was to scream "But my s ...

  6. 基于Google Reader发展起来的个性化推荐系统之三大问题

    郑昀@玩聚SR 20091003 中科院的xlvector(即项亮,他所在的团队The Ensemble在7月份获得Netflix大奖赛公开测试排名第一,但在9月22日Netflix宣布BPC获胜,原 ...

  7. Google Reader 干掉了 RSS!

    "Google Reader 扼杀了一代人对于构建托管的社交阅读器的尝试." 作者 | Dan McKinley 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDN ...

  8. 如何在Google表格中直接使用Google翻译

    Google Translate lets you translate words or phrases from one language to another, but did you know ...

  9. Google Reader为什么会关闭

    摘要:Google Reader做为一款RSS阅读器,追求的是干净.纯粹的阅读体验,可以让用户高效.快速的获得优质的阅读体验,其订阅功能还可以实现个性化阅读,让用户只关注自己感兴趣的内容,有利于专注和 ...

最新文章

  1. Spark集群搭建【Spark+Hadoop+Scala+Zookeeper】
  2. 大神们,这是网易邮箱服务器的报错信息,能分析出来什么?
  3. 使用HTML+CSS实现鼠标划过的二级菜单栏
  4. 使用spring boot+shiro+jwt+mybatis-plus搭建项目框架
  5. HTML/CSS——网页SVG ICON(小图标)解决方案
  6. gitlab修改管理员密码流程
  7. 方便维护下拉框数据的UI设计
  8. SQL转换全角和半角函数
  9. 图纸怎么发给别人_微信语音怎么转发?微信语音转发给别人最新办法10秒解决...
  10. visio 2010 激活方法
  11. 查阅国外文献的网站有哪些?
  12. 苹果系列手机往电脑上传照片,有什么方法怎么传
  13. 三进制计算机_“九章”量子计算机这么猛,到底能做啥?只为了一条公式的结果吗...
  14. 计算机台式和电脑的区别吗,直观:工业计算机和家用台式计算机有什么区别
  15. Excel如何批量查询手机号码归属地
  16. zoj2100-Seeding
  17. 信息学奥赛一本通1258:【例9.2】数字金字塔题解
  18. Vue刷新、跳转页面的数据保存方法: sessionStorage + Object.assign()
  19. Unity VR全景漫游
  20. 荣耀Play6T配置怎么样 荣耀Play6T值得买吗

热门文章

  1. centos7.3 mysql创建数据库_CentOS7安装MySQL及创建用户和数据库
  2. 远程连接服务器上的oracle数据库几种方法
  3. 利用二叉树先序遍历序列创建二叉树的算法
  4. F5设备备份映射基本操作
  5. 我用Python爬取了“b站弹幕大军,告诉你什么才是真正的“雨女无瓜”
  6. 2020级C语言大作业 - 喵斯快跑
  7. 零、春风十里不如Linux(零)
  8. WebApi后端框架Token身份认证,Api接口Token验证
  9. 概率论之极大似然估计
  10. Opencv中的MSER特征