Как повторить сокращение текста из дефолтного файлового инпута, на чистом js?

В общем есть потребность сокращать текст так как это делает дефолтный input с типом file если в него положить файл с длинным названием. Только это нужно делать динамически и не с файлом а с любим html элементов который содержит текст, будь то p, h1, span, div и тому подобные.

Все до чего я дошел это вот такой метод. Но он не оптимальный так как остается отступ с правой стороны и текст не занимает все 100% длины родителя.

Пример сокращение из input и мой результат:

Пример сокращение из input и мой результат

function truncateMiddleWithEllipsis() {
  const allTruncates = document.getElementsByClassName("truncateMiddle");
  [...allTruncates].forEach((element) => {
    const dadaSetText = element.dataset.text || element.innerText;
    const parentElementWidth = element.parentElement.clientWidth;

    const fontSize = window
      .getComputedStyle(element)
      .getPropertyValue("font-size")
      .replace("px", "");

    const textLength = dadaSetText.length;

    const maxSymbol = Math.round((parentElementWidth * 2) / Number(fontSize));
    const half = Math.round(maxSymbol / 2);
    const startMax = half - 5 === 0 ? half : half - 5;
    const endMax = half === startMax ? half - 5 : half + 5;
    const startEnd = textLength - endMax;

    const insertTextStart = dadaSetText.substring(0, startMax);
    const insertTextEnd = dadaSetText.substring(startEnd, textLength - 1);
    const insertText = `${insertTextStart} ... ${insertTextEnd}`.replaceAll(
      /\s+/g,
      " "
    );

    element.innerText = insertText;
  });
}

truncateMiddleWithEllipsis();

window.addEventListener("resize", () => truncateMiddleWithEllipsis());
body {
  font-family: sans-serif;
  /* font-size: 50px; */
}
<!DOCTYPE html>
<html>
  <head>
    <title>JavaScript Sandbox</title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <div id="app">
      <div
        class="truncateMiddle"
        data-text="Lorem ipsum, dolor sit amet consectetur adipisicing elit. Vero voluptas
      quo similique nostrum quisquam itaque obcaecati aut quos? Blanditiis aut
      quae repellendus itaque optio! Doloribus et accusantium neque natus sit
      harum ea mollitia distinctio consequuntur, facilis molestiae, magnam
      maiores soluta commodi sed accusamus id ad molestias cum minus iure
      facere."
      ></div>

      <span
        class="truncateMiddle"
        data-text="Lorem ipsum, dolor sit amet consectetur adipisicing elit. Vero voluptas
      quo similique nostrum quisquam itaque obcaecati aut quos? Blanditiis aut
      quae repellendus itaque optio! Doloribus et accusantium neque natus sit
      harum ea mollitia distinctio consequuntur, facilis molestiae, magnam
      maiores soluta commodi sed accusamus id ad molestias cum minus iure
      facere."
      >
      </span>
      <p
        class="truncateMiddle"
        data-text="Lorem ipsum, dolor sit amet consectetur adipisicing elit. Vero voluptas
      quo similique nostrum quisquam itaque obcaecati aut quos? Blanditiis aut
      quae repellendus itaque optio! Doloribus et accusantium neque natus sit
      harum ea mollitia distinctio consequuntur, facilis molestiae, magnam
      maiores soluta commodi sed accusamus id ad molestias cum minus iure
      facere."
      ></p>
      <h1
        class="truncateMiddle"
        data-text="Lorem ipsum, dolor sit amet consectetur adipisicing elit. Vero voluptas
      quo similique nostrum quisquam itaque obcaecati aut quos? Blanditiis aut
      quae repellendus itaque optio! Doloribus et accusantium neque natus sit
      harum ea mollitia distinctio consequuntur, facilis molestiae, magnam
      maiores soluta commodi sed accusamus id ad molestias cum minus iure
      facere."
      ></h1>
    </div>

    <script src="./index.mjs" type="module"></script>
  </body>
</html>


Ответы (0 шт):