Domanart.pl

Tekst wieloliniowy

W ostatnim czasie dostałem ciekawy projekt do pocięcia. Pojawił się w nim dość często spotykany motyw z tekstem, który jest pisany w kilku liniach, gdzie każda z nich ma osobne tło.

Na rozwiązanie takiego wyzwania wymyśliłem kilka sposobów - żaden idealny, ot po prostu inne. Kilka z nich przedstawionych zostało na stronie https://css-tricks.com/multi-line-padded-text/. Większość opiera się o podobną technikę polegającą na wrzuceniu tekstu w dodatkowy element inline, który następnie stylujemy.


<h2 class="title">
    <span>Lorem ipsum dolor sit.</span>
</h2>

.title {
    font-size: 20px;
    line-height: 35px;
    color: #fff;
    font-family: sans-serif;
}

.title span {
    display: inline;
    background: #000;
    line-height: inherit;
    font-size: inherit;
    padding: 5px;
    box-shadow: 0.5em 0 0 #000, -0.5em 0 0 #000;
    box-decoration-break: clone;
}

Niestety nie jest to idealne rozwiązanie. Display inline nie pozwala nam w łatwy sposób dodawać odstępów między liniami. Idealnie było by, gdyby taki odstęp można było wyliczyć za pomocą jakiegoś wzoru typu calc(1.5em + 2px). Ale niestety nie można, bo w sumie nie do końca wiadomo ile line-height wynosi (1). Pozostaje więc ustawianie na oko - co nie zawsze jest najwygodniejsze - zwłaszcza gdy musisz kilka razy zmieniać wielkość tekstu, bo tego wymaga layout. W poniższym demo zobaczysz, że CSS Lock też nie rozwiązuje sytuacji.

Inny pomysł, na który wpadłem to wrzucenie każdego słowa w osobny span (za pomocą JS), a następnie za pomocą flexa wyrównywanie ich do lewej strony.

Wyświetlanie inline-block daje możliwość odsunięcia linii za pomocą marginesu (albo gap dla flexa). Z minusów mamy tutaj mniejszą kontrole nad lewą i prawą krawędzią linii, ponieważ do końca nie wiadomo który span jest pierwszym i ostatnim w linii.

https://codepen.io/kartofelek007/pen/NWpKdWj

Trzeci pomysł to podział tekstu na oddzielne linie, które obejmuje dodatkowymi elementami. Jego realizację możesz zobaczyć pod adresem: https://github.com/kartofelek007/multiline-text