Buefy — Icons and Images

Image for post
Image for post
Photo by Brian Kyed on Unsplash

Buefy is a UI framework that’s based on Bulma.

In this article, we’ll look at how to use Buefy in our Vue app.

Icons

We can add icons with the b-icon component.

To do that, we add our icon CSS:

<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN"
crossorigin="anonymous"
/>

into our head tag of the public/index.html file.

Then in our component, we write:

<template>
<div id="app">
<b-icon icon="address-book" pack="fa" size="is-small"></b-icon>
</div>
</template>
<script>
export default {
name: "App"
};
</script>

pack sets the icon pack to use.

'fa' sets it to Font Awesome.

icon is the icon name that we use.

size sets the size.

We can add the type ptop to set the style:

<template>
<div id="app">
<b-icon type="is-success" icon="address-book" pack="fa" size="is-small"></b-icon>
</div>
</template>
<script>
export default {
name: "App"
};
</script>

We can also write it as an object:

<template>
<div id="app">
<b-icon :type="{ 'is-success': true }" icon="address-book" pack="fa" size="is-small"></b-icon>
</div>
</template>
<script>
export default {
name: "App"
};
</script>

This lets us set the style conditionally.

Image

Buefy comes with the b-image component to let us add images.

For example, we can write:

<template>
<div id="app">
<b-image src="https://picsum.photos/600/400" alt="image" ratio="6by4" rounded></b-image>
</div>
</template>
<script>
export default {
name: "App"
};
</script>

alt sets the text description for the image.

src has the URL of the image.

rounded makes the image rounded.

ratio is the aspect ratio.

We can also add WebP images with b-image :

<template>
<div id="app">
<b-image
src="https://picsum.photos/id/237/800/450.webp"
webp-fallback="https://picsum.photos/id/1025/800/450.jpg"
alt="image"
ratio="6by4"
rounded
></b-image>
</div>
</template>
<script>
export default {
name: "App"
};
</script>

webp-fallback has the URL for the fallback image in case WebP images aren’t supported in your browser.

We can add srcset props to show different images when the screen is different sizes:

<template>
<div id="app">
<b-image
src="https://picsum.photos/id/1074/1600/800"
:srcset-sizes="[400, 800, 1600]"
:srcset-formatter="this.formatSrcset"
alt="image"
ratio="6by4"
></b-image>
</div>
</template>
<script>
export default {
name: "App",
methods: {
formatSrcset(src, size) {
return `https://picsum.photos/id/1000/${size}/${size / 2}`;
}
}
};
</script>

Also, we can listen to the load event and run an event handler when it loads:

<template>
<div id="app">
<b-image src="https://picsum.photos/id/1074/1600/800" alt="image" ratio="6by4" @load="onLoad"></b-image>
</div>
</template>
<script>
export default {
name: "App",
methods: {
onLoad(event, src) {
console.log(src);
}
}
};
</script>

onLoad is run when the load event is emitted.

We can hamdle errors by listening to the error event and add a fallback image:

<template>
<div id="app">
<b-image
src="https://picsum.photos/id/error/600/400"
src-fallback="https://picsum.photos/id/237/600/400"
ratio="6by4"
@error="onError"
></b-image>
</div>
</template>
<script>
export default {
name: "App",
methods: {
onError(event, src) {
console.log(`${src} fails to load`);
}
}
};
</script>

The onError method is run when the image set in the src attribute fails to load.

Conclusion

We can display icons and images easily with Buefy.

Written by

Web developer. Subscribe to my email list now at http://jauyeung.net/subscribe/. Email me at hohanga@gmail.com

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store