Bạn có thể làm cho nó hoạt động theo cách tự nhiên mà bạn mong đợi - sử dụng màn hình - nhưng bạn phải điều tiết trình duyệt để nó hoạt động, sử dụng Javascript hoặc như những người khác đã đề xuất một mẹo ưa thích với một thẻ bên trong một thẻ khác. Tôi không quan tâm đến thẻ bên trong vì nó làm phức tạp thêm CSS và kích thước, vì vậy đây là giải pháp Javascript:
https://jsfiddle.net/b9chris/hweyecu4/17/
Bắt đầu với một hộp như:
<div id="box" class="hidden">Lorem</div>
Một hộp ẩn.
div.hidden {
display: none;
}
#box {
transition: opacity 1s;
}
Chúng tôi sẽ sử dụng một mẹo được tìm thấy trong một q / a liên quan, kiểm tra offsetHeight để điều chỉnh trình duyệt ngay lập tức:
https://stackoverflow.com/a/16575811/176877
Đầu tiên, một thư viện chính thức hóa thủ thuật trên:
$.fn.noTrnsn = function () {
return this.each(function (i, tag) {
tag.style.transition = 'none';
});
};
$.fn.resumeTrnsn = function () {
return this.each(function (i, tag) {
tag.offsetHeight;
tag.style.transition = null;
});
};
Tiếp theo, chúng tôi sẽ sử dụng nó để tiết lộ một hộp và làm mờ nó trong:
$('#button').on('click', function() {
var tag = $('#box');
if (tag.hasClass('hidden'))
tag.noTrnsn().removeClass('hidden')
.css({ opacity: 0 })
.resumeTrnsn().css({ opacity: 1 });
else
tag.css({ opacity: 0 });
});
Điều này làm mờ dần hộp trong và ngoài. Vì vậy, .noTrnsn()
tắt các hiệu ứng chuyển tiếp, sau đó chúng ta loại bỏ hidden
lớp, lật display
từ none
mặc định của nó , block
. Sau đó, chúng tôi đặt độ mờ thành 0 để sẵn sàng mờ dần. Bây giờ chúng tôi đã thiết lập giai đoạn, chúng tôi bật lại chuyển tiếp, với.resumeTrnsn()
. Và cuối cùng, khởi động quá trình chuyển đổi bằng cách đặt độ mờ thành 1.
Không có thư viện, cả thay đổi để hiển thị và thay đổi độ mờ đục sẽ mang lại cho chúng tôi kết quả không mong muốn. Nếu chúng tôi chỉ đơn giản loại bỏ các cuộc gọi thư viện, chúng tôi sẽ không có chuyển đổi nào cả.
Lưu ý rằng ở trên không đặt hiển thị thành không hiển thị lại ở cuối hoạt hình mờ dần. Chúng tôi có thể nhận được fancier mặc dù. Chúng ta hãy làm như vậy với một cái mờ dần và tăng chiều cao từ 0.
Mến!
https://jsfiddle.net/b9chris/hweyecu4/22/
#box {
transition: height 1s, opacity 1s;
}
Bây giờ chúng ta đang chuyển đổi cả chiều cao và độ mờ. Lưu ý rằng chúng tôi không đặt chiều cao, có nghĩa là mặc định , auto
. Thông thường, điều này không thể được chuyển đổi - chuyển từ tự động sang giá trị pixel (như 0) sẽ giúp bạn không có chuyển đổi. Chúng tôi sẽ làm việc xung quanh đó với thư viện và một phương pháp thư viện nữa:
$.fn.wait = function (time, fn) {
if (time)
this.delay(time);
if (!fn)
return this;
var _this = this;
return this.queue(function (n) {
fn.call(_this);
n();
});
};
Đây là một phương thức tiện lợi cho phép chúng tôi tham gia vào hàng đợi fx / hoạt hình hiện có của jQuery mà không yêu cầu bất kỳ khung hoạt hình nào hiện bị loại trừ trong jQuery 3.x. Tôi sẽ không giải thích cách thức hoạt động của jQuery, nhưng đủ để nói, hệ thống .queue()
và .stop()
hệ thống ống nước mà jQuery cung cấp giúp chúng tôi ngăn chặn hoạt hình của chúng tôi bước lên nhau.
Hãy tạo hiệu ứng trượt xuống.
$('#button').on('click', function() {
var tag = $('#box');
if (tag.hasClass('hidden')) {
// Open it
// Measure it
tag.stop().noTrnsn().removeClass('hidden').css({
opacity: 0, height: 'auto'
});
var h = tag.height();
tag.css({ height: 0 }).resumeTrnsn()
// Animate it
.css({ opacity: 1, height: h })
.wait(1000, function() {
tag.css({ height: 'auto' });
});
} else {
// Close it
// Measure it
var h = tag.noTrnsn().height();
tag.stop().css({ height: h })
.resumeTrnsn()
// Animate it
.css({ opacity: 0, height: 0 })
.wait(1000, function() {
tag.addClass('hidden');
});
}
});
Mã này bắt đầu bằng cách kiểm tra #box
và liệu nó có bị ẩn hay không, bằng cách kiểm tra lớp của nó. Nhưng nó thực hiện được nhiều hơn bằng cách sử dụng lệnh wait()
gọi thư viện, bằng cách thêm hidden
lớp vào cuối hoạt hình trượt / mờ, mà bạn mong muốn tìm thấy nếu nó thực sự bị ẩn - điều mà ví dụ đơn giản ở trên không thể làm được. Điều này cũng xảy ra để cho phép hiển thị / ẩn phần tử nhiều lần, đây là một lỗi trong ví dụ trước, vì lớp ẩn không bao giờ được khôi phục.
Bạn cũng có thể thấy các thay đổi CSS và lớp được gọi sau .noTrnsn()
để đặt giai đoạn cho hoạt ảnh, bao gồm lấy số đo, như đo chiều cao cuối cùng #box
mà không hiển thị cho người dùng trước khi gọi.resumeTrnsn()
và tạo hiệu ứng cho nó từ thiết lập đầy đủ đó giai đoạn đến giá trị CSS mục tiêu của nó.
Câu trả lời cũ
https://jsfiddle.net/b9chris/hweyecu4/1/
Bạn có thể chuyển nó khi nhấp bằng:
function toggleTransition() {
var el = $("div.box1");
if (el.length) {
el[0].className = "box";
el.stop().css({maxWidth: 10000}).animate({maxWidth: 10001}, 2000, function() {
el[0].className = "box hidden";
});
} else {
el = $("div.box");
el[0].className = "box";
el.stop().css({maxWidth: 10001}).animate({maxWidth: 10000}, 50, function() {
el[0].className = "box box1";
});
}
return el;
}
someTag.click(toggleTransition);
CSS là những gì bạn đoán:
.hidden {
display: none;
}
.box {
width: 100px;
height: 100px;
background-color: blue;
color: yellow;
font-size: 18px;
left: 20px;
top: 20px;
position: absolute;
-webkit-transform-origin: 0 50%;
transform-origin: 0 50%;
-webkit-transform: scale(.2);
transform: scale(.2);
-webkit-transition: transform 2s;
transition: transform 2s;
}
.box1{
-webkit-transform: scale(1);
transform: scale(1);
}
Điều quan trọng là điều chỉnh thuộc tính hiển thị. Bằng cách loại bỏ lớp ẩn và sau đó đợi 50 ms, sau đó bắt đầu quá trình chuyển đổi qua lớp được thêm vào, chúng ta sẽ làm cho nó xuất hiện và sau đó mở rộng như chúng ta muốn, thay vì nó chỉ hiển thị trên màn hình mà không có bất kỳ hình ảnh động nào. Tương tự xảy ra theo cách khác, ngoại trừ chúng ta đợi cho đến khi hoạt hình kết thúc trước khi áp dụng ẩn.
Lưu ý: Tôi đang lạm dụng .animate(maxWidth)
ở đây để tránh các setTimeout
điều kiện chủng tộc. setTimeout
là nhanh chóng để giới thiệu các lỗi ẩn khi bạn hoặc người khác nhặt mã mà không biết về nó. .animate()
có thể dễ dàng bị giết với .stop()
. Tôi chỉ đang sử dụng nó để đặt độ trễ 50 ms hoặc 2000 ms trên hàng đợi fx tiêu chuẩn nơi dễ dàng tìm thấy / giải quyết bởi các lập trình viên khác đang xây dựng trên đầu này.