2017-04-13 3 views
1

ich mit Elm fange an, und wenn Sie Stil festlegen möchten, können Sie einfach einbetten auf Ihrer Komponente: Html.Attribute.style List (String, String)Wie kommt man Stil in Elm

Aber ich kann nicht einen Weg zu bekommen finden der Stil statt festgelegt. Was ich eigentlich brauche, ist das line-height (CSS-Attribut) eines bestimmten Html msg. Ich habe ein wenig über die Verwendung eines benutzerdefinierten Decoders gelesen (mit Json.Decode.at), aber ich habe es immer noch nicht verstanden.

+0

Könnten Sie in ein bisschen mehr Detail erklären, was Sie zu erreichen versuchen? Wozu brauchst du die Linienhöhe? –

+0

Ich versuche tatsächlich, eine flüssige Textarea zu implementieren (mit zunehmender Höhe der Zeilenzahl). Normalerweise machen wir dies, indem wir die Zeilenhöhe berechnen, da css dies standardmäßig nicht hat. https://github.com/ohanhi/autoexpand ist ein Beispiel, aber es hat hier nicht funktioniert, und ich mochte nicht, wie es funktioniert. Außerdem habe ich den Code nicht verstanden. –

+1

Zur Erinnerung, ich finde es komisch, dass CSS keine "line size" Maßeinheit hat. Es würde das Leben so viel einfacher machen, wenn wir 'div {height: 3lines}' schreiben könnten. Stattdessen erfinden sie immer mehr Maßeinheiten, die dem, was wir bereits haben, nichts Neues hinzufügen. –

Antwort

1

Mateus, Ich beginne gerade mit Elm, also nimm das für das, was es wert ist.

Wenn Sie ein Ereignis empfangen, können Sie das Ereignisziel abfragen, um Informationen darüber oder ein relatives Element zu erhalten. Offenbar fehlte ein Ereignis gibt es (derzeit) nicht eine Möglichkeit, „zu erreichen in“ der DOM bei Werten herausziehen nolens volens (siehe * 1 unten)

Ressourcen:

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

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

Zurück zu Ihrer Frage, stellt sich heraus, was als Stil-set [(key1, val1) ... (keyn, valn)] wird in {key1 gedreht: val1, ... keyn: valn }. (Ich finde dies durch Debugging Ulms transpiled Code ... dann Dokumentation siehe woanders darüber; gehen Sie Abbildung.)

Siehe unten, um Zeilenhöhe speziell zu erhalten. Ich denke, es könnte nützlicher sein, eine Liste aller Stile zu bekommen. Überarbeitete Probe folgt:

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) 
+0

Ich danke für deine Antwort. Ich weiß bereits, wie man diese Methode benutzt, aber hast du jemals versucht, "id" mit "style" zu ändern? Ich weiß nicht, wie ich es analysieren soll. –

+0

Meinst du Stil oder Klasse? Wenn letzteres, verwenden Sie die Eigenschaft (anstatt Attribut), hier 'className'. Ich habe die Antwort oben bearbeitet – pakx

+0

Ich meinte Stil. Wie bei Javascript, ['HTMLElement.style'] (https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style). –