1
有什麼方法可以知道滾動條是否在Elm元素的底部?我使用Dom.Scroll.toBottom
在添加列表項時滾動到列表的底部。單獨使用時效果很好。但是,如果您手動向上滾動一下,我不想自動向下滾動到底部(直到您再次手動滾動到底部)。否則,您無法查看以前的列表項目。如何知道滾動條是否在元素的底部
有什麼方法可以知道滾動條是否在Elm元素的底部?我使用Dom.Scroll.toBottom
在添加列表項時滾動到列表的底部。單獨使用時效果很好。但是,如果您手動向上滾動一下,我不想自動向下滾動到底部(直到您再次手動滾動到底部)。否則,您無法查看以前的列表項目。如何知道滾動條是否在元素的底部
我能用以下代碼獲得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'只能告訴你滾動的距離(以像素爲單位)。不知道底部**有多遠,你怎麼知道你在底部? –