Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何完美地重叠两个(相同的)元素?_Javascript_Height_Google Closure Library_Css - Fatal编程技术网

Javascript 如何完美地重叠两个(相同的)元素?

Javascript 如何完美地重叠两个(相同的)元素?,javascript,height,google-closure-library,css,Javascript,Height,Google Closure Library,Css,在位置:相对元素框中,我有 绝对定位的元素parent位于顶部:0,内部有一对静态p和h1..h6。这些可能都有不同的边距/填充值 一些绝对定位的元素,其中元素名称和内容正好匹配上面列表#1中的一个元素 目标是设置第二个元素的y值,使其与1中设置的相应元素完全重叠 我采用了这种方法(使用闭包,但任何东西都可以真正使用),从元素数组content开始生成列表#1: 现在,这适用于各种填充和margin=0,但在p和h1..6上的边距为非0时失败。我也尝试过“scrollHeight”,但似乎没有考

位置:相对
元素
框中,我有

  • 绝对定位的元素
    parent
    位于
    顶部:0
    ,内部有一对静态
    p
    h1..h6
    。这些可能都有不同的边距/填充值
  • 一些绝对定位的元素,其中元素名称和内容正好匹配上面列表#1中的一个元素
  • 目标是设置第二个元素的y值,使其与1中设置的相应元素完全重叠

    我采用了这种方法(使用闭包,但任何东西都可以真正使用),从元素数组
    content
    开始生成列表#1:

    现在,这适用于各种填充和
    margin=0
    ,但在
    p
    h1..6
    上的边距为非0时失败。我也尝试过“scrollHeight”,但似乎没有考虑到边距。 然后我尝试直接从列表#1中的渲染元素获取
    offsetTop
    ,但这似乎产生了与上面填充
    偏移量的过程完全相同的结果


    我如何使重叠工作?我正在寻找本机javascript或闭包库解决方案。

    您正在寻找的可能是
    goog.style.getPageOffset
    ,并且由于重叠元素的位置绝对是顶部设置,因此您可能必须使用
    goog.style.getMarginBox
    扣除要重叠的元素的顶部边距。以下是一些示例代码:

    <!DOCTYPE html>
    <html>
     <head>
    <title>test</title>
    </head> 
     <body> 
    <div id="game" data-something="hello"></div>
     <script type="text/javascript" src="js/goog/base.js"></script>
     <script type="text/javascript">
         goog.require("goog.dom");
         goog.require("goog.style");
     </script>
     </body>
        <div id="contentToOverLap" style="position:absolute;top:30px;left:30px">
            <h1 style="margin:10px;padding:2px">h1 10px mar and 2px pad</h1>
        </div>
        <div id="overlappingContent" style="display:inline">
            <h1 style="color:red;margin:15px;padding:2px;position:absolute">
                h1 15px mar and 2px pa
            </h1>
        </div>
        <script type="text/javascript">
            (function () {
                var pH = goog.dom.$("contentToOverLap").children[0];
                var cH = goog.dom.$("overlappingContent").children[0];
                var box = goog.style.getPageOffset(pH);
                console.log("box is:", box);
                var mar = goog.style.getMarginBox(cH);
                console.log("mar is:", mar);
                var t = box.y - mar.top;
                var l = box.x - mar.left;
                goog.style.setStyle(cH, { "top": t + "px", "left": l + "px" });
            })();
        </script>
    </html>
    
    
    测试
    goog.require(“goog.dom”);
    goog.require(“goog.style”);
    h1 10px mar和2px衬垫
    h1 15px mar和2px pa
    (功能(){
    var pH=goog.dom.$(“contentToOverLap”).children[0];
    var cH=goog.dom.$(“重叠内容”).children[0];
    变量框=goog.style.getPageOffset(pH);
    控制台日志(“框为:”,框);
    var mar=goog.style.getMarginBox(cH);
    日志(“mar是:”,mar);
    var t=方框y-三月顶部;
    var l=方框x-三月左;
    goog.style.setStyle(cH,{“top”:t+“px”,“left”:l+“px”});
    })();
    
    您的答案有效,谢谢!减去goog.style.getMarginBox就成功了。但是你能解释为什么减法吗?我的直觉是parent.offsetHeight给出的值太低(缺少边距),必须添加一些内容,而不是减去?@bebbi看起来设置重叠内容的顶部会设置外部框的顶部(包括边距)。因此,我将顶部设置为30px,边距为10px,然后内容将以40px显示。getPageOffset为您提供了内部框(内容顶部),更改边距将更改其值。我看到了我的代码中的缺陷,因为我从重叠内容的顶部扣除了要重叠的内容的边距,但应该使用重叠内容的边距,代码是有效的,因为它们都是相同的,但如果不是,它将失败。我已经纠正了这个错误。我不确定getPageOffset是如何计算的,但正如前面提到的;它将为您提供内容的位置(因此它包括页边距)。我在代码中没有使用offsetHeight,因为查看getPageOffset的源代码以手动计算元素的位置涉及太多代码,无法重新编写。我也不知道该如何使用它:-)好的,关于如何将顶部设置应用于外盒的解释是有意义的!关于getPageOffset的计算,我可以提供帮助:对于95%的情况,大概是下面的行,对于边缘情况,大概是90多行(抱歉,无法使代码标记工作):`var getPageOffset=function(element){var point={x:0,y:0};var parent=element;do{point.x+=parent.offsetLeft;point.y+=parent.offsetTop;}而(parent=parent.offsetParent);返回点;}`
    var matchedElm = source[i].cloneNode(true);
    goog.style.setStyle(matchedElm, {"top": offsets[i] + "px"});
    goog.dom.appendChild(box, matchedElm);
    
    <!DOCTYPE html>
    <html>
     <head>
    <title>test</title>
    </head> 
     <body> 
    <div id="game" data-something="hello"></div>
     <script type="text/javascript" src="js/goog/base.js"></script>
     <script type="text/javascript">
         goog.require("goog.dom");
         goog.require("goog.style");
     </script>
     </body>
        <div id="contentToOverLap" style="position:absolute;top:30px;left:30px">
            <h1 style="margin:10px;padding:2px">h1 10px mar and 2px pad</h1>
        </div>
        <div id="overlappingContent" style="display:inline">
            <h1 style="color:red;margin:15px;padding:2px;position:absolute">
                h1 15px mar and 2px pa
            </h1>
        </div>
        <script type="text/javascript">
            (function () {
                var pH = goog.dom.$("contentToOverLap").children[0];
                var cH = goog.dom.$("overlappingContent").children[0];
                var box = goog.style.getPageOffset(pH);
                console.log("box is:", box);
                var mar = goog.style.getMarginBox(cH);
                console.log("mar is:", mar);
                var t = box.y - mar.top;
                var l = box.x - mar.left;
                goog.style.setStyle(cH, { "top": t + "px", "left": l + "px" });
            })();
        </script>
    </html>