Quasar is a popular Vue UI library for developing good looking Vue apps.
In this article, we’ll take a look at how to create Vue apps with the Quasar UI library.
Menu Target Element
We can change the menu’s target element with q-menu
‘s target
prop:
<!DOCTYPE html>
<html>
<head>
<link
href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
rel="stylesheet"
type="text/css"
/>
<link
href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
rel="stylesheet"
type="text/css"
/>
</head>
<body class="body--dark">
<script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
<div id="q-app">
<q-layout
view="lHh Lpr lFf"
container
style="height: 100vh;"
class="shadow-2 rounded-borders"
>
<div class="q-pa-md">
<div class="row justify-center">
<div class="row items-center q-gutter-x-sm">
<q-radio
v-model="targetEl"
:val="false"
label="false (no target)"
>
</q-radio>
<q-radio
v-model="targetEl"
:val="true"
label="true (original parent)"
>
</q-radio>
<q-radio
v-model="targetEl"
val="#target-img-1"
label="#target-img-1"
>
</q-radio>
</div>
</div>
<div class="row justify-center">
<q-img
src="https://cdn.quasar.dev/img/material.png"
id="target-img-1"
style="height: 100px;"
>
<div
class="absolute-bottom-right"
style="border-top-left-radius: 5px;"
>
#target-img-1
</div>
</q-img>
<q-img
src="https://cdn.quasar.dev/img/parallax2.jpg"
id="target-img-2"
style="height: 100px;"
>
<div
class="absolute-bottom-right"
style="border-top-left-radius: 5px;"
>
#target-img-2
</div>
</q-img>
<q-img
src="https://cdn.quasar.dev/img/blueish.jpg"
style="height: 100px;"
>
<div
class="absolute-bottom-right"
style="border-top-left-radius: 5px;"
>
Original parent
</div>
<q-menu touch-position :target="targetEl">
<q-list>
<q-item v-for="n in 5" :key="n" v-close-popup clickable>
<q-item-section>Label</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-img>
</div>
</div>
</q-layout>
</div>
<script>
new Vue({
el: "#q-app",
data: {
targetEl: "#target-img-1"
}
});
</script>
</body>
</html>
We set the targetEl
reactive property to the selector for the image we want to target.
Also, we can set it to false
to disable the menu for all elements.
Or we can set the target to true
to set the target element to the original one set in data
.
Resize Observer
We can watch the size of an element with the q-resize-observer
component.
For example, we can use it by writing:
<!DOCTYPE html>
<html>
<head>
<link
href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
rel="stylesheet"
type="text/css"
/>
<link
href="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.min.css"
rel="stylesheet"
type="text/css"
/>
</head>
<body class="body--dark">
<script src="https://cdn.jsdelivr.net/npm/vue@^2.0.0/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/quasar@1.12.13/dist/quasar.umd.min.js"></script>
<div id="q-app">
<q-layout
view="lHh Lpr lFf"
container
style="height: 100vh;"
class="shadow-2 rounded-borders"
>
<div class="q-pa-md">
<div
style="width: 80vw; height: 50vh;"
class="container bg-amber rounded-borders glossy"
>
<q-resize-observer @resize="onResize"></q-resize-observer>
</div>
<div class="q-gutter-sm">
Reported:
<q-badge>width: {{ report.width }}</q-badge>
<q-badge>height: {{ report.height }}</q-badge>
</div>
</div>
</q-layout>
</div>
<script>
new Vue({
el: "#q-app",
data: {
report: {}
},
methods: {
onResize(size) {
this.report = size;
}
}
});
</script>
</body>
</html>
We add the q-resize-observer
inside the element that we want to watch the size to watch its size when resizing.
We listen to the resize
event to get the size.
The size
parameter of the event handler has the width
and height
property to get the size.
Conclusion
We can set the target element for our menu and watch element size in our Vue app with Quasar.