How to detect DIV's dimension changed?

后端 未结 25 2904
抹茶落季
抹茶落季 2020-11-22 06:14

I\'ve the following sample html, there is a DIV which has 100% width. It contains some elements. While performing windows re-sizing, the inner elements may be re-positioned,

25条回答
  •  说谎
    说谎 (楼主)
    2020-11-22 06:44

    This is pretty much an exact copy of the top answer, but instead of a link, it's just the part of the code that matters, translated to be IMO more readable and easier to understand. A few other small changes include using cloneNode(), and not putting html into a js string. Small stuff, but you can copy and paste this as is and it will work.

    The way it works is by making two invisible divs fill the element you're watching, and then putting a trigger in each, and setting a scroll position that will lead to triggering a scroll change if the size changes.

    All real credit goes to Marc J, but if you're just looking for the relevant code, here it is:

        window.El = {}
    
        El.resizeSensorNode = undefined;
        El.initResizeNode = function() {
            var fillParent = "display: block; position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;";
            var triggerStyle = "position: absolute; left: 0; top: 0; transition: 0s;";
    
            var resizeSensor = El.resizeSensorNode = document.createElement("resizeSensor");
            resizeSensor.style = fillParent;
    
            var expandSensor = document.createElement("div");
            expandSensor.style = fillParent;
            resizeSensor.appendChild(expandSensor);
    
            var trigger = document.createElement("div");
            trigger.style = triggerStyle;
            expandSensor.appendChild(trigger);
    
            var shrinkSensor = expandSensor.cloneNode(true);
            shrinkSensor.firstChild.style = triggerStyle + " width: 200%; height: 200%";
            resizeSensor.appendChild(shrinkSensor);
        }
    
    
        El.onSizeChange = function(domNode, fn) {
            if (!domNode) return;
            if (domNode.resizeListeners) {
                domNode.resizeListeners.push(fn);
                return;
            }
    
            domNode.resizeListeners = [];
            domNode.resizeListeners.push(fn);
    
            if(El.resizeSensorNode == undefined)
                El.initResizeNode();
    
            domNode.resizeSensor = El.resizeSensorNode.cloneNode(true);
            domNode.appendChild(domNode.resizeSensor);
    
            var expand = domNode.resizeSensor.firstChild;
            var expandTrigger = expand.firstChild;
            var shrink = domNode.resizeSensor.childNodes[1];
    
            var reset = function() {
                expandTrigger.style.width = '100000px';
                expandTrigger.style.height = '100000px';
    
                expand.scrollLeft = 100000;
                expand.scrollTop = 100000;
    
                shrink.scrollLeft = 100000;
                shrink.scrollTop = 100000;
            };
    
            reset();
    
            var hasChanged, frameRequest, newWidth, newHeight;
            var lastWidth = domNode.offsetWidth;
            var lastHeight = domNode.offsetHeight;
    
    
            var onResized = function() {
                frameRequest = undefined;
    
                if (!hasChanged) return;
    
                lastWidth = newWidth;
                lastHeight = newHeight;
    
                var listeners = domNode.resizeListeners;
                for(var i = 0; listeners && i < listeners.length; i++) 
                    listeners[i]();
            };
    
            var onScroll = function() {
                newWidth = domNode.offsetWidth;
                newHeight = domNode.offsetHeight;
                hasChanged = newWidth != lastWidth || newHeight != lastHeight;
    
                if (hasChanged && !frameRequest) {
                    frameRequest = requestAnimationFrame(onResized);
                }
    
                reset();
            };
    
    
            expand.addEventListener("scroll", onScroll);
            shrink.addEventListener("scroll", onScroll);
        }
    

提交回复
热议问题