2015-01-14 15 views
24

Tôi có một div trong đó tôi animate nội dung:Làm cách nào để ngăn hoạt ảnh khung hình css chạy trên tải trang?

#container { 
 
    position: relative; 
 
    width: 100px; 
 
    height: 100px; 
 
    border-style: inset; 
 
} 
 
#content { 
 
    visibility: hidden; 
 
    -webkit-animation: animDown 1s ease; 
 
    position: absolute; 
 
    top: 100px; 
 
    width: 100%; 
 
    height: 100%; 
 
    background-color: lightgreen; 
 
} 
 
#container:hover #content { 
 
    -webkit-animation: animUp 1s ease; 
 
    animation-fill-mode: forwards; 
 
    -webkit-animation-fill-mode: forwards; 
 
} 
 
@-webkit-keyframes animUp { 
 
    0% { 
 
    -webkit-transform: translateY(0); 
 
    visibility: hidden; 
 
    opacity: 0; 
 
    } 
 
    100% { 
 
    -webkit-transform: translateY(-100%); 
 
    visibility: visible; 
 
    opacity: 1; 
 
    } 
 
} 
 
@-webkit-keyframes animDown { 
 
    0% { 
 
    -webkit-transform: translateY(-100%); 
 
    visibility: visible; 
 
    opacity: 1; 
 
    } 
 
    100% { 
 
    -webkit-transform: translateY(0); 
 
    visibility: hidden; 
 
    opacity: 0; 
 
    } 
 
}
<div id="container"> 
 
    <div id="content"></div> 
 
</div>

Mở slide nội dung di chuột vào div container. Vấn đề của tôi là, khi tôi làm mới trang và trang tải hoạt ảnh animown của #content sẽ chạy và tôi muốn nó chỉ chạy sau sự kiện di chuột.

Có cách nào để làm CSS tinh khiết này không, hoặc tôi phải tìm ra điều gì đó trong JS?

http://jsfiddle.net/d0yhve8y/

+0

này có thể trợ giúp: http://css-tricks.com/transitions-only-after-page-load/ – fcalderan

+1

@FabrizioCalderan ý tưởng hay nhưng chỉ làm chậm hoạt ảnh, nó vẫn hoạt hình không chính xác khi lớp bị xóa – Rhumborl

Trả lời

10

Giải pháp 1 - Thêm xuống hoạt hình trên di chuột đầu tiên

lẽ là lựa chọn tốt nhất là không đưa các hình ảnh động trên xuống cho đến khi người dùng đã bay lượn trên container cho lần đầu tiên.

Điều này liên quan đến việc nghe sự kiện mouseover sau đó thêm lớp học với hoạt ảnh tại thời điểm đó và xóa trình xử lý sự kiện. Nhược điểm chính (tiềm năng) của điều này là nó dựa trên Javascript.

;(function(){ 
 
    var c = document.getElementById('container'); 
 
    function addAnim() { 
 
     c.classList.add('animated') 
 
     // remove the listener, no longer needed 
 
     c.removeEventListener('mouseover', addAnim); 
 
    }; 
 

 
    // listen to mouseover for the container 
 
    c.addEventListener('mouseover', addAnim); 
 
})();
#container { 
 
    position:relative; 
 
    width:100px; 
 
    height:100px; 
 
    border-style:inset; 
 
} 
 
#content { 
 
    position:absolute; 
 
    top:100px; 
 
    width:100%; 
 
    height:100%; 
 
    background-color:lightgreen; 
 
    opacity:0; 
 
} 
 

 
/* This gets added on first mouseover */ 
 
#container.animated #content { 
 
    -webkit-animation:animDown 1s ease; 
 
} 
 

 
#container:hover #content { 
 
    -webkit-animation:animUp 1s ease; 
 
    animation-fill-mode:forwards; 
 
    -webkit-animation-fill-mode:forwards; 
 
} 
 

 
@-webkit-keyframes animUp { 
 
    0% { 
 
     -webkit-transform:translateY(0); 
 
     opacity:0; 
 
    } 
 
    100% { 
 
     -webkit-transform:translateY(-100%); 
 
     opacity:1; 
 
    } 
 
} 
 
@-webkit-keyframes animDown { 
 
    0% { 
 
     -webkit-transform:translateY(-100%); 
 
     opacity:1; 
 
    } 
 
    100% { 
 
     -webkit-transform:translateY(0); 
 
     opacity:0; 
 
    } 
 
}
<div id="container"> 
 
    <div id="content"></div> 
 
</div>

Giải pháp 2 - chơi hoạt hình ẩn

Một cách khác xung quanh đây là bước đầu ẩn yếu tố, đảm bảo các hình ảnh động lượt trong khi nó bị ẩn, sau đó làm cho nó có thể nhìn thấy . Nhược điểm của điều này là thời gian có thể hơi tắt và nó được thực hiện có thể nhìn thấy quá sớm, và cũng là di chuột không có sẵn ngay lập tức.

Điều này yêu cầu một số Javascript chờ độ dài của hoạt ảnh và chỉ sau đó hiển thị #content. Điều này có nghĩa bạn cũng cần phải thiết lập ban đầu opacity-0 vì vậy nó không xuất hiện trên tải và cũng loại bỏ các visibility từ các khung hình chính - những không làm bất cứ điều gì anyway:

// wait for the animation length, plus a bit, then make the element visible 
 
window.setTimeout(function() { 
 
    document.getElementById('content').style.visibility = 'visible'; 
 
}, 1100);
#container { 
 
    position:relative; 
 
    width:100px; 
 
    height:100px; 
 
    border-style:inset; 
 
} 
 

 
#content { 
 
    visibility:hidden; 
 
    -webkit-animation:animDown 1s ease; 
 
    position:absolute; 
 
    top:100px; 
 
    width:100%; 
 
    height:100%; 
 
    background-color:lightgreen; 
 
    opacity:0; 
 
} 
 

 
#container:hover #content { 
 
    -webkit-animation:animUp 1s ease; 
 
    animation-fill-mode:forwards; 
 
    -webkit-animation-fill-mode:forwards; 
 
} 
 

 
@-webkit-keyframes animUp { 
 
    0% { 
 
     -webkit-transform:translateY(0); 
 
     opacity:0; 
 
    } 
 
    100% { 
 
     -webkit-transform:translateY(-100%); 
 
     opacity:1; 
 
    } 
 
} 
 

 
@-webkit-keyframes animDown { 
 
    0% { 
 
     -webkit-transform:translateY(-100%); 
 
     opacity:1; 
 
    } 
 
    100% { 
 
     -webkit-transform:translateY(0); 
 
     opacity:0; 
 
    } 
 
}
<div id="container"> 
 
    <div id="content"></div> 
 
</div>

Giải pháp 3 - Sử dụng hiệu ứng chuyển tiếp

Trong trường hợp của bạn, bạn chỉ có thể thực hiện CSS này bằng cách thay thế keyframe s bằng cách thay thế transition. rts với opacity:0 và chỉ cần di chuột có một sự thay đổi trong opacitytransform:

#container { 
 
    position:relative; 
 
    width:100px; 
 
    height:100px; 
 
    border-style:inset; 
 
} 
 

 
#content { 
 
    position:absolute; 
 
    top:100px; 
 
    width:100%; 
 
    height:100%; 
 
    background-color:lightgreen; 
 

 
    /* initial state - hidden */ 
 
    opacity:0; 
 
    /* set properties to animate - applies to hover and revert */ 
 
    transition:opacity 1s, transform 1s; 
 
} 
 

 
#container:hover #content { 
 
    /* Just set properties to change - no need to change visibility */ 
 
    opacity:1; 
 
    -webkit-transform:translateY(-100%); 
 
    transform:translateY(-100%); 
 
}
<div id="container"> 
 
    <div id="content"></div> 
 
</div>

+2

OP được gắn thẻ 'keyframe' vì vậy tôi tin rằng anh ấy muốn một giải pháp ** keyframe **. – Vucko

+0

@Vucko Ý tưởng tương tự có thể được áp dụng với một khung hình chính – Kaiido

+1

@Kaiido Tôi sẽ không đồng ý nhưng bạn có thể chứng minh điều đó không? – Vucko

28

tôi luôn đặt tải trước lớp để cơ thể với thời gian hoạt hình giá trị 0 và làm việc của nó khá tốt. Tôi có một số chuyển tiếp trở lại vì vậy tôi phải loại bỏ hoạt hình tải cho họ quá. Tôi đã giải quyết vấn đề này bằng cách đặt thời gian hoạt ảnh tạm thời thành 0. Bạn có thể thay đổi các hiệu ứng chuyển tiếp để phù hợp với bạn.

HTML

... <body class="preload">...

CSS được thiết lập hình ảnh động để 0s

body.preload *{ 
animation-duration: 0s !important; 
-webkit-animation-duration: 0s !important; 
transition:background-color 0s, opacity 0s, color 0s, width 0s, height 0s, padding 0s, margin 0s !important;} 

JS sẽ loại bỏ lớp sau khi một số chậm trễ nên hình ảnh động có thể xảy ra trong thời gian bình thường :)

setTimeout(function(){ 
    document.body.className=""; 
},500); 
+2

Đây phải là câu trả lời được chấp nhận. –

+0

Cảm ơn bạn đã giải pháp này. – Phoca

+0

Chắc chắn chức năng, giống như một giấc mơ. Cảm ơn rất nhiều. Đây là câu trả lời đúng. – Ernedar

Các vấn đề liên quan