Bonjour,
Dans mon passage de jQuery à javascript vanilla je rencontre plusieurs difficultés pour progresser. Bien que j'arrive à faire des trucs un peu complexes, comme cet accordéon, je trouve que ma manipulation du DOM reste aléatoire, avec beaucoup de tamponnements. Quelqu'un sur le forum (Ostara) m'avait beaucoup impressionné en réécrivant/refactorisant mon code de manière jusque-boutiste, mais c'était tellement extrême pour moi qu'aujourd'hui encore j'ai du mal à en tirer parti.
Je voudrais donc partir d'un exemple plus simple, un cas d'école pour moi, un exercice pour lequel j'ai trouvé une solution, mais que je cherche à améliorer.
Donc j'ai ceci :
Et je dois ajouter un un span wrappant le premier caractère pour pouvoir le styler comme une lettrine :
Je suis arrivé à ce résultat en produisant ceci :
Le CodePen
1. Premier problème : j'utilise des boucles for() dans mes codes, elles fonctionnent très bien mais j'aimerais pouvoir m'en départir pour alléger l'ensemble, comment procéder ? Comment notamment utiliser .map() dans ce cas de figure ?
2. Je trouve mon code lourd, en effet je crée un nouveau paragraphe, supprime l'ancien... auriez-vous une solution pour faire le tout en une seule passe ?
Toute suggestion d'amélioration sera la bienvenue.
Modifié par Olivier C (25 Nov 2020 - 17:54)
Dans mon passage de jQuery à javascript vanilla je rencontre plusieurs difficultés pour progresser. Bien que j'arrive à faire des trucs un peu complexes, comme cet accordéon, je trouve que ma manipulation du DOM reste aléatoire, avec beaucoup de tamponnements. Quelqu'un sur le forum (Ostara) m'avait beaucoup impressionné en réécrivant/refactorisant mon code de manière jusque-boutiste, mais c'était tellement extrême pour moi qu'aujourd'hui encore j'ai du mal à en tirer parti.
Je voudrais donc partir d'un exemple plus simple, un cas d'école pour moi, un exercice pour lequel j'ai trouvé une solution, mais que je cherche à améliorer.
Donc j'ai ceci :
<div class="add-dropcap">
<p>Lorem ipsum dolor sit amet, consetetur <ins>sadipscing elitr</ins> ut labore et dolore magna aliquyam erat, sed diam voluptua.</p>
</div>
Et je dois ajouter un un span wrappant le premier caractère pour pouvoir le styler comme une lettrine :
<div class="add-dropcap">
<p><span>L</span class="dropcap">orem ipsum dolor sit amet, consetetur <ins>sadipscing elitr</ins> ut labore et dolore magn"eea aliquyam erat, sed diam voluptua.</p>
</div>
Je suis arrivé à ce résultat en produisant ceci :
// @note Les propriétés applicables au sélecteur ::first-letter varient d'un navigateur à l'autre ; la solution retenue est un wrapper en javascript 'span.dropcap' sur la première lettre.
const addDropCap = (() => {
const paragraphs = document.querySelectorAll('.add-dropcap p:first-child')
for (const paragraph of paragraphs) {
let string = paragraph.innerHTML.substring(1)
let dropcap = paragraph.textContent.substring(0, 1)
dropcap = `<span class="dropcap">${dropcap}</span>`
const content = `<p>${dropcap}${string}</p>`
paragraph.insertAdjacentHTML('beforeBegin', content)
paragraph.remove()
}
})()
Le CodePen
1. Premier problème : j'utilise des boucles for() dans mes codes, elles fonctionnent très bien mais j'aimerais pouvoir m'en départir pour alléger l'ensemble, comment procéder ? Comment notamment utiliser .map() dans ce cas de figure ?
2. Je trouve mon code lourd, en effet je crée un nouveau paragraphe, supprime l'ancien... auriez-vous une solution pour faire le tout en une seule passe ?
Toute suggestion d'amélioration sera la bienvenue.
Modifié par Olivier C (25 Nov 2020 - 17:54)