index.vue 929 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <template>
  2. <div ref="box" class="auto-height" :style="{height: height}">
  3. <slot/>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name: 'auto-height',
  9. props: {
  10. pre: {
  11. type: Number,
  12. default: .6
  13. },
  14. max: {
  15. type: Number,
  16. default: 400,
  17. },
  18. min: {
  19. type: Number,
  20. default: 200
  21. }
  22. },
  23. methods: {
  24. setSize() {
  25. const width = this.$refs.box.offsetWidth
  26. return Math.max(this.min, Math.min(Math.floor(width * this.pre), this.max)) + 'px'
  27. },
  28. resize() {
  29. window.requestAnimationFrame(() => {
  30. this.height = this.setSize()
  31. })
  32. },
  33. },
  34. mounted () {
  35. window.addEventListener('resize', this.resize, false)
  36. const event = new Event('resize')
  37. window.dispatchEvent(event)
  38. },
  39. destroyed() {
  40. window.removeEventListener('resize', this.resize, false)
  41. },
  42. data() {
  43. return {
  44. height: '400px',
  45. }
  46. }
  47. }
  48. </script>