【问题标题】:Skip hidden element on :first-child selector跳过 :first-child 选择器上的隐藏元素
【发布时间】:2017-11-07 13:10:12
【问题描述】:

我正在使用Sortable.js,但遇到以下问题:

我有一个要排序的项目列表,我需要第一个元素比其他所有 3 个元素都宽。

为了做到这一点,我有以下 css:

#produto_img {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
      flex-wrap: wrap;
}

#produto_img > li {
  height: 100px;
  margin: 0 5px;
}

#produto_img > li:not(:first-child) {
  flex: 1;
}

#produto_img > li:first-child {
  width: 100%;
  height: 200px;
  margin-bottom: 10px;
}

当我在第一个项目之后开始拖动任何项目时,它工作正常,即使我用第一个项目切换它也能正常工作。

它创建以下标记:

但是当我从第一个开始拖动时,我会失去样式,因为插件会在其位置创建另一个项目并将其设置为display: none,因此:first-child 选择器将不再起作用,并且它丢失了样式。

This gif 显示正在发生的事情。

如果第一个元素是display: none,我的第一个问题就是以某种方式跳过它,或者使用:first-child:visible 之类的东西,但这显然行不通。

有什么解决办法吗?

【问题讨论】:

  • 是否可以使用类而不是内联样式隐藏某些可拖动项?在这种情况下,您可以使用 :not(.hidden) 选择器
  • 实际上我正在查看插件的源代码,以便可以向隐藏的已创建元素添加一个类。我试试看。

标签: javascript html css css-selectors sortablejs


【解决方案1】:

遗憾的是,:visible 伪类仍然与 jQuery 不同。您可以使用的一种解决方法是通过添加/删除类来处理隐藏。

那就是覆盖的问题

li.hidden {
    display: none;
}

li:not(.hidden) {
    width: 100%;
    height: 200px;
    margin-bottom: 10px;
}

li:not(.hidden) ~ li {
    width: auto;
    height: auto;
    margin-bottom: 0;
    flex: 1;
}

【讨论】:

  • 我已经设法将插件更改为将自定义类添加到它创建的不可见克隆中。我现在试试看
猜你喜欢
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多