shopify开发常见模块功能一:网站活动倒计时

shopify开发常用场景一:倒计时

常用场景代码提取,使得在shopify页面共用倒计时,且互不干扰,欢迎大家补充指正!

1.DOM结构
js 复制代码
<div class="countdown__block">
    <div
        class="countdown__timer flex text-center"
        data-year="{{ section.settings.timer_years }}"
        data-month="{{ section.settings.timer_months }}"
        data-day="{{ section.settings.timer_days }}"
        data-hour="{{ section.settings.timer_hours }}"
        data-minute="{{ section.settings.timer_minutes }}"
        >
        <div class="countdown__item" id="days">
          <p class="h5">00</p>
          <span class="text-xs">DAYS</span>
        </div>
        <div class="countdown__item" id="hours">
          <p class="h5">00</p>
          <span class="text-xs">HRS</span>
        </div>
        <div class="countdown__item" id="minutes">
          <p class="h5">00</p>
          <span class="text-xs">MIN</span>
        </div>
        <div class="countdown__item" id="seconds">
          <p class="h5">00</p>
          <span class="text-xs">SEC</span>
        </div>
    </div>
</div>
2.1 css样式可以自定义-参考
js 复制代码
  .countdown__block { 
      padding: 10px;
      width: 100%;
      grid-template-columns: 1fr;

      {% if block.settings.show_border %}
      border: 1px solid #d3d3d3;
      {% endif %}

      {% if block.settings.background != blank %}
      background: {{ block.settings.background }};
      {% endif %}

      {% if block.settings.background_gradient != blank %}
      background: {{ block.settings.background_gradient }};
      {% endif %}

      {% if block.settings.text_color != blank %}
      color: {{ block.settings.text_color }};
      {% endif %}
  }

  .countdown__block > .countdown__header {
      gap: 10px;
      justify-content: center;
  }

  .countdown__block > .countdown__header .text,
  .countdown__block > .countdown__header p,
  .countdown__block > .countdown__header span {
      line-height: 1;
      margin-block-start: 0;
  }

  .countdown__block > .countdown__timer { 
      display: flex;
      justify-content: center;
      align-items: center; 
  }

  @media (min-width: 1100px) {
      .countdown__block {
          grid-template-columns: 1fr 2fr;
      }
  }

  @media (min-width: 900px) {
      .countdown__block{ 
        gap: 4%;
        padding: 20px 10px;
      }
      .countdown__block > .countdown__timer {
          gap: 4px;
      }

      .countdown__block > .countdown__header {
          justify-content: flex-start;
      }

      .countdown__block > .countdown__timer {
          margin-top: 10px; 
          gap: 10px;
      }
  }

  .icon-countdown {
      width: 40px;
      height: 40px;
  }

  @media (min-width: 800px) {
      .icon-countdown {
          width: 55px;
          height: 55px;
      }
  }

  .countdown__item {
      margin: 0 5px;
      text-align: center;
      position: relative;

      {% if block.settings.time_background_color != blank %}
      background: {{ block.settings.time_background_color }};
      {% endif %}

      {% if block.settings.time_text_color != blank %}
      color: {{ block.settings.time_text_color }};
      {% endif %} 
      
      min-width: 60px;
      padding: 6px;
      border-radius: 12px;
      line-height: 1rem;
  }
  @media (min-width: 800px) {
      .countdown__item {
        min-width: 66px;
        padding: 8px 6px;
      }
  }

  .countdown__item > p {
      margin: 0;
      line-height: 1;
  }

  .countdown__item > span {
      opacity: 0.8;
  } 
2.2 抽离的js
js 复制代码
function startCountdown(timerElement) {
    let targetYear = timerElement.dataset.year;
    let targetMonth = timerElement.dataset.month - 1; // 月份从0开始
    let targetDay = timerElement.dataset.day;
    let targetHour = timerElement.dataset.hour;
    let targetMinute = timerElement.dataset.minute;

    let targetTime = new Date(
        targetYear,
        targetMonth,
        targetDay,
        targetHour,
        targetMinute
    ).getTime();

    function formatNumber(num) {
        return num < 10 ? '0' + num : num;
    }

    function updateCountdown() {
        let now = new Date().getTime();
        let distance = targetTime - now;

        let days = Math.floor(distance / (1000 * 60 * 60 * 24));
        let hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
        let minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
        let seconds = Math.floor((distance % (1000 * 60)) / 1000);

        // 更新子元素的内容
        timerElement.querySelector("#days p").textContent = formatNumber(days);
        timerElement.querySelector("#hours p").textContent = formatNumber(hours);
        timerElement.querySelector("#minutes p").textContent = formatNumber(minutes);
        timerElement.querySelector("#seconds p").textContent = formatNumber(seconds);

        // 倒计时结束后清除
        if (distance < 0) {
            clearInterval(interval);
            timerElement.parentElement.style.display = "none"; // 隐藏父级元素
        }
    }

    let interval = setInterval(updateCountdown, 1000);
    updateCountdown();
}

// 启动倒计时的函数
function initializeCountdowns() {
    const countdownTimers = document.querySelectorAll(".countdown__timer");
    countdownTimers.forEach(timer => {
        startCountdown(timer); // 启动倒计时
    });
}

// 页面加载完成后初始化倒计时
document.addEventListener("DOMContentLoaded", initializeCountdowns);
3.在theme.liquid文件引入

<script src="{{ 'custom-countdown.js'| asset_url }}" defer="defer"></script>

相关推荐
海盗强24 分钟前
Vue 3 常见的通信方式
javascript·vue.js·ecmascript
oscar9991 小时前
JavaScript与TypeScript
开发语言·javascript·typescript
橘子味的冰淇淋~1 小时前
【解决】Vue + Vite + TS 配置路径别名成功仍爆红
前端·javascript·vue.js
leluckys2 小时前
flutter 专题 六十三 Flutter入门与实战作者:xiangzhihong8Fluter 应用调试
前端·javascript·flutter
shoa_top3 小时前
JavaScript 数组方法总结
javascript
鱼樱前端3 小时前
让人头痛的原型和原型链知识
前端·javascript
lianghj3 小时前
前端高手必备:深度解析高频场景解决方案与性能优化实战
前端·javascript·面试
OpenIM3 小时前
Electron Demo 的快速编译与启动
前端·javascript·electron
拿我格子衫来3 小时前
图形编辑器基于Paper.js教程27:对图像描摹的功能实现,以及参数调整
开发语言·前端·javascript·图像处理·编辑器·图形渲染
末日的狂欢姐4 小时前
AXUI - 极致原生体验的零依赖的国产 Web UI 框架,欢迎体验和共建!
javascript·前端框架·vue·网站建设·ui设计