From d9ff9e89f02959bed4ffd4fdfbd1d93c0ff0fb71 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Thu, 12 Mar 2015 20:13:25 +0800 Subject: better scrolling --- examples/demos/build.sbt | 6 ++-- .../src/main/scala/scrollmenu/Controller.scala | 2 +- .../src/main/scala/scrollmenu/ScrollSpy.scala | 33 ++++++++-------------- 3 files changed, 16 insertions(+), 25 deletions(-) (limited to 'examples/demos') diff --git a/examples/demos/build.sbt b/examples/demos/build.sbt index 6a7b10c..9190612 100644 --- a/examples/demos/build.sbt +++ b/examples/demos/build.sbt @@ -10,12 +10,12 @@ scalaVersion := "2.11.4" libraryDependencies += "com.lihaoyi" %% "acyclic" % "0.1.2" % "provided" -libraryDependencies += "com.lihaoyi" %%% "upickle" % "0.2.6" +libraryDependencies += "com.lihaoyi" %%% "upickle" % "0.2.7" libraryDependencies += "org.scala-js" %%% "scalajs-dom" % "0.8.0" -libraryDependencies += "com.lihaoyi" %%% "scalatags" % "0.4.5" +libraryDependencies += "com.lihaoyi" %%% "scalatags" % "0.4.6" -libraryDependencies += "com.lihaoyi" %%% "scalarx" % "0.2.7" +libraryDependencies += "com.lihaoyi" %%% "scalarx" % "0.2.8" libraryDependencies += "org.scala-lang.modules" %% "scala-async" % "0.9.2" \ No newline at end of file diff --git a/examples/demos/src/main/scala/scrollmenu/Controller.scala b/examples/demos/src/main/scala/scrollmenu/Controller.scala index 4627837..25af158 100644 --- a/examples/demos/src/main/scala/scrollmenu/Controller.scala +++ b/examples/demos/src/main/scala/scrollmenu/Controller.scala @@ -74,7 +74,7 @@ object Controller{ menuLink.classList.toggle("active") } - main.onscroll = (e: dom.UIEvent) => updateScroll() + dom.document.body.onscroll = (e: dom.UIEvent) => updateScroll() updateScroll() } diff --git a/examples/demos/src/main/scala/scrollmenu/ScrollSpy.scala b/examples/demos/src/main/scala/scrollmenu/ScrollSpy.scala index bd2f194..5c81ba2 100644 --- a/examples/demos/src/main/scala/scrollmenu/ScrollSpy.scala +++ b/examples/demos/src/main/scala/scrollmenu/ScrollSpy.scala @@ -57,10 +57,12 @@ class ScrollSpy(structure: Tree[String], rec(structure).tail } - js.Array( - menuItems.map(name => dom.document.getElementById(Controller.munge(name)).asInstanceOf[html.Element]) - .map((el) => () => offset(el, main)):_* - ) + val offsets = for(name <- menuItems) yield { + val el = dom.document.getElementById(Controller.munge(name)).asInstanceOf[html.Element] + () => offset(el, dom.document.body) + + } + js.Array(offsets:_*) } var open = false @@ -87,21 +89,11 @@ class ScrollSpy(structure: Tree[String], private[this] var scrolling = false private[this] var scrollTop = -1 def apply(): Unit = { - if (!scrolling) { - scrolling = true - scrollTop = main.scrollTop.toInt - dom.setTimeout({() => - scrolling = false - if (scrollTop == main.scrollTop) start() - else apply() - }, - 75 - ) - } + start() } private[this] var previousWin: MenuNode = null private[this] def start(force: Boolean = false) = { - val scrollTop = main.scrollTop + val scrollTop = dom.document.body.scrollTop def walkIndex(tree: Tree[MenuNode]): List[Tree[MenuNode]] = { val t @ Tree(m, children) = tree val win = if(m.start == -1) true @@ -118,6 +110,7 @@ class ScrollSpy(structure: Tree[String], } val winPath = walkIndex(domTrees) + val winItem = winPath.last.value def walkTree(indices: List[Tree[MenuNode]]): Int = indices match { case Nil => 0 @@ -130,8 +123,9 @@ class ScrollSpy(structure: Tree[String], for { child <- children if !indices.headOption.exists(_.value.frag == child.value.frag) - } walkHide(child) - + } { + walkHide(child) + } val size = walkTree(rest) + children.length mn.frag.children(1).asInstanceOf[html.Element].style.maxHeight = if (!open) size * 44 + "px" else "none" @@ -153,10 +147,7 @@ class ScrollSpy(structure: Tree[String], } if (winItem != previousWin || force){ -// scroll(winItem.frag.children(0)) -// dom.history.replaceState(null, null, "#" + winItem.id) previousWin = winItem -// println(winPath.map(_.value.id)) walkTree(winPath) } } -- cgit v1.2.3