【问题标题】:How to suspress the position: relative when using translate如何抑制位置:使用翻译时相对
【发布时间】:2015-05-10 23:01:32
【问题描述】:

似乎使用transform: translateY(1px); 也会导致元素获得额外的position: relative;-行为。

有没有办法抑制这种情况?

这是一个例子on codepen.io

我想将白盒绝对定位到绿色的,而不是父(红色)的。

【问题讨论】:

    标签: css css-position transform


    【解决方案1】:

    这是一个不太理想的解决方法,但它适用于您现有的标记。

    将您的 #two CSS 更改为伪元素,添加以下样式:

    #two::before {
      content: '';
      display: block;
    }
    

    Updated CodePen


    除了更改标记之外,您的另一个解决方案是使用 JavaScript 使 three 成为元素 one 的子元素:
    document.querySelector('#one').appendChild(document.querySelector('#three'));
    

    但是,它将不再从元素 two 继承任何样式,如下所示 CodePen

    这是一个有趣的阅读,它确认了“转换元素强制添加位置:相对。”:http://meyerweb.com/eric/thoughts/2011/09/12/un-fixing-fixed-elements-with-css-transforms/

    不仅如此,它还会影响固定位置的元素,这没有多大意义。

    【讨论】:

      【解决方案2】:

      position:absolute (from moz) 不要为元素留出空间。相反,将其定位在相对于其最近定位的祖先或包含块的指定位置。绝对定位的框可以有边距,它们不会与任何其他边距一起折叠。

      所以在你的情况下,最近的祖先总是#two,它不继承任何位置属性,只是默认position: static;...


      如果你给了#two position:relative// or absolute 并用top:left: 定位它,那么放置#three 可能更容易: http://codepen.io/maio/pen/qEMJpY

      【讨论】:

      • 你读错了。包含块是后备,而不是优先检查。从#two 中删除转换时,您也可以看到这一点。然后#three将定位到#one
      • 我确定两个有 position:static 因为我检查了开发工具(也检查添加一个属性,如 left:33px -> 它没有反应),因为 #three 嵌套在 #两个是计算绝对定位的地方
      【解决方案3】:

      一种选择是通过在#three 周围包裹一个元素来置换/否定父元素的定位(在这种情况下,我添加了.displacement 元素)。

      绝对定位此包装元素,并将其定位为覆盖父元素(使用top: 0/right: 0/bottom: 0/left: 0)。然后通过给元素相对于父元素的负平移值来置换元素。

      <div class="displacement">
          <div id="three"></div>
      </div>
      
      .displacement {
        -webkit-transform: translateY(-25px) translateX(-25px);
        transform: translateY(-25px) translateX(-25px);
        position: absolute;
        top: 0; right: 0;
        bottom: 0; left: 0;
        width: 200%; height: 200%;
      }
      

      这样做时,元素#three#one 绝对相对定位,而父#two 的翻译定位被有效地置换。

      Updated Example

      .displacement {
        -webkit-transform: translateY(-25px) translateX(-25px);
        transform: translateY(-25px) translateX(-25px);
        position: absolute;
        top: 0; right: 0;
        bottom: 0; left: 0;
        width: 200%; height: 200%;
      }
      #three {
        background-color: white;
        height: 25px;
        width: 25px;
        position: absolute;
        left: 0;
        bottom: 0;
      }
      

      【讨论】:

      • 感谢您的回答!这确实解决了示例问题。但如果你不知道所有维度,它就行不通。假设#three 应该是“left:0”和“right:0”。那么这没有帮助,不是吗?
      • @Gundon 实际上我想出了一个解决方法...codepen.io/anon/pen/yyxRza
      • 好主意!介意分享这个作为答案吗?我会在回答时打勾(:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 2015-08-15
      相关资源
      最近更新 更多