web
mobile

Touch MDB Pro component

MDB Vue custom directive

This directive allows you to improve the user experience on touch screens by calling methods on the following custom events: pinch, swipe, doubletap, longtap and pan.

Live Preview

Basic usage

Step 1: Import the directive from 'mdbvue'


        <script>
          import { mdbTouch } from "mdbvue";
        </script>
      

Step 2: Add mdbTouch to the directives object


        <script>
          import { mdbTouch } from "mdbvue";
          export default {
            directives: {
              mdbTouch
            }
          };
        </script>
      

Step 3: Attach the directive, choose one of supported events to an element and pass a callback


        <template>
          <div v-mdb-touch:doubleTap="zoom" />
        </template>
      

        <script>
          import { mdbTouch } from "mdbvue";
          export default {
            directives: {
              mdbTouch
            },
            methods: {
              zoom() {
                //...
              }
            }
          };
        </script>
      

Step 4: For the swipe event you can additionally use modifiers (left, right, up, down)


        <template>
          <div v-mdb-touch:swipe.left="changeSlide" />
        </template>
      

        <script>
          import { mdbTouch } from "mdbvue";
          export default {
            directives: {
              mdbTouch
            },
            methods: {
              changeSlide() {
                //...
              }
            }
          };
        </script>
      

Long tap

The v-mdb-touch:longTap calls the chosen method when the touch event on the element lasts longer than 1 second.


        <template>
          <section>
            <mdb-view
              src="https://mdbootstrap.com/img/Photos/Lightbox/Original/img%20(151).jpg"
              imgClass="img-fluid"
            >
              <transition
                enter-active-class="animated fadeIn"
                leave-active-class="animated fadeOut"
              >
                <mdb-mask
                  flex-center
                  v-if="mask"
                  overlay="stylish-strong"
                  text="Hold the button to remove the mask from the image"
                />
              </transition>
            </mdb-view>
            <mdb-btn
              v-mdb-touch:longTap="showImage"
              class="mx-0 mt-2"
              color="pink"
              >Tap & hold to show image</mdb-btn
            >
          </section>
        </template>
      

        <script>
          import { mdbMask, mdbView, mdbBtn, mdbTouch } from "mdbvue";

          export default {
            name: "TouchPage",
            components: {
              mdbMask,
              mdbView,
              mdbBtn
            },
            data() {
              return {
                mask: true
              };
            },
            methods: {
              showImage() {
                this.mask = false;
              }
            },
            directives: { mdbTouch }
          };
        </script>
      

Double tap

The callback on doubleTap event is called with an object containing origin field - the x and y cooridinates of the user's touch. In this example it allows us to transform origin via CSS


        <template>
          <div
            class="img-container"
            v-mdb-touch:doubleTap="resizeImg"
            ref="img"
          >
            <img
              src="https://mdbootstrap.com/img/Photos/Lightbox/Original/img%20(147).jpg"
              :style="imgStyle"
              class="w-100"
            />
          </div>
        </template>
      

        <script>
          import { mdbTouch } from "mdbvue";

          export default {
            data() {
              return {
                scale: 1,
                origin: null
              };
            },
            computed: {
              imgStyle() {
                return {
                  transform: `scale(${this.scale})`,
                  transformOrigin: this.origin
                    ? `${this.origin.x}px ${this.origin.y}px 0`
                    : "50% 50% 0"
                };
              }
            },
            methods: {
              resizeImg(e) {
                const rect = this.$refs.img.getBoundingClientRect();
                this.origin = {
                  x: e.origin.x - rect.x,
                  y: e.origin.y - rect.y
                };

                this.scale === 1 ? (this.scale = 2) : (this.scale = 1);
              }
            },
            directives: { mdbTouch }
          };
        </script>
      

        <style scoped>
          .img-container {
            width: 100%;
            max-height: 600px;
            overflow: hidden;
          }

          .img-container img {
            transition: transform 0.4s linear;
          }
        </style>
      

Pinch

The pinch event calls the given method with an object containing two keys - ratio and origin. The first one it the ratio of the distance between user's fingers on touchend to the same distance on touchstart - it's particularly useful for scaling images. The second one, similarly as in doubleTap event, is a pair of coordinates indicating the middle point between the user's fingers.


        <template>
          <div class="img-container" v-mdb-touch:pinch="zoom" ref="pinchImg">
            <img
              src="https://mdbootstrap.com/img/Photos/Lightbox/Original/img%20(152).jpg"
              class="img-fluid"
              :style="imgStyle2"
            />
          </div>
        </template>
      

        <script>
          import { mdbTouch } from "mdbvue";

          export default {
            data() {
              return {
                scale2: 1,
                origin2: null
              };
            },
            computed: {
              imgStyle2() {
                return {
                  transform: `scale(${this.scale2})`,
                  transformOrigin: this.origin2
                    ? `${this.origin2.x}px ${this.origin2.y}px 0`
                    : "50% 50% 0"
                };
              }
            },
            methods: {
              zoom(e) {
                const rect = this.$refs.pinchImg.getBoundingClientRect();
                this.origin2 = {
                  x: e.origin.x - rect.x,
                  y: e.origin.y - rect.y
                };
                this.scale2 * e.ratio > 1
                  ? (this.scale2 *= e.ratio)
                  : (this.scale2 = 1);
              }
            },
            directives: { mdbTouch }
          };
        </script>
      

        <style scoped>
          .img-container {
            width: 100%;
            max-height: 600px;
            overflow: hidden;
          }

          .img-container img {
            transition: transform 0.4s linear;
          }
        </style>
      

Swipe

The swipe event comes with several modifiers (left, right, up, down) - each of them will ensure that event will fire only on swipe in that particular direction. If the directive is used without any modifier, the callback method will be called each time the swiping occurs, and the string indicating the direction will be passed as an argument.


        <template>
          <div
            v-mdb-touch:swipe.left="swipeLeft"
            v-mdb-touch:swipe.right="swipeRight"
          >
            <mdb-view
              src="https://mdbootstrap.com/img/Photos/Lightbox/Original/img%20(148).jpg"
              imgClass="img-fluid"
            >
              <mdb-mask :overlay="overlays[activeOverlay]" />
            </mdb-view>
          </div>
        </template>
      

        <script>
          import { mdbMask, mdbView, mdbTouch } from "mdbvue";

          export default {
            components: {
              mdbMask,
              mdbView
            },
            data() {
              return {
                activeOverlay: 0,
                overlays: [
                  "indigo-light",
                  "indigo-strong",
                  "blue-light",
                  "pink-light"
                ]
              };
            },
            methods: {
              swipeRight() {
                if (this.activeOverlay === 0)
                  this.activeOverlay = this.overlays.length - 1;
                else this.activeOverlay--;
              },
              swipeLeft() {
                if (this.activeOverlay === this.overlays.length - 1)
                  this.activeOverlay = 0;
                this.activeOverlay++;
              }
            },
            directives: { mdbTouch }
          };
        </script>
      

Pan

The pan event is useful for dragging elements - every time the user moves a finger on the element to which the directive is attached to, the given method is being called with an argument consisting of two keys: x and y (the values corresponds to the horizontal and vertical translation).


        <template>
          <div v-mdb-touch:pan="pan" style="overflow: hidden; height: 400px;">
            <img
              :style="imgStyle3"
              src="https://mdbootstrap.com/img/Photos/Lightbox/Original/img%20(47).jpg"
            />
          </div>
        </template>
      

        <script>
          import { mdbTouch } from "mdbvue";

          export default {
            data() {
              return {
                translate: {
                  x: 0,
                  y: 0
                }
              };
            },
            computed: {
              imgStyle3() {
                return {
                  transform: `translate(${this.translate.x}px, ${this.translate.y}px)`
                };
              }
            },
            methods: {
              pan(e) {
                this.translate = {
                  x: this.translate.x + e.x,
                  y: this.translate.y + e.y
                };
              }
            },
            directives: { mdbTouch }
          };
        </script>
      

NEW We've added MORE STUFF to PRO & BUNDLE.

NEW PRICING

Getting started: download & setup


Download

All of the components and features are a part of the MDBootstrap package.

MDBootstrap (Material Design for Bootstrap) is an MIT Licensed framework - free for personal & commercial use.

It combines the esthetic of Material Design and the functionalities of the newest Bootstrap.

Click on the button below to visit the Getting Started Page, where you can download the latest MDBootstrap package.

MDBootstrap Download MDBootstrap About

MDB Pro

Using components and features labeled as MDB Pro component requires the MDB Pro package - a powerful UI Kit containing over 5,000 components, dozens of plugins and much more cool features.

Click the button below to learn more about the MDBootstrap Pro package.

MDBootstrap Pro

Tutorials

If you need any additional help, use our "5 min Quick Start" guide or start full Bootstrap tutorial.

5 min Quick Start Full Bootstrap Tutorial

Compilation & Customization

To reduce the weight of MDBootstrap package even more, you can compile your own, custom package containing only those components and features that you need.

If you need additional help with compiling your custom package, please use our Compilation & Customization tutorial.

Compilation & Customization tutorial

Map of dependencies of SCSS files in MDBootstrap:


    Legend:

    '-->' means 'required'

    All free and pro files require files from 'core' catalog

    'none' means 'this component doesn't require anything except core files'

    A file wrapped by `< >` means that this file make the base component prettier but it isn't necessary for the proper working

    All PRO components require 'pro/_variables.scss' file

    scss/
    |
    |-- core/
    |   |
    |   |-- bootstrap/
    |   |	|-- _functions.scss
    |   |	|-- _variables.scss
    |   |
    |   |-- _colors.scss
    |   |-- _global.scss
    |   |-- _helpers.scss
    |   |-- _masks.scss
    |   |-- _mixins.scss
    |   |-- _typography.scss
    |   |-- _variables.scss
    |   |-- _waves.scss
    |
    |-- free/
    |   |-- _animations-basic.scss --> none
    |   |-- _animations-extended.scss --> _animations-basic.scss
    |   |-- _buttons.scss --> none
    |   |-- _cards.scss --> none <_buttons.scss>
    |   |-- _dropdowns.scss --> none <_buttons.scss>
    |   |-- _input-group.scss --> _forms.scss, _buttons.scss, _dropdowns.scss
    |   |-- _navbars.scss --> none <_buttons.scss, _forms.scss, _input-group.scss>
    |   |-- _pagination.scss --> none
    |   |-- _badges.scss --> none
    |   |-- _modals.scss --> _buttons.scss, _forms.scss (PRO --> _tabs.scss)
    |   |-- _carousels.scss --> <_buttons.scss>
    |   |-- _forms.scss --> none
    |   |-- _msc.scss --> none <_buttons.scss, _forms.scss, _cards.scss>
    |   |-- _footers.scss none <_buttons.scss> (PRO: )
    |   |-- _list-group.scss --> none
    |   |-- _tables.scss --> none (PRO: _material-select.scss, pro/_forms.scss, _checkbox.scss, pro/_buttons.scss, pro/_cards.scss, _pagination.scss, pro/_msc.scss)
    |   |-- _depreciated.scss
    |
    |-- pro/
    |   |
    |   |-- picker/
    |   |   |-- _default.scss --> none
    |   |   |-- _default-time.scss --> _default.scss, free/_forms.scss, free/_buttons.scss, pro/_buttons.scss, free/_cards.scss
    |   |   |-- _default-date.scss --> _default.scss, free/_forms.scss
    |   |
    |   |-- sections/
    |   |   |-- _templates.scss --> _sidenav.scss
    |   |   |-- _social.scss --> free/_cards.scss, free/ _forms.scss, free/_buttons.scss, pro/_buttons.scss,
    |   |   |-- _team.scss --> free/_buttons.scss, pro/_buttons.scss, free/_cards.scss, pro/_cards.scss
    |   |   |-- _testimonials.scss --> free/_carousels.scss, pro/_carousels.scss, free/_buttons.scss, pro/_buttons.scss
    |   |   |-- _magazine.scss --> _badges.scss
    |   |   |-- _pricing.scss --> free/_buttons.scss, pro/_buttons.scss
    |   |   |-- _contacts.scss --> free/_forms.scss, pro/_forms.scss, free/_buttons.scss, pro/_buttons.scss
    |   |
    |   |-- _variables.scss
    |   |-- _buttons.scss --> free/_buttons.scss, pro/_msc.scss, _checkbox.scss, _radio.scss
    |   |-- _social-buttons.scss --> free/_buttons.scss, pro/_buttons.scss
    |   |-- _tabs.scss --> _cards.scss
    |   |-- _cards.scss --> free/_cards.scss <_buttons.scss, _social-buttons.scss>
    |   |-- _dropdowns.scss --> free/_dropdowns.scss, free/_buttons.scss
    |   |-- _navbars.scss --> free/_navbars.scss  (PRO: )
    |   |-- _scrollspy.scss --> none
    |   |-- _lightbox.scss --> none
    |   |-- _chips.scss --> none
    |   |-- _msc.scss --> none
    |   |-- _forms.scss --> none
    |   |-- _radio.scss --> none
    |   |-- _checkbox.scss --> none
    |   |-- _material-select.scss --> none
    |   |-- _switch.scss --> none
    |   |-- _file-input.scss --> free/_forms.scss, free/_buttons.scss
    |   |-- _range.scss --> none
    |   |-- _input-group.scss --> free/_input-group.scss and the same what free input group, _checkbox.scss, _radio.scss
    |   |-- _autocomplete.scss --> free/_forms.scss
    |   |-- _accordion.scss --> pro/_animations.scss, free/_cards.scss
    |   |-- _parallax.scss --> none
    |   |-- _sidenav.scss --> free/_forms.scss, pro/_animations.scss, sections/_templates.scss
    |   |-- _ecommerce.scss --> free/_cards.scss, pro/_cards.scss, free/_buttons.scss, pro/_buttons.scss, pro/_msc.scss
    |   |-- _carousels.scss --> free/_carousels.scss, free/_cards.scss, free/_buttons.scss 
    |   |-- _steppers.scss --> free/_buttons.scss
    |   |-- _blog.scss --> none
    |   |-- _toasts.scss --> free/_buttons.scss
    |   |-- _animations.scss --> none
    |   |-- _charts.scss --> none
    |   |-- _progress.scss --> none
    |   |-- _scrollbar.scss --> none
    |   |-- _skins.scss --> none
    |   |-- _depreciated.scss
    |
    `-- _custom-skin.scss
    `-- _custom-styles.scss
    `-- _custom-variables.scss
    `-- mdb.scss

  

Map of dependencies of JavaScript modules in MDBootstrap:


    Legend:

    '-->' means 'required'

    All files require jQuery and bootstrap.js

    js/
    ├── dist/
    │   ├── buttons.js
    │   ├── cards.js
    │   ├── character-counter.js
    │   ├── chips.js
    │   ├── collapsible.js --> vendor/velocity.js
    │   ├── dropdown.js --> Popper.js, jquery.easing.js
    │   ├── file-input.js
    │   ├── forms-free.js
    │   ├── material-select.js --> dropdown.js
    │   ├── mdb-autocomplete.js
    │   ├── preloading.js
    │   ├── range-input.js --> vendor/velocity.js
    │   ├── scrolling-navbar.js
    │   ├── sidenav.js --> vendor/velocity.js, vendor/hammer.js, vendor/jquery.hammer.js
    │   └── smooth-scroll.js
    ├── _intro-mdb-pro.js
    ├── modules.js
    ├── src/
    │   ├── buttons.js
    │   ├── cards.js
    │   ├── character-counter.js
    │   ├── chips.js
    │   ├── collapsible.js --> vendor/velocity.js
    │   ├── dropdown.js --> Popper.js, jquery.easing.js
    │   ├── file-input.js
    │   ├── forms-free.js
    │   ├── material-select.js --> dropdown.js
    │   ├── mdb-autocomplete.js
    │   ├── preloading.js
    │   ├── range-input.js --> vendor/velocity.js
    │   ├── scrolling-navbar.js
    │   ├── sidenav.js --> vendor/velocity.js, vendor/hammer.js, vendor/jquery.hammer.js
    │   └── smooth-scroll.js
    └── vendor/
        ├── addons/
        │   ├── datatables.js
        │   └── datatables.min.js
        ├── chart.js
        ├── enhanced-modals.js
        ├── hammer.js
        ├── jarallax.js
        ├── jarallax-video.js --> vendor/jarallax.js
        ├── jquery.easing.js
        ├── jquery.easypiechart.js
        ├── jquery.hammer.js --> vendor/hammer.js
        ├── jquery.sticky.js
        ├── lightbox.js
        ├── picker-date.js --> vendor/picker.js
        ├── picker.js
        ├── picker-time.js --> vendor/picker.js
        ├── scrollbar.js
        ├── scrolling-navbar.js
        ├── toastr.js
        ├── velocity.js
        ├── waves.js
        └── wow.js
  

Integrations with Angular, React or Vue

Apart from the standard Bootstrap integration (using jQuery), MDBootstrap also integrates with Angular, React and Vue.

About MDB Angular About MDB React About MDB Vue

Exclusive resources

MDBootstrap is a platform for web creators and MDB packages are only a part of it.

If you sign up you'll gain free access to other useful tools & resources including:

  • Community developed components & design projects
  • Technical support & community forum
  • CLI interface & free project hosting
  • Helpful articles & news agregators

...and much more!

Don't hesitate and sign up now!

Sign up now