• javascript的未知尺寸图片保持比例水平垂直居中函数


    JavaScript的图片在容器内水平垂直居中的函数,利用图片加载获取图片大小,使之在父节点内水平垂直居中

    展示方式有两种:

     1、当参数keepImageFull为true:保持图片比例,使图片可完整的水平居中显示在父节点内,未能填充的部分留白

     2、当参数keepImageFull为false: 保持图片比例,完全覆盖父节点,超出部分溢出

    container_width和container_height函数不是必须的,仅当无法自动获取到图片父节点的尺寸时传入

    容器内不想用此方法处理的函数的图片,可以在图片节点上加上data-skip-loader属性

    使用实例:

    <div id="container">
        <ul>
            <li><img src="1.png" alt=""></li>
            <li><img src="1.png" alt=""></li>
            <li><img src="1.png" alt=""></li>
            <li><img src="1.png" alt=""></li>
        </ul>
        <img src="" alt="" class="ignore-element" data-skip-loader="1">
    </div>
    <script>
        imageCenter(document.getElementById('container'), false, 300, 200);
    </script>

    具体看参数说明:

    /**
     * 设置元素样式
     * @param {Array|Element} element 要设置样式的dom元素
     * @param {Object}        styles  样式属性集合
     */
    function setStyle(element, styles) {
        var cssText = [];
        if (styles) {
            for (var prop in styles) {
                if (styles.hasOwnProperty(prop)) {
                    cssText.push([prop, styles[prop]].join(':'));
                }
            }
        }
    
        if (cssText.length) {
            element.style.cssText += ';' + cssText.join(';');
        }
    
        return element;
    }
    
    /**
     * 图片预加载
     * @param  {Element}  node         要加载的容器节点
     * @param  {Function} after_single 单词加载成功执行函数
     * @param  {Function} after_all    <可选> 全部成功执行函数
     * @param  {Object}   context      <可选> 函数运行域
     */
    function loadImage(node, after_single, after_all, context) {
        function load_check(loading) {
            if (loading["complete"]) {
                complete++;
                setStyle(loading.ele, {
                    'width': 'auto',
                    'max-width': 'none',
                    'max-height': 'none'
                });
                if (typeof after_single === 'function') {
                    after_single.call(context, loading.ele, loading.width || 1, loading.height || 1, loading.i);
                }
                if (complete == filter_images.length && typeof after_all === 'function') {
                    after_all.call(context, complete);
                }
                loading.ele = null;
                loading = null;
            } else {
                setTimeout(function(){
                    load_check(loading);
                }, 100);
            }
        }
        node = node || document;
    
        var images = node.getElementsByTagName("img");
        var complete = 0;
        // 过滤
        var filter_images = [];
        for (var j = 0; j < images.length; j++) {
            if (!images[j].hasAttribute('data-skip-loader')) {
                filter_images.push(images[j]);
            }
        }
    
        var i = 0;
        while(i < filter_images.length) {
            var image = filter_images[i];
            var loading = new Image();
            setStyle(image, {
                'width': '100%',
                'height': 'auto',
                'max-width': '100%',
                'max-height': '100%'
            });
            loading.src = image.src;
            loading.ele = image;
            loading.i = i;
            load_check(loading);
            loading = null;
            i++;
        }
    }
    
    /**
     * 图片水平垂直居中于容器中
     * @param  {Element} node              容器节点
     * @param  {Boolean} keepImageFull     保持图片全图可见,未能填充的部分留白 || 以长宽的最小值填满,未能显示的部分溢出影藏
     * @param  {Number}  container_width   <可选> 容器宽度
     * @param  {Number}  container_height  <可选> 容器高度
     */
    function imageCenter(node, keepImageFull, container_width, container_height) {
        loadImage(node, function(img, width, height, index) {
            var parent = img.parentNode;
            if (!container_width) {
                container_width = Math.max(1, parent.offsetWidth);
            }
            if (!container_height) {
                container_height = Math.max(1, parent.offsetHeight);
            }
            setStyle(parent, {
                'overflow': 'hidden'
            });
            var css = {
                'display': 'block',
                'border-width': 0
            };
            css['width'] = Math.max(1, Math.min(width, container_width));
            css['height'] = css["width"] * height / width;
    
            keepImageFull = keepImageFull ? 1 : -1;
    
            // 宽度修正
            if ((css['width'] - Math.min(width, container_width)) * keepImageFull > 0) {
                css['width'] = container_width;
                css['height'] = height * container_width / width;
            }
    
            // 高度修正
            if ((css['height'] - Math.min(height, container_height)) * keepImageFull > 0)  {
                css['width'] = width * container_height / height;
                css['height'] = container_height;
            }
    
    
            css['margin-left'] = (container_width - css['width']) / 2 + 'px';
            css['margin-top'] = (container_height - css['height']) / 2 + 'px';
            css['width'] += 'px';
            css['height'] += 'px';
    
            setStyle(img, css);
        });
    }
  • 相关阅读:
    mysql修改加密方式
    信息安全学习路线
    DNS域传送漏洞
    CSRF漏洞
    反序列化漏洞
    计算机通讯基础
    gorm gen使用
    golang makefile使用
    linux命令行录制
    go代码自动生成注释
  • 原文地址:https://www.cnblogs.com/feng524822/p/5085250.html
Copyright © 2020-2023  润新知