accordion animation
parent
758fdeacf6
commit
1e7f887c06
|
@ -59,7 +59,7 @@
|
|||
endcapture
|
||||
%}
|
||||
|
||||
console.log("1", "{{ settings.color_schemes["scheme-shx-texte-navbar"]["settings"]["background"] }}", {{ shx_current_page }})
|
||||
console.log("2", "{{ settings.color_schemes["scheme-shx-texte-navbar"]["settings"]["background"] }}", {{ shx_current_page }})
|
||||
|
||||
</script>
|
||||
|
||||
|
|
|
@ -107,90 +107,90 @@
|
|||
</div>
|
||||
|
||||
<script>
|
||||
class Accordion {
|
||||
constructor(el) {
|
||||
// Store the <details> element
|
||||
this.el = el;
|
||||
// Store the <summary> element
|
||||
this.summary = el.querySelector('summary');
|
||||
// Store the <div class="content"> element
|
||||
this.content = el.querySelector('.accordion__content');
|
||||
|
||||
// Store the animation object (so we can cancel it if needed)
|
||||
this.animation = null;
|
||||
// Store if the element is closing
|
||||
this.isClosing = false;
|
||||
// Store if the element is expanding
|
||||
this.isExpanding = false;
|
||||
// Detect user clicks on the summary element
|
||||
this.summary.addEventListener('click', (e) => this.onClick(e));
|
||||
class Accordion {
|
||||
constructor(el) {
|
||||
// Store the <details> element
|
||||
this.el = el;
|
||||
// Store the <summary> element
|
||||
this.summary = el.querySelector('summary');
|
||||
// Store the <div class="content"> element
|
||||
this.content = el.querySelector('.accordion__content');
|
||||
|
||||
// Store the animation object (so we can cancel it if needed)
|
||||
this.animation = null;
|
||||
// Store if the element is closing
|
||||
this.isClosing = false;
|
||||
// Store if the element is expanding
|
||||
this.isExpanding = false;
|
||||
// Detect user clicks on the summary element
|
||||
this.summary.addEventListener('click', (e) => this.onClick(e));
|
||||
}
|
||||
|
||||
onClick(e) {
|
||||
// Stop default behaviour from the browser
|
||||
e.preventDefault();
|
||||
// Add an overflow on the <details> to avoid content overflowing
|
||||
this.el.style.overflow = 'hidden';
|
||||
// Check if the element is being closed or is already closed
|
||||
if (this.isClosing || !this.el.open) {
|
||||
this.open();
|
||||
// Check if the element is being openned or is already open
|
||||
} else if (this.isExpanding || this.el.open) {
|
||||
this.shrink();
|
||||
}
|
||||
}
|
||||
|
||||
onClick(e) {
|
||||
// Stop default behaviour from the browser
|
||||
e.preventDefault();
|
||||
// Add an overflow on the <details> to avoid content overflowing
|
||||
this.el.style.overflow = 'hidden';
|
||||
// Check if the element is being closed or is already closed
|
||||
if (this.isClosing || !this.el.open) {
|
||||
this.open();
|
||||
// Check if the element is being openned or is already open
|
||||
} else if (this.isExpanding || this.el.open) {
|
||||
this.shrink();
|
||||
}
|
||||
}
|
||||
shrink() {
|
||||
// Set the element as "being closed"
|
||||
this.isClosing = true;
|
||||
|
||||
shrink() {
|
||||
// Set the element as "being closed"
|
||||
this.isClosing = true;
|
||||
|
||||
// Store the current height of the element
|
||||
const startHeight = `${this.el.offsetHeight}px`;
|
||||
// Calculate the height of the summary
|
||||
const endHeight = `${this.summary.offsetHeight}px`;
|
||||
|
||||
// If there is already an animation running
|
||||
if (this.animation) {
|
||||
// Cancel the current animation
|
||||
this.animation.cancel();
|
||||
}
|
||||
// Store the current height of the element
|
||||
const startHeight = `${this.el.offsetHeight}px`;
|
||||
// Calculate the height of the summary
|
||||
const endHeight = `${this.summary.offsetHeight}px`;
|
||||
|
||||
// Start a WAAPI animation
|
||||
this.animation = this.el.animate({
|
||||
// Set the keyframes from the startHeight to endHeight
|
||||
height: [startHeight, endHeight]
|
||||
}, {
|
||||
duration: 200,
|
||||
easing: 'linear'
|
||||
});
|
||||
// If there is already an animation running
|
||||
if (this.animation) {
|
||||
// Cancel the current animation
|
||||
this.animation.cancel();
|
||||
}
|
||||
|
||||
// When the animation is complete, call onAnimationFinish()
|
||||
this.animation.onfinish = () => this.onAnimationFinish(false);
|
||||
// If the animation is cancelled, isClosing variable is set to false
|
||||
this.animation.oncancel = () => this.isClosing = false;
|
||||
}
|
||||
// Start a WAAPI animation
|
||||
this.animation = this.el.animate({
|
||||
// Set the keyframes from the startHeight to endHeight
|
||||
height: [startHeight, endHeight]
|
||||
}, {
|
||||
duration: 200,
|
||||
easing: 'linear'
|
||||
});
|
||||
|
||||
// When the animation is complete, call onAnimationFinish()
|
||||
this.animation.onfinish = () => this.onAnimationFinish(false);
|
||||
// If the animation is cancelled, isClosing variable is set to false
|
||||
this.animation.oncancel = () => this.isClosing = false;
|
||||
}
|
||||
|
||||
open() {
|
||||
// Apply a fixed height on the element
|
||||
this.el.style.height = `${this.el.offsetHeight}px`;
|
||||
// Force the [open] attribute on the details element
|
||||
this.el.open = true;
|
||||
// Wait for the next frame to call the expand function
|
||||
window.requestAnimationFrame(() => this.expand());
|
||||
}
|
||||
|
||||
open() {
|
||||
// Apply a fixed height on the element
|
||||
this.el.style.height = `${this.el.offsetHeight}px`;
|
||||
// Force the [open] attribute on the details element
|
||||
this.el.open = true;
|
||||
// Wait for the next frame to call the expand function
|
||||
window.requestAnimationFrame(() => this.expand());
|
||||
}
|
||||
expand() {
|
||||
// Set the element as "being expanding"
|
||||
this.isExpanding = true;
|
||||
// Get the current fixed height of the element
|
||||
const startHeight = `${this.el.offsetHeight}px`;
|
||||
// Calculate the open height of the element (summary height + content height)
|
||||
const endHeight = `${this.summary.offsetHeight + this.content.offsetHeight}px`;
|
||||
|
||||
expand() {
|
||||
// Set the element as "being expanding"
|
||||
this.isExpanding = true;
|
||||
// Get the current fixed height of the element
|
||||
const startHeight = `${this.el.offsetHeight}px`;
|
||||
// Calculate the open height of the element (summary height + content height)
|
||||
const endHeight = `${this.summary.offsetHeight + this.content.offsetHeight}px`;
|
||||
|
||||
// If there is already an animation running
|
||||
if (this.animation) {
|
||||
// Cancel the current animation
|
||||
this.animation.cancel();
|
||||
// If there is already an animation running
|
||||
if (this.animation) {
|
||||
// Cancel the current animation
|
||||
this.animation.cancel();
|
||||
}
|
||||
|
||||
// Start a WAAPI animation
|
||||
|
@ -217,13 +217,13 @@
|
|||
this.isExpanding = false;
|
||||
// Remove the overflow hidden and the fixed height
|
||||
this.el.style.height = this.el.style.overflow = '';
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('details').forEach((el) => {
|
||||
new Accordion(el);
|
||||
});
|
||||
</script>
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelectorAll('details').forEach((el) => {
|
||||
new Accordion(el);
|
||||
});
|
||||
</script>
|
||||
|
||||
{% schema %}
|
||||
{
|
||||
|
|
|
@ -65,6 +65,8 @@
|
|||
>
|
||||
{%- endif -%}
|
||||
|
||||
{% render "shx-product-page-shopping-cart-quick-add" %}
|
||||
|
||||
{% assign variant_images = product.images | where: 'attached_to_variant?', true | map: 'src' %}
|
||||
<div class="page-width">
|
||||
<div class="product product--{{ section.settings.media_size }} product--{{ section.settings.media_position }} product--{{ section.settings.gallery_layout }} product--mobile-{{ section.settings.mobile_thumbnails }} grid grid--1-col {% if product.media.size > 0 %}grid--2-col-tablet{% else %}product--no-media{% endif %}">
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
<button id="scrollToCartButton" class="scroll-to-cart-button" onclick="document.getElementById('AddToCartForm').scrollIntoView();">
|
||||
In den Warenkorb
|
||||
</button>
|
||||
|
||||
<style>
|
||||
.scroll-to-cart-button {
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
right: 20px;
|
||||
display: none;
|
||||
background-color: #ff6600;
|
||||
color: white;
|
||||
border: none;
|
||||
padding: 10px 20px;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<script>
|
||||
document.addEventListener('scroll', function() {
|
||||
var scrollButton = document.getElementById('scrollToCartButton');
|
||||
if (window.scrollY > 300) { // Zeigt den Button an, wenn mehr als 300px gescrollt wird
|
||||
scrollButton.style.display = 'block';
|
||||
} else {
|
||||
scrollButton.style.display = 'none';
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
Loading…
Reference in New Issue