vuetify eingebunden + erster Versuch Combobox
This commit is contained in:
+179
@@ -0,0 +1,179 @@
|
||||
import '../../../src/stylus/components/_images.styl';
|
||||
// Components
|
||||
import VResponsive from '../VResponsive';
|
||||
// Utils
|
||||
import { consoleError, consoleWarn } from '../../util/console';
|
||||
/* @vue/component */
|
||||
export default VResponsive.extend({
|
||||
name: 'v-img',
|
||||
props: {
|
||||
alt: String,
|
||||
contain: Boolean,
|
||||
src: {
|
||||
type: [String, Object],
|
||||
default: ''
|
||||
},
|
||||
gradient: String,
|
||||
lazySrc: String,
|
||||
srcset: String,
|
||||
sizes: String,
|
||||
position: {
|
||||
type: String,
|
||||
default: 'center center'
|
||||
},
|
||||
transition: {
|
||||
type: [Boolean, String],
|
||||
default: 'fade-transition'
|
||||
}
|
||||
},
|
||||
data: function data() {
|
||||
return {
|
||||
currentSrc: '',
|
||||
image: null,
|
||||
isLoading: true,
|
||||
calculatedAspectRatio: undefined
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
computedAspectRatio: function computedAspectRatio() {
|
||||
return this.normalisedSrc.aspect;
|
||||
},
|
||||
normalisedSrc: function normalisedSrc() {
|
||||
return typeof this.src === 'string' ? {
|
||||
src: this.src,
|
||||
srcset: this.srcset,
|
||||
lazySrc: this.lazySrc,
|
||||
aspect: Number(this.aspectRatio || this.calculatedAspectRatio)
|
||||
} : {
|
||||
src: this.src.src,
|
||||
srcset: this.srcset || this.src.srcset,
|
||||
lazySrc: this.lazySrc || this.src.lazySrc,
|
||||
aspect: Number(this.aspectRatio || this.src.aspect || this.calculatedAspectRatio)
|
||||
};
|
||||
},
|
||||
__cachedImage: function __cachedImage() {
|
||||
if (!(this.normalisedSrc.src || this.normalisedSrc.lazySrc)) return [];
|
||||
var backgroundImage = [];
|
||||
var src = this.isLoading ? this.normalisedSrc.lazySrc : this.currentSrc;
|
||||
if (this.gradient) backgroundImage.push('linear-gradient(' + this.gradient + ')');
|
||||
if (src) backgroundImage.push('url("' + src + '")');
|
||||
var image = this.$createElement('div', {
|
||||
staticClass: 'v-image__image',
|
||||
class: {
|
||||
'v-image__image--preload': this.isLoading,
|
||||
'v-image__image--contain': this.contain,
|
||||
'v-image__image--cover': !this.contain
|
||||
},
|
||||
style: {
|
||||
backgroundImage: backgroundImage.join(', '),
|
||||
backgroundPosition: this.position
|
||||
},
|
||||
key: +this.isLoading
|
||||
});
|
||||
if (!this.transition) return image;
|
||||
return this.$createElement('transition', {
|
||||
attrs: {
|
||||
name: this.transition,
|
||||
mode: 'in-out'
|
||||
}
|
||||
}, [image]);
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
src: function src() {
|
||||
if (!this.isLoading) this.init();else this.loadImage();
|
||||
},
|
||||
|
||||
'$vuetify.breakpoint.width': 'getSrc'
|
||||
},
|
||||
mounted: function mounted() {
|
||||
this.init();
|
||||
},
|
||||
|
||||
methods: {
|
||||
init: function init() {
|
||||
if (this.normalisedSrc.lazySrc) {
|
||||
var lazyImg = new Image();
|
||||
lazyImg.src = this.normalisedSrc.lazySrc;
|
||||
this.pollForSize(lazyImg, null);
|
||||
}
|
||||
/* istanbul ignore else */
|
||||
if (this.normalisedSrc.src) this.loadImage();
|
||||
},
|
||||
onLoad: function onLoad() {
|
||||
this.getSrc();
|
||||
this.isLoading = false;
|
||||
this.$emit('load', this.src);
|
||||
},
|
||||
onError: function onError() {
|
||||
consoleError('Image load failed\n\n' + ('src: ' + this.normalisedSrc.src), this);
|
||||
this.$emit('error', this.src);
|
||||
},
|
||||
getSrc: function getSrc() {
|
||||
/* istanbul ignore else */
|
||||
if (this.image) this.currentSrc = this.image.currentSrc || this.image.src;
|
||||
},
|
||||
loadImage: function loadImage() {
|
||||
var _this = this;
|
||||
|
||||
var image = new Image();
|
||||
this.image = image;
|
||||
image.onload = function () {
|
||||
/* istanbul ignore if */
|
||||
if (image.decode) {
|
||||
image.decode().catch(function (err) {
|
||||
consoleWarn('Failed to decode image, trying to render anyway\n\n' + ('src: ' + _this.normalisedSrc.src) + (err.message ? '\nOriginal error: ' + err.message : ''), _this);
|
||||
}).then(_this.onLoad);
|
||||
} else {
|
||||
_this.onLoad();
|
||||
}
|
||||
};
|
||||
image.onerror = this.onError;
|
||||
image.src = this.normalisedSrc.src;
|
||||
this.sizes && (image.sizes = this.sizes);
|
||||
this.normalisedSrc.srcset && (image.srcset = this.normalisedSrc.srcset);
|
||||
this.aspectRatio || this.pollForSize(image);
|
||||
this.getSrc();
|
||||
},
|
||||
pollForSize: function pollForSize(img) {
|
||||
var _this2 = this;
|
||||
|
||||
var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100;
|
||||
|
||||
var poll = function poll() {
|
||||
var naturalHeight = img.naturalHeight,
|
||||
naturalWidth = img.naturalWidth;
|
||||
|
||||
if (naturalHeight || naturalWidth) {
|
||||
_this2.calculatedAspectRatio = naturalWidth / naturalHeight;
|
||||
} else {
|
||||
timeout != null && setTimeout(poll, timeout);
|
||||
}
|
||||
};
|
||||
poll();
|
||||
},
|
||||
__genPlaceholder: function __genPlaceholder() {
|
||||
if (this.$slots.placeholder) {
|
||||
var placeholder = this.isLoading ? [this.$createElement('div', {
|
||||
staticClass: 'v-image__placeholder'
|
||||
}, this.$slots.placeholder)] : [];
|
||||
if (!this.transition) return placeholder[0];
|
||||
return this.$createElement('transition', {
|
||||
attrs: { name: this.transition }
|
||||
}, placeholder);
|
||||
}
|
||||
}
|
||||
},
|
||||
render: function render(h) {
|
||||
var node = VResponsive.options.render.call(this, h);
|
||||
node.data.staticClass += ' v-image';
|
||||
node.data.attrs = {
|
||||
role: this.alt ? 'img' : undefined,
|
||||
'aria-label': this.alt
|
||||
};
|
||||
node.children = [this.__cachedSizer, this.__cachedImage, this.__genPlaceholder(), this.genContent()];
|
||||
return h(node.tag, node.data, node.children);
|
||||
}
|
||||
});
|
||||
//# sourceMappingURL=VImg.js.map
|
||||
+1
File diff suppressed because one or more lines are too long
+4
@@ -0,0 +1,4 @@
|
||||
import VImg from './VImg';
|
||||
export { VImg };
|
||||
export default VImg;
|
||||
//# sourceMappingURL=index.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../../src/components/VImg/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAP,MAAiB,QAAjB;AAEA,SAAS,IAAT;AACA,eAAe,IAAf","sourcesContent":["import VImg from './VImg'\n\nexport { VImg }\nexport default VImg\n"],"sourceRoot":""}
|
||||
Reference in New Issue
Block a user