ソースを参照

no debounce

master
piq9117 4年前
コミット
fb52c5b3ea
5個のファイルの変更2690行の追加212行の削除
  1. +3
    -1
      bower.json
  2. +1
    -0
      src/13SlideInOnScroll/.tern-port
  3. +1
    -1
      src/13SlideInOnScroll/SlideInOnScroll.js
  4. +56
    -12
      src/13SlideInOnScroll/SlideInOnScroll.purs
  5. +2629
    -198
      src/13SlideInOnScroll/app.js

+ 3
- 1
bower.json ファイルの表示

@@ -31,7 +31,9 @@
"purescript-refs": "^4.1.0",
"purescript-unsafe-coerce": "^4.0.0",
"purescript-profunctor-lenses": "^6.2.0",
"purescript-parseint": "^1.1.0"
"purescript-parseint": "^1.1.0",
"purescript-event": "^1.2.4",
"purescript-datetime": "^4.1.1"
},
"devDependencies": {
"purescript-psci-support": "^4.0.0"


+ 1
- 0
src/13SlideInOnScroll/.tern-port ファイルの表示

@@ -0,0 +1 @@
50172

+ 1
- 1
src/13SlideInOnScroll/SlideInOnScroll.js ファイルの表示

@@ -1,3 +1,3 @@
exports.nodeHeight = function(node) {
exports.nodeHeightImpl = function(node) {
return node.height;
};

+ 56
- 12
src/13SlideInOnScroll/SlideInOnScroll.purs ファイルの表示

@@ -3,25 +3,42 @@ module SlideInOnScroll where
-- Main
import Prelude
import Control.Monad.Reader.Trans
import Unsafe.Coerce (unsafeCoerce)
import Data.Int (toNumber)

-- Date
import Data.Time.Duration (Milliseconds(..))

-- Event
import FRP.Event as FRP
import FRP.Event.Time as FRPT

-- Effect
import Effect (Effect, foreachE)
import Debug.Trace
import Effect.Class (liftEffect, class MonadEffect)
import Effect.Uncurried (EffectFn1, runEffectFn1)

-- DOM
import Web.HTML (window)
import Web.DOM.ParentNode (ParentNode, querySelectorAll, QuerySelector(..))
import Web.HTML.HTMLDocument (HTMLDocument)
import Web.HTML.HTMLDocument as HTMLDocument
import Web.HTML.Window (document, Window, innerHeight, scrollY)
import Web.HTML.Window (Window)
import Web.HTML.Window as Window
import Web.DOM.Internal.Types (Node)
import Web.Event.Internal.Types (EventTarget, Event)
import Web.DOM.NodeList (toArray)
import Web.Event.EventTarget (addEventListener, eventListener)
import Web.Event.Event (EventType)
import Web.Event.Event (EventType(..))
import Web.HTML.HTMLElement (HTMLElement, offsetTop, classList)
import Web.DOM.DOMTokenList (add, remove)
import Web.DOM.Node as Node

foreign import nodeHeightImpl :: EffectFn1 Node Int

foreign import nodeHeight :: Node -> Int
nodeHeight :: Node -> Effect Int
nodeHeight = runEffectFn1 nodeHeightImpl

class IsParentNode p where
toParentNode :: p -> ParentNode
@@ -29,12 +46,29 @@ class IsParentNode p where
class IsEventTarget e where
toEventTarget :: e -> EventTarget

class IsHTMLElement e where
toHtmlElement :: e -> HTMLElement

instance nodeToHtmlElement :: IsHTMLElement Node where
toHtmlElement = unsafeCoerce

instance htmlDocToParentNode :: IsParentNode HTMLDocument where
toParentNode = HTMLDocument.toParentNode

instance nodeToEventTarget :: IsEventTarget Node where
toEventTarget = Node.toEventTarget

instance windowToEventTarget :: IsEventTarget Window where
toEventTarget = Window.toEventTarget

type ElementsEnv =
{ key :: String
, parentNode :: ParentNode
}

getAllElements
:: forall m. Bind m
=> MonadAsk { key :: String, parentNode :: ParentNode } m
=> MonadAsk ElementsEnv m
=> MonadEffect m
=> m (Array Node)
getAllElements = do
@@ -43,7 +77,7 @@ getAllElements = do

parentNode :: Effect ParentNode
parentNode =
pure <<< toParentNode =<< document =<< window
pure <<< toParentNode =<< Window.document =<< window

listener
:: forall target. IsEventTarget target
@@ -54,16 +88,26 @@ listener
listener f evtType e =
flip (flip (addEventListener evtType) false) (toEventTarget e) =<< eventListener f

checkSlides :: Window -> Node -> Effect Unit
checkSlides window node = do
nHeight <- pure $ nodeHeight node
scroll <- scrollY window
inHeight <- innerHeight window
void $ pure $ (scroll + inHeight) - nodeHeight node / 2
checkSlides :: Window -> Array Node -> Effect Unit
checkSlides w nodes =
foreachE nodes $ \node -> do
nHeight <- nodeHeight node
scroll <- Window.scrollY w
inHeight <- Window.innerHeight w
slideIntAt <- pure $ (scroll + inHeight) - nHeight / 2
sliderOffset <- offsetTop (toHtmlElement node)
imageBottom <- pure $ sliderOffset + (toNumber nHeight)
isHalfShown <- pure $ toNumber slideIntAt > sliderOffset
isNotScrolledPast <- pure $ (toNumber scroll) < imageBottom
sliderImageClassList <- classList (toHtmlElement node)
if isHalfShown && isNotScrolledPast
then add sliderImageClassList "active"
else remove sliderImageClassList "acitive"

main :: Effect Unit
main = do
w <- window
pNode <- parentNode
nodes <- runReaderT getAllElements { key: ".slide-in", parentNode: pNode }
foreachE nodes (checkSlides w)
listener (const $ checkSlides w nodes) (EventType "scroll") w


+ 2629
- 198
src/13SlideInOnScroll/app.js
ファイル差分が大きすぎるため省略します
ファイルの表示


読み込み中…
キャンセル
保存