在Elm中添加元素时如何使用CSS过渡?

约翰·阿尔克斯托尔

一个简单的场景是我有一个按钮,可以从API提取一些数据并将数据添加到列表中。

我想为新添加的项目应用opacity属性的CSS过渡,以便它随着添加到列表中而逐渐消失。

通常,这是通过使用带有opacity: 0;transition规则的默认CSS类来完成的然后,在添加元素之后,将另一个CSS类应用到该元素上,opacity: 1;并获得淡入效果。

您如何与榆树做到这一点?

这是将列表项立即添加到视图的方式,

ul [ class "list" ] (List.map (\item -> li [] [ text item ]) model.items)

马丁·贾尼切克(Martin Janiczek)

阿米尔所说的确实是您唯一需要添加的内容。榆木会很好地工作。

如果您遇到任何问题,你可以尝试使用Html.Keyed包,它应该得到与订货摆脱臭虫/添加/删除-你只需要使用Html.Keyed.ul,它期望孩子是不是Html msg,但(String, Html msg)因此,通常您会为row元素提供某种ID。(编辑:例如,添加到列表的前面看起来像是使用此代码添加到列表的后面。有关更新的示例,请参见此处。)

因此,用一些Elm代码(Ellie link扩展Amir的答案

module Main exposing (..)

import Html as H exposing (Html)
import Html.Events as HE


type alias Model =
    { rows : List String }


type Msg
    = AddText


main : Program Never Model Msg
main =
    H.beginnerProgram
        { model = model
        , update = update
        , view = view
        }


model : Model
model =
    { rows = [] }


update : Msg -> Model -> Model
update msg model =
    case msg of
        AddText ->
            { model | rows = model.rows ++ [ "Another row" ] }


view : Model -> Html Msg
view model =
    H.div []
        [ H.button [ HE.onClick AddText ] [ H.text "add new row" ]
        , H.ul [] (List.map viewRow model.rows)
        ]


viewRow : String -> Html Msg
viewRow row =
    H.li [] [ H.text row ]

以及随附的HTML(请参阅CSS):

<html>
<head>
  <style>
    html {
      background: #F7F7F7;
      color: red;
    }
    li {
      animation: fadein 2s;
    }

    @keyframes fadein {
        from { opacity: 0; }
        to   { opacity: 1; }
    }
  </style>
</head>
<body>
  <script>
    var app = Elm.Main.fullscreen()
  </script>
</body>
</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章