2016-12-16 6 views
1

엘름의 엘레멘트 맨 아래에 스크롤 바가 있는지 알 수있는 방법이 있습니까? 목록 항목을 추가 할 때 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'는 스크롤이 얼마나 멀리 떨어져 있는지 (픽셀 단위로) 알려줍니다. ** bottom **이 얼마나 멀리 있는지 모른 채, 당신이 바닥에 있다는 것을 어떻게 알 수 있습니까? –

답변

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 
관련 문제