/** * 单路画面适应盒 * @param {HTMLElement} el 视图元素 * @param {object} options 选项 * - width 显示宽度 * - height 显示高度 * - sourceWidth 源宽度 * - sourceHeight 源高度 */ class SingleChannelFitBox { constructor(el, options) { this.el = el; this.options = options; } /** * 处理宽高适应 * @param {number} containerWidth 容器宽度 * @param {number} containerHeight 容器高度 * @param {bool} inMerge 是否在合图中 */ process(containerWidth, containerHeight, inMergeFrame = false) { const { width, height, sourceWidth, sourceHeight } = this.options; const WHR = width / height; const containerWHR = containerWidth / containerHeight; let w = containerWidth, h = containerHeight; // 预设视图宽高比与容器相等 let scale = 1; // 视图->容器 缩放比 if (WHR < containerWHR) { // 适配高度 scale = containerHeight / height; w = width * scale; } else { // 适配宽度 scale = containerWidth / width; h = height * scale; } // 是否需要裁剪 let needCrop = false; if (width !== sourceWidth || height !== sourceHeight) { const sourceWHR = sourceWidth / sourceHeight; if (sourceWHR === WHR) { needCrop = inMergeFrame; } else { needCrop = true; } } // let needCrop = width !== sourceWidth || height != sourceHeight; let sw = w, sh = h; // canvas需要设置的尺寸 if (needCrop) { // 分图画面通过css clip自裁剪 sw = sourceWidth * scale; sh = sourceHeight * scale; if (inMergeFrame === false) { this._resizeSource(sw, sh); } } // 向下取整,避免出现多余的像素 w = Math.floor(w); h = Math.floor(h); this._resizeView(w, h); return { needCrop: needCrop, scale: scale, canvasWidth: sw, canvasHeight: sh, }; } _resizeSource(width, height) { const $c = $(this.el).find('canvas'); $c.width(width); $c.height(height); } _resizeView(width, height) { const $el = $(this.el); $el.width(width); $el.height(height); } }