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>

相关推荐
我有一棵树25 分钟前
Vue 项目中全局样式的正确写法:不要把字体和主题写在 #app 上
前端·javascript·vue.js
龙仔CLL1 小时前
微前端乾坤vue3项目使用tinymce,通过npm,yarn,pnpm包安装成功,但是引用报错无法使用
javascript·arcgis·npm
Mountain082 小时前
解决 Node.js 启动报错:digital envelope routines 错误全记录
javascript·npm·node.js
wangbing11253 小时前
开发指南139-VUE里的高级糖块
前端·javascript·vue.js
半桶水专家4 小时前
Vue 3 动态组件详解
前端·javascript·vue.js
我有一棵树4 小时前
避免 JS 报错阻塞 Vue 组件渲染:以 window.jsbridge 和 el-tooltip 为例
前端·javascript·vue.js
没有鸡汤吃不下饭4 小时前
解决前端项目中大数据复杂列表场景的完美方案
前端·javascript·vue.js
Tzarevich5 小时前
现代JavaScript字符串处理:从基础语法到模板字符串的深度演进与技术实践
javascript
低保和光头哪个先来6 小时前
如何实现弹窗的 双击关闭 & 拖动 & 图层优先级
前端·javascript·css·vue.js
阿豪啊7 小时前
Prisma ORM 入门指南:从零开始的全栈技能学习之旅
javascript·后端·node.js