在CSS中使用隐藏的子元素强制父级的高度

时间:2018-01-21 14:04:02

标签: css height hidden

如果我有一个隐藏的子元素(public class Person { String name; public Person(String name) { this.name = name; } @Override public String toString() { return name; } } private List<Person> getPersonList() { List<Person> persons = new ArrayList<>(); persons.add(new Person("Person A")); persons.add(new Person("Person B")); persons.add(new Person("Person C")); return persons; } Observable<List<Person>> netWorkCall = Observable.fromCallable(this::getPersonList) .replay() .autoConnect(); // first subscription netWorkCall.subscribe(persons -> { for (Person person : persons) { System.out.println(person); } // output is as follows // Person A // Person B // Person C }); // second subscription, whic does some modification netWorkCall .flatMap(new Function<List<Person>, ObservableSource<List<Person>>>() { @Override public ObservableSource<List<Person>> apply(@NonNull List<Person> persons) throws Exception { return Observable.fromCallable(() -> persons); } }) .subscribe(persons -> { for (int i = 0; i < persons.size(); i++) { Person person = persons.get(i); person.name = "Person " + i; System.out.println(person); } // output is as follows // Person 0 // Person 1 // Person 2 }); // third subscription , again calls the replayed Observable netWorkCall.subscribe(persons -> { for (Person person : persons) { System.out.println(person); } // Here I need output is as follows // Person A // Person B // Person C // But what I get is // Person 0 // Person 1 // Person 2 }); display: none),我怎样才能让父visibility: hidden保持高度,以便在孩子出现时看得见,父高不会改变?

我是否需要在父母身上设置一个绝对高度,或者我还可以从孩子那里计算它的身高吗?

2 个答案:

答案 0 :(得分:3)

display:none从流中删除元素,因此无法使父级保持高度(除了硬编码固定值)。它还应该将其隐藏在屏幕阅读器和抓取工具中。

visiblity:hidden将元素保留在流中,因此保留为其保留的空间,因此父级将保持高度,就像元素可见一样。

opacity:0也会像visibility:hidden一样行动,同时允许将元素的显示转换/动画为opacity:1

所以你应该使用visibility:hiddenopacity:0,具体取决于你是否想要在跳跃的显示或过渡中显示元素。

编辑:

还应该注意,visibility:hidden不会触发事件(例如点击,悬停等),而不透明度:0会。因此,甚至有一些罕见的情况可以将两者结合使用。例如,如果你想让元素开始隐藏,那么就显示一个转换,并让另一个链接到它的事件只有当元素可见时才会触发

在下面的示例中,有一个链接到div元素的click事件,只有在可见时才会触发(因此不能仅使用不透明度),但在显示时也会有一个转换(因此不能仅使用可见性)

$('button').click(function() {
		$('.opacity').toggleClass("visible");
});

$('.opacity').click(function() {
		alert("clicked");
});
div {
    width: 100vw;
    height: 100vh;
    transition: opacity 1s ease;
    background: chartreuse;
}

.visibility{
  visibility:hidden;
}


.opacity{
  visibility:hidden;
  opacity:0;
}

.visible{
  opacity:1;
  visibility: visible;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>
toggle
</button>

<div class="opacity"> opacity:0 </div>
<hr>

答案 1 :(得分:2)

如果您使用visibility: visible;来隐藏孩子,则仍会为其保留空间。您可以通过设置visibility

再次显示它

引用MDN docs for visibility

  

Criteria criteria = session.createCriteria(User.class); criteria.add( Restrictions.and( Restrictions.ilike("firstName", firstName), Restrictions.ilike("lastName", lastName) ) ); CSS属性可以显示或隐藏元素而不影响文档的布局(即,为元素创建空间,无论它们是否可见)。