CSS 3D 变换:反向元素选择

CSS 3D transforms: inverted element selection

我的问题可能有点复杂,因为我使用屏幕截图来正确说明我的问题。如果我谈论浏览器,我总是指最新版本。

我用 3D 变换建造了一个房间。

这是Chrome

的房间

如果我将元素悬停在开发工具检查器中,每个元素都会正确突出显示(蓝色),除了地板。

地板是这样突出显示的:

它基本上突出了消失点(或者地板无限大时的样子)。

现在我不会对开发工具突出显示有任何问题。问题是 firefox 不会那样显示地板。这是 firefox - 突出显示相同的部分 - 不显示地板:

地板随 transform: rotateX(90deg) 旋转。这是最让我困惑的。如果我将地板向后移动 -35 像素,则根本没有高光。 恰好 -36 像素,地板正确突出显示并可见!

这是 Chrome 显示的楼层加上 translate3d(0px, -35px, 0px)。亮点不见了! (我移开了墙壁以更好地看到地板)

这是 chrome 和 translate3d(0px, -36px, 0px)

楼层正确突出显示!在 firefox 中也是如此,现在可以正确显示楼层了!

地板的消失(在 FF 中)和通过开发工具(chrome & ff)的错误选择仅出现在地板围绕其 x 轴旋转 80 到 100 度之间。地板下方和上方突出显示并正确标记。 chrome 相同,除了 chrome 正在显示地板,即使它在开发工具中奇怪地(错误地?)突出显示。

这是 firefox 显示的地板旋转了 60 度而不是 90 度(并且没有应用 translate3d

所以我的结论是,如果我修复了开发工具中的突出显示,我将能够在 Firefox 中看到地板。 由于 Firefox 和 Chrome 都像那样突出显示地板,我认为这是所需的行为。谁能给我解释一下?

这是为房间供电的 CSS (.scss):

$baseX: 718px;
$baseY: 432px;
$catwalkWidth: 182px;
$wallDistance: 1535px;

section {

    width: 100%;
    height: 100%;

    background-image: url(../img/bg.jpg);
    background-position: left top;
    background-repeat: no-repeat;
    background-size: contain;

    perspective: 1500px;
    perspective-origin: 638px 305px;

    overflow: hidden;

    transition: all ease 1s;
}

.wall {

    width: $baseX;
    height: $baseY;
    position: absolute;
    right: 0;
    top: 0;
    background-color: orange;

    transform: translateZ(-0px);

    z-index: 100;
    box-shadow: inset 0 -10px 10px -10px #666;

    background: linear-gradient(to bottom,#e8dad1 67%,#e8dad1 67%,#dedddc 100%);

}


.back-wall {
    width: $catwalkWidth;
    height: $baseY;
    position: absolute;
    top: 0;
    right: $baseX;
    background: linear-gradient(to bottom,#e8dad1 67%,#e8dad1 67%,#dedddc 100%);
    opacity: .9;
    z-index: 50;
    transform: translateZ(-495px);

}

.side-wall-1 {
    position: absolute;
    top: 0;
    height: $baseY;
    right: $baseX + $catwalkWidth;
    width: 750px;
    opacity: .5;
    z-index: 105;
    transform-origin: right bottom;
    transform: rotateY(90deg) translateX(-100px);
}

.side-wall-2 {
    position: absolute;
    top: 0;
    height: $baseY;
    right: $baseX + $catwalkWidth;
    width: 200px;
    opacity: .5;
    z-index: 105;
    transform-origin: right bottom;
    transform: rotateY(90deg) translateX(-650px);
}

.floor {
    position: absolute;
    width: $baseX;
    height: $wallDistance;
    top: $baseY;
    background-color: blue;
    right: 0;
    transform-origin: top center;
    transform: rotateX(90deg);

    background: linear-gradient(to bottom,#e8dad1 67%,#e8dad1 67%,#dedddc 100%);

    box-shadow: inset 10px 0px 10px -10px #666;

}

.inner {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: linear-gradient(to bottom,#e8dad1 67%,#e8dad1 67%,#dedddc 100%);

}

.catwalk {


    z-index: 10;

    width: 182px;
    height: 1835px;
    position: absolute;
    right: $baseX;
    top: $baseY;
    backface-visibility: hidden;
    transform-style: preserve-3d;
    transform: rotateX(90deg) rotateZ(0deg) translateY(-495px) translateZ(3px);
    transform-origin: top center;

    overflow: visible;


    .inner {

        transform-style: preserve-3d;

        &:after {

            @extend .inner;

            content: "";
            display: block;

            right: auto;
            left: 100%;

            transform-origin: left top;

            transform: rotateY(90deg) !important;

            width: 3px;
            background: #666;


        }


    }


}

当元素为 "too long/high" 时似乎会发生这种情况。我不确定究竟什么是太长,但降低高度(在我的示例中是 z 轴上的深度)解决了这个问题。 为了保持房间效果和 "deepness" 我调整了 perspective 属性 以使用较小的元素创建相同的房间尺寸。