document.addEventListener("shopify:section:load", function (section) {
    initSlider(section.target);
    checkImagesLazyLoaded();
  });
  document.addEventListener("shopify:section:reorder", function (section) {
    initSlider(section.target);
    checkImagesLazyLoaded();
  });
  1. shopify:section:load 事件:当某个部分(section)加载完成时,会执行传入的回调函数。在回调函数中,调用 initSlider 函数并传入加载的部分的目标元素,同时调用 checkImagesLazyLoaded 函数。

  2. shopify:section:reorder 事件:当某个部分(section)重新排序时,执行相同的回调操作。

  • shopify:block:select:当一个块被选中时触发。
  • shopify:block:deselect:当一个块取消选中时触发。
  • shopify:product:select:当选择一个产品时触发。
  • shopify:cart:update:当购物车内容更新时触发。

Iconfinder (iconfinder.com)

  • 提供免费和付费图标,用户可以下载SVG格式并进行自定义,图标风格多样。

SVGRepo (svgrepo.com)

  • 提供大量免费SVG图标,用户可以直接下载并使用,支持颜色和大小的自定义。

Flexbox 布局练习网站
Flexbox Froggy

网站地址:Flexbox Froggy
这是一个通过游戏的方式学习Flexbox的站点。玩家需要帮助青蛙通过正确的Flexbox属性定位到相应的荷叶上。
Flexbox Defense

网站地址:Flexbox Defense
这是一款塔防游戏,通过使用Flexbox属性来放置防御塔,以此学习和练习Flexbox的布局技巧。
Flexbox Zombies

网站地址:Flexbox Zombies
这款游戏结合了学习Flexbox和对抗僵尸,通过完成关卡任务,玩家可以深入理解Flexbox的各种属性和使用场景。
Grid 布局练习网站
Grid Garden

网站地址:Grid Garden
这是一个通过游戏的方式学习CSS Grid布局的站点。玩家需要通过种植胡萝卜和浇水来完成关卡任务,同时学习Grid布局的基本属性和用法。
CSS Grid Attack

网站地址:CSS Grid Attack
这是一款结合了RPG元素的小游戏,通过解决各种CSS Grid布局问题来打败怪物,提升玩家的Grid布局技能。
其他资源
CSS Tricks: A Complete Guide to Flexbox

网站地址:A Complete Guide to Flexbox
详细介绍了Flexbox的所有属性及其用法,并附有示例和图解,适合做进一步学习和参考。
CSS Tricks: A Complete Guide to Grid

网站地址:A Complete Guide to Grid
详细介绍了CSS Grid布局的所有属性及其用法,并附有示例和图解,适合做进一步学习和参考。

currentScript 属性是 JavaScript 中 document 对象的一个属性,它返回正在执行的 <script> 元素。这个属性对于动态加载脚本或在脚本内部引用脚本元素本身时非常有用。

应用场景

动态加载脚本:

  • 可以在动态加载的脚本中获取脚本元素本身的属性(如 src、data-* 等),以便进行进一步的逻辑处理。

    模块化脚本:

  • 在模块化脚本中,可以根据脚本元素上的自定义属性来决定脚本的行为。

调试和日志记录:

  • 在大型项目中,特别是加载多个脚本时,可以通过 currentScript 获取当前执行的脚本,帮助调试和日志记录。

 样式和内容注入:

  • 可以在脚本执行时,动态地将样式或内容注入到页面的特定位置,基于脚本标签的位置或属性。

假设有一个动态加载的脚本,它根据 data-theme 属性来设置页面的主题样式。

    <h1 id="title">Hello World!</h1>
    <script src="theme-loader.js" data-theme="dark"></script>
// 获取当前执行的脚本元素
const script = document.currentScript;

// 从脚本元素中获取 data-theme 属性的值
const theme = script.getAttribute("data-theme");

// 定义主题样式
const themes = {
  dark: {
    backgroundColor: "#333",
    color: "#fff",
  },
  light: {
    backgroundColor: "#fff",
    color: "#000",
  },
};

// 应用主题样式
const applyTheme = (themeName) => {
  const themeStyles = themes[themeName];
  if (themeStyles) {
    document.body.style.backgroundColor = themeStyles.backgroundColor;
    document.body.style.color = themeStyles.color;
  } else {
    console.warn(`Theme "${themeName}" is not defined.`);
  }
};

// 调用函数应用主题
applyTheme(theme);

event.target 属性可以用来实现事件委托 (event delegation)。

Event 接口的 target 只读属性是对事件分派到的对象的引用。当事件处理器在事件的冒泡或捕获阶段被调用时,它与 event.currentTarget 不同。

// Make a list
var ul = document.createElement("ul");
document.body.appendChild(ul);

var li1 = document.createElement("li");
var li2 = document.createElement("li");
ul.appendChild(li1);
ul.appendChild(li2);

function hide(e) {
  // e.target 引用着 <li> 元素
  // 不像 e.currentTarget 引用着其父级的 <ul> 元素。
  e.target.style.visibility = "hidden";
}

// 添加监听事件到列表,当每个 <li> 被点击的时候都会触发。
ul.addEventListener("click", hide, false);

Element.closest() 方法用来获取:匹配特定选择器且离当前元素最近的祖先元素(也可以是当前元素本身)。如果匹配不到,则返回 null。

<article>
  <div id="div-01">
    Here is div-01
    <div id="div-02">
      Here is div-02
      <div id="div-03">Here is div-03</div>
    </div>
  </div>
</article>
var el = document.getElementById("div-03");

var r1 = el.closest("#div-02");
// 返回 id 为 div-02 的那个元素

var r2 = el.closest("div div");
// 返回最近的拥有 div 祖先元素的 div 祖先元素,这里的话就是 div-03 元素本身

var r3 = el.closest("article > div");
// 返回最近的拥有父元素 article 的 div 祖先元素,这里的话就是 div-01

var r4 = el.closest(":not(div)");
// 返回最近的非 div 的祖先元素,这里的话就是最外层的 article