UNPKG

vuikit

Version:

A responsive Vue UI library for web site interfaces based on UIkit

106 lines (101 loc) 2.73 kB
/** * Vuikit 0.8.10 * (c) 2018 Miljan Aleksic * @license MIT **/ /* Substantial part of the code is adapted from UIkit, Copyright (c) 2013-2018 YOOtheme GmbH, getuikit.com */ import { $$ } from './util/core'; import { on } from './util/event'; import { css } from './util/style'; import { attr } from './util/attr'; import { isVisible } from './util/filter'; import { isUndefined, isString, assign } from './util/lang'; var NAMESPACE = '__vkHeightMatch'; var index = { bind: function bind (el, binding, vnode) { el[NAMESPACE] = {}; }, inserted: function inserted (el, binding, vnode) { vnode.context.$nextTick(function () { return update(el, { binding: binding, vnode: vnode }); } ); el[NAMESPACE].unbind = on(window, 'resize', function () { return update(el, { binding: binding, vnode: vnode }); } ); }, componentUpdated: function componentUpdated (el, binding, vnode) { vnode.context.$nextTick(function () { return update(el, { binding: binding, vnode: vnode }); } ); }, unbind: function unbind (el) { if (!el[NAMESPACE]) { return } el[NAMESPACE].unbind(); delete el[NAMESPACE]; } } function update (el, ctx) { var opts = getOptions(ctx); var elements = $$(opts.target, el); css(elements, 'minHeight', ''); var rows = getRows(elements, opts.row); rows.forEach(function (els) { var ref = match(els); var height = ref.height; var elements = ref.elements; css(elements, 'minHeight', height); }); } function getOptions (ctx) { var ref = ctx.binding; var value = ref.value; if (isString(value)) { value = { target: value }; } return assign({ target: '> *', row: true }, value) } function getRows (elements, row) { if (!row) { return [ elements ] } var lastOffset = false; return elements.reduce(function (rows, el) { if (lastOffset !== el.offsetTop) { rows.push([el]); } else { rows[rows.length - 1].push(el); } lastOffset = el.offsetTop; return rows }, []) } function match (elements) { if (elements.length < 2) { return {} } var max = 0; var heights = []; elements.forEach(function (el) { var style; var hidden; if (!isVisible(el)) { style = attr(el, 'style'); hidden = attr(el, 'hidden'); attr(el, { style: ((style || '') + ";display:block !important;"), hidden: null }); } max = Math.max(max, el.offsetHeight); heights.push(el.offsetHeight); if (!isUndefined(style)) { attr(el, {style: style, hidden: hidden}); } }); elements = elements.filter(function (el, i) { return heights[i] < max; }); return { height: max, elements: elements } } export default index;