다음 코드로 clientHeight
, scrollHeight
및 scrollTop
속성을 얻을 수있었습니다. 스크롤이 요소의 맨 아래에 있는지 여부를 알아야합니다.
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
['Dom.Scroll.y'] (HTTP를 사용하여 허용하지 않는 문제가 있습니다 : 코드의 나머지 부분은 스크롤 하단에 이미있는 경우 자동 스크롤 만의 메커니즘을 구현 // package.elm-lang.org/packages/elm-lang/dom/1.1.1/Dom-Scroll#y)? – lonelyelk
@lonelyelk'Dom.Scroll.y'는 스크롤바가 요소의 맨 아래에 있는지를 알기에 충분하지 않습니다. 'y'는 스크롤이 얼마나 멀리 떨어져 있는지 (픽셀 단위로) 알려줍니다. ** bottom **이 얼마나 멀리 있는지 모른 채, 당신이 바닥에 있다는 것을 어떻게 알 수 있습니까? –