以下のコードで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'は、スクロールがどのくらい下に(ピクセル単位で)表示されるかだけを示します。 **ボトム**の距離がわからなければ、ボトムにいることをどのように知っていますか? –