vue-size-provider

Declarative element size observer and provider
1,935 55
Install
npm install vue-size-provider
Latest Version:0.2.1
Vue:2
License:MIT
Last Updated:Dec 29, 2022
Links: GitHub  ·  npm
Maintainer: ktsn

vue-size-provider

Declarative element size observer and provider.

Motivation

Sometimes you may want to animate an element height when its content is changed. In that case, you need to directly read height value from DOM because Virtual DOM cannot acquire element size. Since it is low-level manipulation, the code may be more messy.

vue-size-provider solves this problem by hiding low-level code with abstract helper components - <SizeProvider> and <SizeObserver>. The following gif is an example to show how vue-size-provider works:

Simple demo of vue-size-provider

Install

Install it via npm:

$ npm install vue-size-provider

Then, notify Vue to use it:

import Vue from 'vue'
import VueSizeProvider from 'vue-size-provider'

Vue.use(VueSizeProvider)

Or you can directly use the components:

<script>
import { SizeProvider, SizeObserver } from 'vue-size-provider'

export default {
  components: {
    SizeProvider,
    SizeObserver
  }
}
</script>

Usage

First, wrap elements that you would like to observe their size by <SizeObserver>.

<template>
  <!-- observe content size -->
  <SizeObserver>

    <!-- arbitrary contents that you want to observe their size -->

  </SizeObserver>
</template>

<script>
import { SizeProvider, SizeObserver } from 'vue-size-provider'

export default {
  components: {
    SizeProvider,
    SizeObserver
  }
}
</script>

Then, wrap them by <SizeProvider> and any element that you want to animate its size when the contents size is changed.

<template>
  <!-- provide observed content size via scoped slot -->
  <SizeProvider>
    <div class="wrapper" slot-scope="{ width, height }" :style="{ height: height + 'px' }">

      <!-- observe content size -->
      <SizeObserver>

        <!-- arbitrary contents that you want to observe their size -->

      </SizeObserver>

    </div>
  </SizeProvider>
</template>

<script>
import { SizeProvider, SizeObserver } from 'vue-size-provider'

export default {
  components: {
    SizeProvider,
    SizeObserver
  }
}
</script>

Finally, you need to write some animation code. In this example, we simply use CSS transition:

<template>
  <!-- provide observed content size via scoped slot -->
  <SizeProvider>
    <div class="wrapper" slot-scope="{ width, height }" :style="{ height: height + 'px' }">

      <!-- observe content size -->
      <SizeObserver>

        <!-- arbitrary contents that you want to observe their size -->

      </SizeObserver>

    </div>
  </SizeProvider>
</template>

<script>
import { SizeProvider, SizeObserver } from 'vue-size-provider'

export default {
  components: {
    SizeProvider,
    SizeObserver
  }
}
</script>

<style scoped>
.wrapper {
  /* animate content height smoothly */
  transition: height 300ms ease-out;
}
</style>

License

MIT

Related Packages

vue-resizables

The resize utilities of Vue.

14,264 14
vue-use-scroll-size-observer

Vue3 composable that provides a simple and efficient way to observe changes to e...

855 0
vue-resizable

Vue2 component that allows to resize and drag elements

2,442,850 227
vue-resize-sensor

detect container resizing

1,419,113 74
vue3-resize-sensor

detect container resizing

40,176

Version History

Version Released Vue License
0.2.1 ^2.5.16 MIT
0.2.0 ^2.5.16 MIT
0.1.0 ^2.5.16 MIT