{"product_id":"springback-surface-mount-sign-stand","title":"8PCS SpringBack Surface Mount Sign Stand – Impact-Resistant Parking \u0026 Traffic Sign Holder","description":"\u003cp\u003e\u003cspan\u003eA spring-back surface mount sign stand built for high-traffic parking lots, driveways, and pedestrian areas. The flexible base bends on impact and springs back upright, helping your signage stay visible with less maintenance.\u003c\/span\u003e\u003c\/p\u003e\n\n\u003cstyle\u003e\n.video-wrap {\n  display: flex;\n  gap: 24px;\n  flex-wrap: wrap;\n  align-items: flex-start;\n  font-family: Arial, sans-serif;\n  max-width: 1200px;\n  margin: 0 auto;\n}\n\n\/* ===== 主播放器 ===== *\/\n.video-player {\n  flex: 2;\n  min-width: 320px;\n  background: #000;\n  border-radius: 16px;\n  overflow: hidden;\n  box-shadow: 0 10px 30px rgba(0,0,0,0.25);\n  position: relative;\n}\n\n#player {\n  width: 100%;\n  height: 520px;\n}\n\n\/* ===== 控制按钮 ===== *\/\n.controls {\n  position: absolute;\n  bottom: 12px;\n  left: 12px;\n  display: flex;\n  gap: 10px;\n  z-index: 10;\n}\n\n.controls button {\n  background: rgba(0,0,0,0.6);\n  color: #fff;\n  border: 1px solid rgba(255,255,255,0.2);\n  padding: 8px 12px;\n  border-radius: 8px;\n  cursor: pointer;\n  font-size: 14px;\n}\n\n\/* ===== 视频列表 ===== *\/\n.video-list {\n  flex: 1;\n  min-width: 280px;\n  background: #111;\n  border-radius: 16px;\n  padding: 12px;\n\n  display: flex;\n  flex-direction: row;\n  overflow-x: auto;\n  gap: 10px;\n}\n\n.video-item {\n  flex: 0 0 auto;\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  padding: 10px;\n  cursor: pointer;\n  border-radius: 12px;\n  transition: 0.25s;\n  background: #1c1c1c;\n  border: 1px solid transparent;\n  min-width: 160px;\n}\n\n.video-item:hover {\n  transform: translateY(-2px);\n  background: #2a2a2a;\n}\n\n.video-item.active {\n  border: 1px solid #ff3b3b;\n  background: #222;\n}\n\n.video-item img {\n  width: 100%;\n  height: 90px;\n  object-fit: cover;\n  border-radius: 8px;\n}\n\n.video-title {\n  font-size: 14px;\n  color: #fff;\n  line-height: 1.4;\n  text-align: center;\n}\n\n\/* =========================\n   📱 手机端优化\n========================= *\/\n@media (max-width: 768px) {\n\n  .video-wrap {\n    flex-direction: column;\n    gap: 10px;\n  }\n\n  .video-player {\n    width: 100vw;\n    margin-left: -16px;\n    border-radius: 0;\n  }\n\n  #player {\n    width: 100vw;\n    height: calc(100vw * 9 \/ 16);\n  }\n\n  .controls {\n    display: none;\n  }\n\n  \/* 手机端横向滑动列表，隐藏滚动条 *\/\n  .video-list {\n    flex-direction: row;\n    overflow-x: auto;\n    gap: 10px;\n    padding: 10px;\n    scrollbar-width: none;\n  }\n\n  .video-list::-webkit-scrollbar {\n    display: none;\n  }\n\n  .video-item {\n    min-width: 160px;\n  }\n\n  .video-item img {\n    height: 120px;\n  }\n\n  .video-title {\n    font-size: 13px;\n  }\n}\n\u003c\/style\u003e\n\u003cdiv class=\"responsive-table-wrap\"\u003e\n\u003cdiv class=\"video-wrap\"\u003e\n\u003c!-- 主播放器 --\u003e\n\u003cdiv class=\"video-player\"\u003e\n\u003cdiv id=\"player\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"controls\"\u003e\n\u003cbutton id=\"prevBtn\"\u003e⟵ Prev\u003c\/button\u003e \u003cbutton id=\"nextBtn\"\u003eNext ⟶\u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- 视频列表 --\u003e\n\u003cdiv class=\"video-list\"\u003e\n\u003cdiv class=\"video-item active\"\u003e\n\u003cimg src=\"https:\/\/img.youtube.com\/vi\/WEeHxqmIeko\/hqdefault.jpg\" alt=\"Short Video 1\"\u003e\n\u003cdiv class=\"video-title\"\u003eShort Video\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"video-item\"\u003e\n\u003cimg src=\"https:\/\/img.youtube.com\/vi\/MkaMYACxQ3A\/hqdefault.jpg\" alt=\"Short Video 2\"\u003e\n\u003cdiv class=\"video-title\"\u003e3D Installation Video\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cscript src=\"https:\/\/www.youtube.com\/iframe_api\"\u003e\u003c\/script\u003e \u003cscript\u003e\n\nconst videos = [\n  \"WEeHxqmIeko\",\n  \"MkaMYACxQ3A\"\n];\n\nlet player;\nlet currentIndex = 0;\nlet isReady = false;\n\n\n\/* ===== 初始化播放器 ===== *\/\nfunction onYouTubeIframeAPIReady() {\n\n  player = new YT.Player('player', {\n\n    videoId: videos[0],\n\n    playerVars: {\n\n      \/* 关闭自动播放 *\/\n      autoplay: 0,\n\n      \/* 保留YouTube播放控制 *\/\n      controls: 1,\n\n      rel: 0,\n\n      playsinline: 1\n\n    },\n\n    events: {\n\n      onReady: () =\u003e {\n        isReady = true;\n      },\n\n      onStateChange: onPlayerStateChange\n\n    }\n\n  });\n\n}\n\n\n\/* ===== 视频播放完成 ===== *\/\nfunction onPlayerStateChange(event) {\n\n  if (event.data === YT.PlayerState.ENDED) {\n    nextVideo();\n  }\n\n}\n\n\n\/* ===== 点击缩略图播放 ===== *\/\nfunction playVideo(index) {\n\n  if (!player || !isReady) return;\n\n  if (isNaN(index)) return;\n\n  currentIndex = index;\n\n  player.loadVideoById(videos[index]);\n\n  updateActive();\n\n}\n\n\n\/* ===== 下一条 ===== *\/\nfunction nextVideo() {\n\n  if (!player || !isReady) return;\n\n  currentIndex =\n    (currentIndex + 1) % videos.length;\n\n  player.loadVideoById(\n    videos[currentIndex]\n  );\n\n  updateActive();\n\n}\n\n\n\/* ===== 上一条 ===== *\/\nfunction prevVideo() {\n\n  if (!player || !isReady) return;\n\n  currentIndex =\n    (currentIndex - 1 + videos.length)\n    % videos.length;\n\n  player.loadVideoById(\n    videos[currentIndex]\n  );\n\n  updateActive();\n\n}\n\n\n\/* ===== 更新当前视频高亮 ===== *\/\nfunction updateActive() {\n\n  document\n    .querySelectorAll(\".video-item\")\n    .forEach((el, i) =\u003e {\n\n      el.classList.toggle(\n        \"active\",\n        i === currentIndex\n      );\n\n    });\n\n}\n\n\n\/* ===== 页面加载完成 ===== *\/\ndocument.addEventListener(\n  \"DOMContentLoaded\",\n  function () {\n\n    document\n      .getElementById(\"nextBtn\")\n      .addEventListener(\n        \"click\",\n        nextVideo\n      );\n\n    document\n      .getElementById(\"prevBtn\")\n      .addEventListener(\n        \"click\",\n        prevVideo\n      );\n\n    document\n      .querySelectorAll(\".video-item\")\n      .forEach((item) =\u003e {\n\n        item.addEventListener(\n          \"click\",\n          function () {\n\n            playVideo(\n              parseInt(\n                this.dataset.index,\n                10\n              )\n            );\n\n          }\n        );\n\n      });\n\n  }\n);\n\n\u003c\/script\u003e\n\u003c\/div\u003e","brand":"OranLite","offers":[{"title":"Default Title","offer_id":68002544517424,"sku":"DH-RP-S3X8","price":107.26,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0839\/3690\/3472\/files\/DH-RP-S3X8-01.jpg?v=1791788475","url":"https:\/\/www.oranlite.com\/products\/springback-surface-mount-sign-stand","provider":"OranLite","version":"1.0","type":"link"}