2016-12-16 99 views
1

有什麼方法可以知道滾動條是否在Elm元素的底部?我使用Dom.Scroll.toBottom在添加列表項時滾動到列表的底部。單獨使用時效果很好。但是,如果您手動向上滾動一下,我不想自動向下滾動到底部(直到您再次手動滾動到底部)。否則,您無法查看以前的列表項目。如何知道滾動條是否在元素的底部

+0

是否有不允許使用['Dom.Scroll.y'(HTTP任何問題:// package.elm-lang.org/packages/elm-lang/dom/1.1.1/Dom-Scroll#y)? – lonelyelk

+0

@lonelyelk'Dom.Scroll.y'不足以知道滾動條是否在元素的底部。 'y'只能告訴你滾動的距離(以像素爲單位)。不知道底部**有多遠,你怎麼知道你在底部? –

回答

1

我能用以下代碼獲得clientHeight,scrollHeightscrollTop屬性。那些有必要知道滾動是否在元素的底部。代碼的其餘部分實現了自動滾動僅機制,如果滾動已經處於底部:

type alias Model = 
    { messages : List Message 
    , autoScrollMessages : Bool 
    } 

type Msg 
    = NoOp (Result Dom.Error()) 
    | ReceiveMessage ReceivedMessage 
    | ScrolledMessages ScrollEvent 

update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
     NoOp res -> 
      (model, Cmd.none) 
     ReceiveMessage message -> 
      ({ model | messages = model.messages ++ [ message ] } , if model.autoScrollMessages then Task.attempt NoOp (Scroll.toBottom "messages") else Cmd.none) 
     ScrolledMessages scrollEvent -> 
      ({ model | autoScrollMessages = scrollEvent.scrollPos == scrollEvent.scrollHeight - scrollEvent.visibleHeight }, Cmd.none) 

type alias ScrollEvent = 
    { scrollHeight : Int 
    , scrollPos : Int 
    , visibleHeight : Int 
    } 

onScroll : (ScrollEvent -> msg) -> Html.Attribute msg 
onScroll tagger = 
    Html.Events.on "scroll" (Decode.map tagger onScrollJsonParser) 

onScrollJsonParser : Decode.Decoder ScrollEvent 
onScrollJsonParser = 
    Decode.map3 ScrollEvent 
     (Decode.at ["target", "scrollHeight"] Decode.int) 
     (Decode.at ["target", "scrollTop"] Decode.int) 
     (Decode.at ["target", "clientHeight"] Decode.int) 

viewMessages : List Message -> Html Msg 
viewMessages messages = 
    ul 
     [ id "messages" 
     , onScroll ScrolledMessages 
     ] <| List.map viewMessage messages 
相關問題