<div id="app">
  <div class="panel">
    <b>Какой-то заголовок</b>
    <expansion :show='content'>
      <p>Какой-то текст Какой-то текст Какой-то текст Какой-то текст Какой-то текст Какой-то текст Какой-то текст Какой-то текст Какой-то текст Какой-то текст Какой-то текст Какой-то текст Какой-то текст Какой-то текст Какой-то текст </p>
    </expansion>
  </div>
  <br>
  <button @click='content = !content'>переключить</button>
</div>
.panel{
  max-width: 400px;
  box-shadow:14px 0px 17px 0px rgba(50, 50, 50, 0.75);
  padding: 20px;
}
.expansion {
  overflow: hidden;
  transition: height 1s;
}
Vue.component('expansion', {
  props: ['show'],
  computed: {
    style() {
      return `height: ${this.show ? this.$el.scrollHeight : 0}px`; 
    }
  },
  template: `
    <div class="expansion" :style="style">
      <slot/>
    </div>
  `
});

new Vue({
  el: '#app',
  data: {
    content: false
  }
})

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.min.js