Ponovno ustvarjanje MDN-jevega učinka okrnjenega besedila PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Ponovno ustvarjanje učinka okrnjenega besedila MDN

Ni skrivnost, da MDN uvedel nov dizajn nazaj v marcu. Čudovito je! In v njem je nekaj sladkih draguljev CSS-y, ki jih je zabavno gledati. Eden od teh draguljev je, kako komponente kartice obravnavajo okrnjeno besedilo.

Ponovno ustvarjanje učinka okrnjenega besedila MDN

Precej kul, kajne? To bi rad nekoliko raztrgal, vendar me nekaj stvari resnično pritegne k temu pristopu:

  • To je primer namernega izrezovanja vsebine. To smo označili kot Izguba podatkov CSS na drugih mestih. In čeprav je izguba podatkov na splošno slaba stvar, mi je všeč, kako se tukaj uporablja, saj naj bi bili izvlečki dražljivi za celotno vsebino.
  • To je drugače kot prirezovanje besedila z text-overflow: ellipsis, tema, ki se je pojavila pred kratkim, ko je Eric Eggert deli njegove skrbi s tem. Glavni argument proti je, da ni mogoče obnoviti besedila, ki je odrezano pri prirezovanju - pomočna tehnika ga bo objavila, vendar ga videči uporabniki ne morejo obnoviti. Pristop MDN zagotavlja nekoliko več nadzora v tem oddelku, saj je prirezovanje le vizualno.

Torej, kako je MDN to naredil? Kar se tiče HTML-ja, tukaj ni nič preveč elegantnega, samo vsebnik z odstavkom.

<div class="card">
  <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore consectetur temporibus quae aliquam nobis nam accusantium, minima quam iste magnam autem neque laborum nulla esse cupiditate modi impedit sapiente vero?</p>
</div>

Lahko dodamo nekaj osnovnih slogov, da okrepimo stvari.

Spet nič preveč elegantnega. Naš cilj je izrezati vsebino po, recimo, tretji vrstici. Lahko nastavimo a max-height na odstavek in za to skrijete prelivanje:

.card p {
  max-height: calc(4rem * var(--base)); /* Set a cut-off point for the content */
  overflow: hidden; /* Cut off the content */
}

Vau vau, kaj je s tem calc() stvari? Upoštevajte, da sem nastavil a --base spremenljivka spredaj, ki se lahko uporablja kot skupni množitelj. Uporabljam ga za izračun font-size, line-height, padding za kartico, zdaj pa še max-height odstavka. Lažje delam s konstantnimi vrednostmi, zlasti če velikost, ki jo potrebujem, resnično temelji na takšnem merilu. Opazil sem, da MDN uporablja podobno --base-line-height spremenljivka, verjetno za isti namen.

Ali želite tretjo vrstico besedila zbledeti? To je klasika linear-gradient() na odstavku :after psevdoelement, ki je pripet v spodnji desni kot kartice. Torej, to lahko nastavimo:

.card p:after {
  content: ""; /* Needed to render the pseudo */
  background-image: linear-gradient(to right, transparent, var(--background) 80%);
  position: absolute;
  inset-inline-end: 0; /* Logical property equivalent to `right: 0` */
}

Upoštevajte, da kličem a --background spremenljivka, ki je nastavljena na isto vrednost barve ozadja, ki je uporabljena na .card sama. Tako se zdi, da besedilo zbledi v ozadju. In ugotovil sem, da moram spremeniti drugo barvno postajo v prelivu, ker besedilo ni popolnoma skrito, ko se preliv zlije do 100 %. našel sem 80% biti sladka točka za moje oči.

In ja, :after potrebuje a height in width. height je kje to --base spremenljivke se vrnejo v igro, ker želimo, da se merijo na odstavke line-height da bi prekrili besedilo z višino :after.

.card p:after {
  /* same as before */
  height: calc(1rem * var(--base) + 1px);
  width: 100%; /* relative to the .card container */
}

Zdelo se je, da je dodajanje ene dodatne slikovne pike višine pomagalo, vendar je MDN to uspelo brez tega, ko sem pokukal v DevTools. Potem spet ne uporabljam top (ali inset-block-start), da izravnate gradient v tej smeri. 🤷‍♂️

Zdaj, ko p:after je absolutno pozicioniran, moramo izrecno deklarirati relativno pozicioniranje v odstavku, da ga ohranimo :after v svojem toku. Sicer pa :after bi bil popolnoma iztrgan iz toka dokumentov in končal zunaj kartice. To postane celoten CSS za .card odstavek:

.card p {
  max-height: calc(4rem * var(--base)); /* Set a cut-off point for the content */
  overflow: hidden; /* Cut off the content */
  position: relative; /* needed for :after */
}

Končali smo, kajne? Ne! Zdi se, da prekleti gradient preprosto ni na pravem mestu.

Priznam, da sem ob tem prdnil in zagnal DevTools na MDN, da vidim, kaj za vraga zamujam. o ja, :after mora biti prikazan kot element bloka. Ko mu dodamo rdečo obrobo, je jasno kot beli dan.🤦‍♂️

.card p:after {
  content: "";
  background: linear-gradient(to right, transparent, var(--background) 80%);
  display: block;
  height: calc(1rem * var(--base) + 1px);
  inset-block-end: 0;
  position: absolute;
  width: 100%;
}

Zdaj vsi skupaj!

In ja, Izgleda zveni, kot da VoiceOver upošteva celotno besedilo. Vendar nisem preizkusil nobenega drugega bralnika zaslona.

Ponovno ustvarjanje MDN-jevega učinka okrnjenega besedila PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.
Ponovno ustvarjanje učinka okrnjenega besedila MDN

Opazil sem tudi, da izvedba MDN odstrani pointer-events iz p:after. Verjetno dobra obrambna taktika za preprečevanje čudnega vedenja pri izbiranju besedila. Dodal sem ga in izbiranje besedila se zdi nekoliko bolj gladko, vsaj v Safariju, Firefoxu in Chromu.

Časovni žig:

Več od Triki CSS