css3中transition和display的坑


不知道大家做css3動畫的時候遇到過這種情景沒?

用opacity實現淡入淡出的效果。噢!good!一切正常css3中transition和display的坑 給個栗子:

<!DOCTYPE html> 
<html> 
<meta charset="uft-8">
<head> 
<style>
.div1{
     background: red;
}
.div2 {
     width:100px;
     height:100px;
     background:blue;
     transition:opacity 2s;
     -moz-transition:opacity 2s; /* Firefox 4 */
     -webkit-transition:opacity 2s; /* Safari and Chrome */
     -o-transition:opacity 2s; /* Opera */
     opacity: 0;
} 
.div1:hover .div2 {
     opacity:1;
} 
</style> 
</head> 
<body> 
     <div class="div1">
     <p>請移動到紅色div上</p>
     <div class="div2"></div>
</div> 
</body> 
</html>
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
代碼laycode - v1.1

或者用animation,在keyframe中寫也一樣。這里就不寫出代碼了

但是難免我們會遇到這樣的需求,也一定會遇到: 我們都知道opacity:0的時候,其實他還是占頁面空間的,他會遮擋到他下面的層(不是視覺上)。而且綁定在他上面的一些onclick事件之類的,也同樣會發生。 這時候我們想在opacity:0的時候,把他隱藏掉,用display: none。 好,那我們稍微在css中加幾句,變成

.div1{
     background: red;
}
.div2 {
     width:100px;
     height:100px;
     background:blue;
     transition:opacity 2s;
     -moz-transition:opacity 2s; /* Firefox 4 */
     -webkit-transition:opacity 2s; /* Safari and Chrome */
     -o-transition:opacity 2s; /* Opera */
     opacity: 0;
     display: none;
} 
.div1:hover .div2 {
     opacity:1;
     display:block
} 
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
代碼laycode - v1.1

打開瀏覽器看一下效果先。 我擦。。。。淡入淡出的效果全沒了css3中transition和display的坑 怎么回事。。。這簡直是破壞性的作用,這也是之前做動畫過程中遇到的大坑

聰明的碼農們當然有辦法來解決這種情況。 大家都知道visibility的效果其實跟 display 在一定程度上相似, 當然是一定程度上。 那為什么說只是一定程度上相似呢,因為它仍然是占空間的,那么這時候看官一定會說,這么用跟opacity壓根沒區別呀css3中transition和display的坑

但聰明的碼農們一定又想到,這時候,他是不會遮擋到下面的層的,也就是說 他跟opacity這樣的存在不同,onclick等事件是不會發生的。

我們來說下visibility, 常用到的是visible和 hidden 兩個值。但也可以是數值, 等於0時相當於hidden,而只要大於0時,visibility就為visible。那我們利用這點。

.div1{
     background: red;
}
.div2 {
     width:100px;
     height:100px;
     background:blue;
     transition:all 2s;
     -moz-transition:all 2s; /* Firefox 4 */
     -webkit-transition:all 2s; /* Safari and Chrome */
     -o-transition:all 2s; /* Opera */
     visibility: hidden
} 
.div1:hover .div2 {
     visibility: visible
} 
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
代碼laycode - v1.1

瀏覽一下,會發現,這時候是會有延時隱藏的效果的。很好,又發現新東西了

那漸變的效果怎么辦。。。。

聰明的碼農們又想起了opacity 。。。結合起來用會怎么用呢

.div1{
     background: red;
}
.div2 {
     width:100px;
     height:100px;
     background:blue;
     transition:all 2s;
     -moz-transition:all 2s; /* Firefox 4 */
     -webkit-transition:all 2s; /* Safari and Chrome */
     -o-transition:all 2s; /* Opera */
     visibility: hidden;
     opacity: 0
} 
.div1:hover .div2 {
     visibility: visible;
     opacity: 1
} 
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
代碼laycode - v1.1

瀏覽下先。。。。!!!!一切正常了css3中transition和display的坑

其實,visibility會在opacity生效后再應用。比如隱藏時,先opacity變為0,再應用了visibility:hidden 這時候就隱藏起來了,相關的事件也不會發生。 看來display:none這時候被拋棄了啊

當然,有人會說visibility:hidden始終是占着頁面空間的,display能夠減少頁面的repaint,還是要用display:none怎么做呢

聰明的碼農又想到了: 先把display變成block 然后延遲transition動畫的執行

當然啦 這就需要用到JS了

以上就是display和transition中發現的坑。。。。!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM