@postya

Как сделать адаптивный текст в блоке фиксированной ширины?

Пишу приложение на Vue js
Имеется блок фиксированного размера, в нем есть текст.
Надо чтобы текст полностью влезал в блок. Текст может быть абсолютно разным(в дальнейшем он будет браться из базы данных)
Надо чтобы текст полностью занимал блок, то есть если текста не много, то размер шрифта большой, максимально досотупный так,чтобы занимать блок, и наоброт - если текста много, размер шрифта меняется так,чтобы текст полностью влезал в блок
Как это можно сделать?
Не обязательно сделать средствами Vue, можно и css

На данный момент у меня вот так:

5ee65cd753b70096286762.jpeg

<div class="question-card">
                <p class="question-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolorem doloremque incidunt itaque nostrum pariatur. Consectetur dolorum expedita impedit nam odio perferendis quae quaerat sit? Accusantium doloribus eum iste pariatur porro, tempora temporibus unde velit! Ad esse excepturi explicabo sed! Accusamus assumenda eos esse id illo minima officiis recusandae? Ab culpa debitis, deleniti doloremque doloribus dolorum error excepturi minima modi molestias nam nemo odio, perspiciatis provident quae quaerat quia, quis reiciendis saepe soluta. Cum deleniti doloribus error hic ipsa, modi molestiae mollitia, natus numquam obcaecati officia officiis quis quod repudiandae sequi vel vitae voluptatibus voluptatum. Blanditiis ex nisi sequi suscipit. A animi deleniti dignissimos eius enim error itaque necessitatibus nobis odit placeat, provident quae qui quisquam sunt vel veniam veritatis voluptates voluptatum. Accusantium consequatur, enim eos laborum perspiciatis quae voluptatem? Amet, architecto aspernatur autem beatae commodi cupiditate dicta distinctio exercitationem illum in inventore ipsum iure quasi quo reiciendis sequi tempora temporibus.
</p>
    </div>


.question-card {
        position: absolute;
        top: 25%;
        left: 30%;
        width: 40%;
        height: 50%;
        background-color: #fff;
        border: 15px solid #535353;
        justify-content: flex-start;
        padding: 1.5%;
        display: flex;
        align-items: center;       
    }

    .question-text {
        font-family: "HeronSansCond Medium", sans-serif;
        text-align: left;
        margin: 0;
        padding: 0;
        font-size: 1.5vw;
    }


Желаемый результат при небольшом тексте:

5ee65d7453b54110936803.jpeg

Желаемый результат при большом тексте:
5ee65dcda5444494395104.jpeg
  • Вопрос задан
  • 3088 просмотров
Решения вопроса 1
@postya Автор вопроса
я нашел решение задачи, применив подсказки qqFE и pupenne
Только адаптировал всё под Vue js:

Видео

html:
<div class="question-card" ref="card">
      <p
        class="question-text"
        ref="cardText"
        :style="{ fontSize: fontSize + 'rem' }"
      >
        {{ text }}
      </p>
    </div>


в разделе script:
<script>
export default {
  beforeCreate() {
    this.calculateFontSize();
  },
  mounted() {
    this.calculateFontSize();
  },
  data: () => ({
    textWidth: 0,
    cardWidth: 0,
    cardHeight: 0,
    textHeight: 0,
    fontSize: 6,
    text:
      "there is an ejecting or lifting force, acting on a body immersed in a liquid or gas, which is equal to the weight of the volume of the liquid or gas displaced by the part of the body immersed in the liquid or gas –Law of Archimedes\n",
    options: {
      minSize: 11,
      maxSize: 120
    }
  }),
  created() {
    window.addEventListener("resize", this.calculateFontSize);
  },
  destroyed() {
    window.removeEventListener("resize", this.calculateFontSize);
  },
  methods: {
    calculateFontSize() {
      //get font size of text and card height
      let fontSize = this.fontSize;
      let textHeight = this.$refs.cardText.clientHeight;
      let cardHeight = this.$refs.card.clientHeight - 50;

      //compare card height and text height
      if (textHeight >= cardHeight) {
        this.fontSize = fontSize - 0.1;
      } else if (textHeight < cardHeight) {
        this.fontSize = fontSize + 0.1;
      }

      //apply card width and height to category text when resizing window
      this.cardWidth = this.$refs.card.clientWidth;
      this.cardHeight = this.$refs.card.clientHeight;
      this.textWidth = this.$refs.cardText.clientWidth;
      this.textHeight = this.$refs.cardText.clientHeight;
    }
  }
};
</script>

Получаю текущий размер шрифта текста, высоту текста и высоту карточки:
let fontSize = this.fontSize;
      let textHeight = this.$refs.cardText.clientHeight;
      let cardHeight = this.$refs.card.clientHeight - 50;


при каждом резайзе окна браузера вызывается метод, который сравнивает, является ли высота текста больше, высоты карточки:
if (textHeight >= cardHeight) {
        this.fontSize = fontSize - 0.1;
      } else if (textHeight < cardHeight) {
        this.fontSize = fontSize + 0.1;
      }


Для временной отладки,чтобы посмотреть все размеры:
this.cardWidth = this.$refs.card.clientWidth;
      this.cardHeight = this.$refs.card.clientHeight;
      this.textWidth = this.$refs.cardText.clientWidth;
      this.textHeight = this.$refs.cardText.clientHeight;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
Dnebl
@Dnebl
Почему бы не использовать overflow: auto ?
Ответ написан
@Jlokys
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
div.example {
  background-color: lightgrey;
  padding: 20px;
}

@media screen and (min-width: 601px) {
  div.example {
    font-size: 80px;
  }
}

@media screen and (max-width: 600px) {
  div.example {
    font-size: 30px;
  }
}
</style>
</head>
<body>

<h2>ратата</h2>

<div class="example">ТEКСТ В БЛОКЕ</div>



</body>
</html>

Так вам нужно? Вот пример, у вас скорее всего текст не в блоке находится
Ответ написан
@pupenne
Делаешь цикл while( Если высота div меньше чем p), то уменьшаем font-size иначе выходим из цикла.

Идея сравнивать высоты блока родителя(div) и блока текста в нём(p). И если блок текста выше чем блок родителя, то необходимо уменьшить размер шрифта.
Ответ написан
@qqFE
Вроде front-end (но это не точно)
if (text.length() > 200) {
block.addClass("txtSmall");
}
if (text.length() > 50 && text.length() < 200 {
block.addClass("txtMid");
}
else {
block.addClass("txtBig");
}


.txtSmall { font-size: 1em }
.txtMid { font-size: 4.2em }
.txtBig { font-size: 6.5em }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час