2015-05-07 11 views
6

Ho il seguente codice HTML per rendere una casella di appuntamento con un'icona:Perché questi elementi HTML all'interno di .NET Razor hanno spazi aggiuntivi causati da nuove linee?

@if (Model.ShowThis){ 
    <input id="box1" type="hidden" value="@Model.SelectedDate.ToString("yyyy-MM-dd")" size="10" /> 
    <span id="icon1" class="picture"></span> 
} 

Icon shifted to the right

noterete che l'icona sia spostato a destra. Se modifico il codice per essere:

@if (Model.ShowThis){ 
    <input id="box1" type="hidden" value="@Model.SelectedDate.ToString("yyyy-MM-dd")" size="10" /><!-- 
    --><span id="icon1" class="picture"></span> 
} 

Icon in correct place

si noterà che non c'è uno spostamento a causa della rimozione di qualsiasi spazio bianco potenziale. Senza questi commenti, posso andare nel debugger e vedere spaziatura aggiuntiva tra gli elementi, che una volta rimosso, risolve anche il problema.

Perché le nuove righe standard all'interno di un file .cshtml (all'interno di un blocco Razor) causano spazi non interrotti tra questi elementi HTML? Non ho mai visto questo comportamento prima in altri file nello stesso tipo di scenario.

risposta

5

Stai vedendo lo spazio bianco nel documento HTML come questi sono entrambi elementi inline-block, immagino.

Pensa a loro non come a elementi di una pagina, quindi, ma a parole in una frase. Il browser fa così. Quindi, se ho messo:

<div> 
    Here 
    is 
    a 
    sentence. 
</div> 

in HTML, mi aspetto di vedere:

Ecco una frase.

nel mio documento. Questo perché HTML interpreta stringhe di spazio bianco aggregate (incluse interruzioni di riga e ritorni di registro) come cumulativamente uno spazio durante il rendering. Si aspetta che un tag spezzi forzatamente una linea, se questo è il desiderio. Dato white-space: normal (il valore predefinito CSS), se non c'è abbastanza spazio per il testo sulla linea, allora verrà completato. Ciò consente l'HTML ben formattato e leggibile (che è una parte, ma è importante capire perché funziona in questo modo).

È la stessa storia con gli elementi inline o inline-block. Sono gestiti in modo simile al testo nel layout e quindi rispettano lo spazio bianco circostante. Questo va bene, perché è il comportamento previsto per gli elementi in linea. Hai solo bisogno di fare alcune considerazioni speciali quando disponi il tuo documento usando quelle proprietà di visualizzazione.

O lasciare il vostro commento HTML nel codice, o utilizzare questo modello in CSS:

.container { 
    font-size: 0; 
} 
.container > * { 
    font-size: 1rem; 
} 

dove .container è qualunque involucro si dispone intorno agli elementi incriminati.

+0

Ottima spiegazione! Molte grazie! – Ryan

+0

Puoi spiegare la soluzione CSS che hai offerto? Ho provato questo e ha finito per spostare l'icona verso il basso, invece di tornare a sinistra come dovrebbe essere. Qual è l'idea dietro l'uso di font-size per realizzare questo? – Ryan

+0

'font-size' determinerà lo spazio bianco reso nel contenitore. Quando è '0', quello spazio bianco non verrà renderizzato, proprio come un personaggio non potrebbe eseguire il rendering con una regola' font-size: 0'. Probabilmente è il reset che è il colpevole. Cerca di determinare la dimensione originale del font, e invece di '1rem' (che in pratica lo sta resettando per documentare root' font-size'), impostalo su qualsiasi cosa fosse prima che la 'font-size: 0' fosse applicata al contenitore. –

1

Non è una cosa di Razor; anche l'HTML statico avrebbe lo stesso problema. Purtroppo, lo spazio bianco influirà sul layout, che si tratti di interruzioni di riga o spazi.

Problemi correlati