vue-cool-lightbox
Version:
A pretty Vue.js component to display an image gallery lightbox inspired by fancybox
68 lines (57 loc) • 1.74 kB
JavaScript
export default {
inserted: el => {
// getYoutube ID
function isYoutubeVideo(url) {
// youtube data
const youtubeRegex = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/;
const ytId = (url.match(youtubeRegex)) ? RegExp.$1 : false;
if(ytId) {
return true;
}
return false;
}
function autoplayVideo() {
const tagName = el.tagName;
const autoplay = el.dataset.autoplay;
if(autoplay) {
if(tagName === 'VIDEO') {
el.muted = true;
el.autoplay = true;
return;
}
if(tagName === 'IFRAME') {
var url = new URL(el.src);
let muted = 'muted';
if(isYoutubeVideo(el.src)) {
muted = 'mute';
}
// append autoplay
url.searchParams.append(muted, 1);
url.searchParams.append('autoplay', 1);
el.src = url.href;
}
}
}
function handleIntersect(entries, observer) {
entries.forEach(entry => {
if (entry.isIntersecting) {
autoplayVideo();
observer.unobserve(el);
}
});
}
function createObserver() {
const options = {
root: null,
threshold: "0"
};
const observer = new IntersectionObserver(handleIntersect, options);
observer.observe(el);
}
if (window["IntersectionObserver"]) {
createObserver();
} else {
loadImage();
}
}
};