【问题标题】:Why is z-index not working with CSS columns in Chrome?为什么 z-index 不适用于 Chrome 中的 CSS 列?
【发布时间】:2013-12-29 05:01:40
【问题描述】:

我在使用column-count 创建的多列布局中的z-index 有问题。我想用.animate() 将单击的 div 移动到列表顶部,但是当我单击右列上的元素时,它会位于左列元素的后面。这在 Firefox 上运行良好,但在 Chrome 中却不行。

有什么想法吗?

function gotoTop(element) {
    var destinationTop = $('.categories').offset().top;
    var elementOffsetTop = $(element).offset().top;
    var distanceTop = (elementOffsetTop - destinationTop);
    return distanceTop;
}

function gotoLeft(element) {
    var destinationLeft = $('.categories').offset().left;
    var elementOffsetLeft = $(element).offset().left;
    var distanceLeft = (elementOffsetLeft - destinationLeft);
    return distanceLeft;
}
$('.category').on('click', function () {
    $(this).css('position', 'relative');
    $(this).css('z-index', '9999');
    $(this).siblings().css('z-index', '10');
    $(this).animate({
            top: '-' + gotoTop(this) + 'px',
            left: '-' + gotoLeft(this) + 'px'
        }, 2000
    );
});
.categories {
    width: 500px;
    font-size: 12px;
    -moz-column-count: 2;
    -webkit-column-count: 2;
    column-count: 2;
    -moz-column-gap: 7px;
    -webkit-column-gap: 7px;
    column-gap: 0px;
    background: grey;
}

.category {
    list-style: none;
    padding-left: 0;
    display: inline-block;
    width: 100%;
    min-height: 26px;
    border-left: 1px groove black;
    cursor: pointer;
    -webkit-column-break-inside: avoid;
    border-bottom: 2px groove #666;
    font-size: 13px;
    border-right: 1px solid #000;
    background: black;
    color: white;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<div class="categories">
    <ul class="category" id="1">
        <li>Div 1</li>
    </ul>
    <ul class="category" id="2">
        <li>Div 2</li>
    </ul>
    <ul class="category" id="3">
        <li>Div 3</li>
    </ul>
    <ul class="category" id="4">
        <li>Div 4</li>
    </ul>
    <ul class="category" id="5">
        <li>Div 5</li>
    </ul>
    <ul class="category" id="6">
        <li>Div 6</li>
    </ul>
    <ul class="category" id="7">
        <li>Div 7</li>
    </ul>
    <ul class="category" id="8">
        <li>Div 8</li>
    </ul>
    <ul class="category" id="9">
        <li>Div 9</li>
    </ul>
    <ul class="category" id="10">
        <li>Div 10</li>
    </ul>
    <ul class="category" id="11">
        <li>Div 11</li>
    </ul>
    <ul class="category" id="12">
        <li>Div 12</li>
    </ul>
    <ul class="category" id="13">
        <li>Div 13</li>
    </ul>
    <ul class="category" id="14">
        <li>Div 14</li>
    </ul>
    <ul class="category" id="15">
        <li>Div 15</li>
    </ul>
    <ul class="category" id="16">
        <li>Div 16</li>
    </ul>
    <ul class="category" id="17">
        <li>Div 17</li>
    </ul>
    <ul class="category" id="18">
        <li>Div 18</li>
    </ul>
</div>

JSFiddle

【问题讨论】:

  • 我已经更新了你的 CSS。并且问题解决了。看我的回答

标签: javascript css google-chrome z-index css-multicolumn-layout


【解决方案1】:

使用transform: translateZ 而不是z-index

$(this).css('transform','translateZ(1px)');
$(this).siblings().css('transform','translateZ(0px)');

这将正确堆叠元素,以便您单击的元素位于顶部。

我更新了你的小提琴: http://jsfiddle.net/s2AfU/4/

【讨论】:

  • 这是一个很好的;)
  • 这是一个绝妙的解决方法,但我似乎无法让它在 IE(11) 中工作。有什么想法吗?
  • 在我的情况下(遗憾地无法显示标记),但基本上一个列表 (&lt;ul&gt;) 被包装在 5 列中,有一个间隙。我应用了一个“cut”的hint.css 工具提示——在尝试了一些技巧之后,transform: scale3d(1,1,1) 最适合在 chrome 中获得良好的结果。
【解决方案2】:

Chrome 似乎为每一列创建了一个单独的层,您无法控制它的z-index。我建议使用 CSS3 Flexbox 代替 CSS3 列的解决方案:

JSFiddle

function gotoTop(element) {
    var destinationTop = $('.categories').offset().top;
    var elementOffsetTop = $(element).offset().top;
    var distanceTop = (elementOffsetTop - destinationTop);
    return distanceTop;
}

function gotoLeft(element) {
    var destinationLeft = $('.categories').offset().left;
    var elementOffsetLeft = $(element).offset().left;
    var distanceLeft = (elementOffsetLeft - destinationLeft);
    return distanceLeft;
}

$('.category').on('click', function () {
    $(this).css('position', 'relative');
    $(this).css('z-index', '9999');
    $(this).siblings().css('z-index', '10');
    $(this).animate({
        top: '-' + gotoTop(this) + 'px',
        left: '-' + gotoLeft(this) + 'px'
    }, 2000);
});
.categories {
    width: 500px;
    height: 500px;
    font-size: 12px;
    display: -webkit-flex;
    display: flex;
    -webkit-flex-flow: column wrap;
    flex-flow: column wrap;
    background: grey;
}

.category {
    list-style: none;
    padding-left: 0;
    display: inline-block;
    width: 240px;
    min-height: 26px;
    border-left: 1px groove black;
    cursor: pointer;
    -webkit-column-break-inside: avoid;
    border-bottom: 2px groove #666;
    font-size: 13px;
    border-right: 1px solid #000;
    background: black;
    color: white;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<div class="categories">
    <ul class="category" id="1">
        <li>Div 1</li>
    </ul>
    <ul class="category" id="2">
        <li>Div 2</li>
    </ul>
    <ul class="category" id="3">
        <li>Div 3</li>
    </ul>
    <ul class="category" id="4">
        <li>Div 4</li>
    </ul>
    <ul class="category" id="5">
        <li>Div 5</li>
    </ul>
    <ul class="category" id="6">
        <li>Div 6</li>
    </ul>
    <ul class="category" id="7">
        <li>Div 7</li>
    </ul>
    <ul class="category" id="8">
        <li>Div 8</li>
    </ul>
    <ul class="category" id="9">
        <li>Div 9</li>
    </ul>
    <ul class="category" id="10">
        <li>Div 10</li>
    </ul>
    <ul class="category" id="11">
        <li>Div 11</li>
    </ul>
    <ul class="category" id="12">
        <li>Div 12</li>
    </ul>
    <ul class="category" id="13">
        <li>Div 13</li>
    </ul>
    <ul class="category" id="14">
        <li>Div 14</li>
    </ul>
    <ul class="category" id="15">
        <li>Div 15</li>
    </ul>
    <ul class="category" id="16">
        <li>Div 16</li>
    </ul>
    <ul class="category" id="17">
        <li>Div 17</li>
    </ul>
    <ul class="category" id="18">
        <li>Div 18</li>
    </ul>
</div>

【讨论】:

    【解决方案3】:

    我认为这根本不可能。因为如您所见,右侧的元素在整个左侧列的后面。

    我不知道 column-count 在 DOM 中究竟是如何工作的,但我认为它创建了两个部分(您的两列),所有这些 &lt;ul&gt;s 都是该列的子级,并且这些列不能相互重叠.对于z-index,如果元素 B 位于元素 A 之上,则元素 A 的子元素永远不会高于元素 B。我认为这里就是这种情况。

    我在这里创建一个pluncker,以便您看得更清楚

    【讨论】:

      【解决方案4】:

      我已经更新了你的 Fiddle。您不需要使用column-gapcolumn-count。只需使用 css 的 float 属性。 看这个小提琴没有 javascript 变化。只是一个CSS更改。我希望这能解决您的问题(适用于所有浏览器)

      Updated Fiddle

      【讨论】:

      • 排序怎么样?你用你的 CSS 改变了它。
      • 您是否特别想要该订单?我的意思是 div 部分是否与编号有关
      • 我不知道。您说“您不需要使用column-gapcolumn-count”,但是在您的代码中排序并不等同于在问题代码中的排序。
      猜你喜欢
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多