【问题标题】:How to get style in Elm如何在 Elm 中获得风格
【发布时间】:2017-09-09 22:29:11
【问题描述】:

我从 Elm 开始,当你想设置样式时,你可以简单地将它嵌入到你的组件中:Html.Attribute.style List (String, String)

但我找不到获取样式而不是设置的方法。实际上,我需要的是特定Html msgline-height(CSS 属性)。我阅读了一些关于使用自定义解码器(Json.Decode.at)的信息,但我仍然没有明白。

【问题讨论】:

  • 您能更详细地解释一下您要完成的工作吗?你需要 line-height 做什么?
  • 我实际上是在尝试实现一个流畅的文本区域(高度根据行数增加)。通常我们通过计算 line-height 来做到这一点,因为 css 默认没有这个。 github.com/ohanhi/autoexpand 是一个例子,但它在这里不起作用,我不喜欢它的工作方式。另外,我没看懂代码。
  • 作为记录,我认为 CSS 没有“行大小”度量单位很奇怪。如果我们可以写div {height: 3lines},生活会轻松很多。取而代之的是,他们发明了越来越多的测量单位,而这些单位对我们已有的东西没有任何新意。
  • 我认为他们应该有类似overflow: set-the-width-according-to-content-overflow的东西。

标签: css properties attributes elm


【解决方案1】:

Mateus,我刚开始使用榆树,所以值得一试。

当您收到一个事件时,您可以询问事件目标以获取有关它或相关元素的信息。显然,在没有事件的情况下,(目前)没有一种方法可以随意“进入”DOM(请参阅下面的 *1)

资源:

*1:https://medium.com/@debois/elm-the-dom-8c9883190d20

*2:https://robots.thoughtbot.com/building-custom-dom-event-handlers-in-elm

回到你的问题,原来设置的样式 [(key1, val1)...(keyn, valn)] 变成了 {key1:val1, ...keyn:valn}。 (我通过调试 elm 的转译代码找到了这一点……然后在其他地方查看有关它的文档;看图。)

请参阅下文以获取具体的行高。我想获取所有样式的列表可能会更有用。修改后的示例如下:

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (on)
import Json.Decode 


main =
  beginnerProgram { model = "", view = view, update = update }

type Msg = Attr StyleStruct

type alias StyleStruct =
  {lineHeight: String}


view model =
  div []
    [ button [ id "btn"
        , class "cls"
        , style [("color", "green"), ("line-height", "3em")]
        , myOnClick Attr ]
        [ text "Show line-height" ]
    , div [] [ text ("(" ++ model ++ ")")]
    ]

update msg model =
  case msg of
    Attr v1 ->
      toString v1

targetStyle =
  Json.Decode.map StyleStruct
    (Json.Decode.at ["target", "style"] styleStructDecoder)

styleStructDecoder =
  Json.Decode.at ["line-height"] Json.Decode.string


myOnClick : (StyleStruct -> msg) -> Html.Attribute msg
myOnClick tagger =
  on "click" (Json.Decode.map tagger targetStyle)

【讨论】:

  • 感谢您的回答。我已经知道如何使用这种方法,但是你有没有尝试过用“style”改变“id”?不知道怎么解析。
  • 你指的是风格还是阶级?如果是后者,使用属性(而不是属性),这里是className。我已经编辑了上面的回复
  • 我的意思是风格。比如,在 javascript 上,HTMLElement.style.
  • 啊,我明白了。我的错。以上修改。
  • 谢谢,这是我需要的。我在考虑如何解码元组列表,但似乎解码与使用默认 Html.Attribute.style 函数有点不同。
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 2016-08-08
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2015-01-12
相关资源
最近更新 更多