0

Получение высоты элемента в Vue.js

8

Проблема с получением высоты элемента в JavaScript

Я пытаюсь получить высоту одного блока (div), чтобы установить одинаковую высоту для другого блока. Я использовал метод clientHeight, но он возвращает неправильное значение (меньшую высоту). Похоже, что он возвращает высоту до полной загрузки всех элементов.

После некоторых исследований я попробовал использовать window.onload(), чтобы задержать выполнение до полной загрузки, но это также не сработало. У кого-то есть идеи, как решить эту проблему?

Вот пример кода:

mounted () {
  this.matchHeight()
},
matchHeight () {
  let height = document.getElementById('info-box').clientHeight
}

И разметка HTML:

<div class="columns">
  <div class="left-column" id="context">
    <p>Некоторый текст</p>
  </div>
  <div class="right-column" id="info-box">
    <img />
    <ul>
      какой-то список
    </ul>
  </div>
</div>

Благодарю за помощь!

3 ответ(ов)

0

Чтобы добиться равной высоты колонок, я бы использовал Flexbox. Это позволяет вам просто и эффективно создавать адаптивные макеты. Вот пример кода, который вы можете использовать:

CSS:

.container {
    display: flex; /* Используем flexbox */
}
.column {
    border: 1px solid; /* Граница для визуализации */
    padding: 20px; /* Отступы внутри колонок */
    width: 150px; /* Ширина колонок */
}

HTML:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
    <div class="container">
        <div class="column">
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer ac dui sed erat venenatis fermentum. Nulla tempus, magna
            sit amet ornare fringilla, ligula quam faucibus urna.
        </div>
        <div class="column">
            Lorem ipsum dolor sit amet, consectetur adipiscing elit.
        </div>
    </div>
</body>
</html>

В этом примере .container устанавливается как flex-контейнер, что позволяет колонкам внутри него (элементы с классом .column) автоматически иметь равную высоту. Это особенно полезно, когда контент в колонках разной высоты — благодаря Flexbox они будут выровнены по высоте.

0

С учетом вашего вопроса, у меня также была проблема с доступом к $el (он возвращал undefined). При использовании Vue и TypeScript следующее решение сработало:

console.log('scriptPanel: mounted: sizes: ', (this.$refs.scriptSheet! as any).$el.clientHeight);

Здесь я использую оператор утверждения ненулевого значения (!), чтобы указать TypeScript, что this.$refs.scriptSheet определен. Это позволяет избежать ошибок компиляции, связанных с неопределенными значениями.

0

В вашем случае, чтобы получить значение clientHeight, вы можете использовать следующий код:

const height = this.$refs.infoBox.$el.nextElementSibling.clientHeight;

Здесь nextElementSibling позволит вам обратиться к следующему элементу в DOM после элемента, на который ссылается infoBox. Значение clientHeight вернет высоту этого элемента, включая отступы, но не включая границы и горизонтальные полосы прокрутки.

Если у вас возникают трудности с получением данного значения, убедитесь, что элемент, к которому вы обращаетесь, действительно существует и доступен на момент выполнения кода (например, убедитесь, что DOM уже загружен).

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь