1.背景

很多做shopify独立站运营的同学可能想在产品详情页展示自己的折扣券信息,并且让客户可以一键复制折扣码,但大部分模板并没有直接实现这个功能。今天我就带各位一起来手搓一个漂亮的折扣券展示功能。

2.效果图

3.注意事项

  • 可以在theme.liquid中引入font-awesome字体图标
  • 产品的折扣信息需要在shopify后台添加一个产品自定义字段
  • 折扣码填写内容示例: 折扣码说明1:折扣码1 折扣码说明2:折扣码2

4.自定义css

.jerry-coupon-box{width: 100%;display: block;margin-bottom: 0.5rem;}
.jerry-coupon-inner-box{width: 100%;list-style: none;display: flex;flex-direction: column;padding: 0 !important;margin: 0 !important;}
.jerry-coupon-inner-box li.coupon-item{margin-top: 0.5rem;display: flex;justify-content: space-between;align-items: center;background: rgba(54,172,169,0.5);padding: 1.2rem;border-radius: 0.3rem;}
.jerry-coupon-inner-box li.coupon-item .coupon-desc-box{color: #36aca9;display: flex;align-items: center;}
.jerry-coupon-inner-box li.coupon-item .coupon-desc-box .icon{font-size: 1.5rem;}
.jerry-coupon-inner-box li.coupon-item .coupon-desc-box .coupon-desc-text{margin-left: 0.5rem;}

.jerry-coupon-inner-box li.coupon-item .coupon-copy{cursor: pointer;display: flex;align-items: center;padding: 1rem;border-radius: 2rem;border: 2px solid #ddd;}
.jerry-coupon-inner-box li.coupon-item .coupon-copy:hover{border-color: #b3bac3;}
.jerry-coupon-inner-box li.coupon-item .coupon-copy .code{color: black;font-weight: bold;}
.jerry-coupon-inner-box li.coupon-item .coupon-copy .icon{margin: 0 1rem;font-size: 1.5rem;}
.jerry-coupon-inner-box li.coupon-item .coupon-copy .copy-tip{font-size: 0.8rem;color: gray;width: 75px;text-align: center;}

5.自定义js

$(function(){
  //显示折扣码到页面
  showCoupon()
})
//显示折扣码到页面
function showCoupon(){
  //这里的数据是从后端读取出来的,格式为【描述:折扣码】,多个折扣码用回车换行隔开
  //let couponStr=$('.jerry-coupon-box .discountInfoIpt').val()
  let couponStr=`$20 OFF Coupon Code:123456
  $30 OFF Coupon Code:654123`
  let couponArr=parseCouponStr(couponStr)
  if(!couponArr){
	  return
  }
  let couponHtml=createDomForCoupon(couponArr)
  $('.jerry-coupon-inner-box').html(couponHtml)
}
//通过折扣码信息生成html
function createDomForCoupon(couponArr){
  let dom=""
  couponArr.forEach((coupon, index) => {
	dom+='<li class="coupon-item">'+
			  '<div class="coupon-desc-box">'+
				  '<i class="icon fa fa-solid fa-tags"></i>'+
				  '<span class="coupon-desc-text">'+ coupon.desc +'</span>'+
			  '</div>'+
			  '<div class="coupon-copy" onclick="copyCode(event)">'+
				  '<span class="code">' + coupon.code + '</span>'+
				  '<i class="icon fa fa-solid fa-copy"></i>'+
				  '<span class="copy-tip" data-code="' + coupon.code + '">COPY CODE</span>'+
			  '</div>'+
		  '</li>\r\n'
  })
  return dom
}
//解析折扣码信息
function parseCouponStr(couponStr){
let couponArr=[]
// 根据换行或者回车进行识别
let couponLineList = couponStr.split(/[(\r\n)\r\n]+/)
couponLineList.forEach((couponLine, index) => {
	//解析单个折扣码
	if (couponLine) {
		let tmp=couponLine.split(":");
		if(tmp[0] && tmp[1] ){
			let coupon={"desc":tmp[0],"code":tmp[1]}
			couponArr.push(coupon)
		}
	}
})
return couponArr
}
//复制指定字符串到剪贴板
function copyToClipboard(str) {
  let el = document.createElement("textarea");
  el.value = str;
  el.setAttribute("readonly", "");
  el.style.position = "absolute";
  el.style.left = "-9999px";
  document.body.appendChild(el);
  let selected =
	document.getSelection().rangeCount > 0
	  ? document.getSelection().getRangeAt(0)
	  : false;
  el.select();
  document.execCommand("copy");
  document.body.removeChild(el);
  if (selected) {
	document.getSelection().removeAllRanges();
	document.getSelection().addRange(selected);
  }
}
//复制折扣码
function copyCode(e) {
	let clickedElement = e.currentTarget
	console.log(clickedElement)
	var copyTipDom = clickedElement.querySelector('.copy-tip')
	copyToClipboard(copyTipDom.getAttribute("data-code"));
	copyTipDom.innerHTML = 'COPIED'
	setTimeout(function () {
	copyTipDom.innerText = "COPY CODE";
	}, 1000);
}

6.luquid模板

  • 注意:下面代码一般通过可视化编辑的方式增加在产品详情页右边区域
<div class="jerry-coupon-box">
	<input type="hidden" class="discountInfoIpt" value="{{ product.metafields.custom.discount_info }}"/>
	<ul class="jerry-coupon-inner-box">
	</ul>
</div>

7.完整代码

<!-- 注意如果没有引入jquery的话需要引入 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" type="text/css" media="all">
<style>
  .jerry-coupon-box{width: 100%;display: block;margin-bottom: 0.5rem;}
  .jerry-coupon-inner-box{width: 100%;list-style: none;display: flex;flex-direction: column;padding: 0 !important;margin: 0 !important;}
  .jerry-coupon-inner-box li.coupon-item{margin-top: 0.5rem;display: flex;justify-content: space-between;align-items: center;background: rgba(54,172,169,0.5);padding: 1.2rem;border-radius: 0.3rem;}
  .jerry-coupon-inner-box li.coupon-item .coupon-desc-box{color: #36aca9;display: flex;align-items: center;}
  .jerry-coupon-inner-box li.coupon-item .coupon-desc-box .icon{font-size: 1.5rem;}
  .jerry-coupon-inner-box li.coupon-item .coupon-desc-box .coupon-desc-text{margin-left: 0.5rem;}

  .jerry-coupon-inner-box li.coupon-item .coupon-copy{cursor: pointer;display: flex;align-items: center;padding: 1rem;border-radius: 2rem;border: 2px solid #ddd;}
  .jerry-coupon-inner-box li.coupon-item .coupon-copy:hover{border-color: #b3bac3;}
  .jerry-coupon-inner-box li.coupon-item .coupon-copy .code{color: black;font-weight: bold;}
  .jerry-coupon-inner-box li.coupon-item .coupon-copy .icon{margin: 0 1rem;font-size: 1.5rem;}
  .jerry-coupon-inner-box li.coupon-item .coupon-copy .copy-tip{font-size: 0.8rem;color: gray;width: 75px;text-align: center;}
</style>
<div class="jerry-coupon-box">
	<input type="hidden" class="discountInfoIpt" value="{{ product.metafields.custom.discount_info }}"/>
	<ul class="jerry-coupon-inner-box">
	</ul>
</div>
<script>
  $(function(){
	  //显示折扣码到页面
	  showCoupon()
  })
  //显示折扣码到页面
  function showCoupon(){
	  //这里的数据是从后端读取出来的,格式为【描述:折扣码】,多个折扣码用回车换行隔开
	  let couponStr=$('.jerry-coupon-box .discountInfoIpt').val()
	  let couponArr=parseCouponStr(couponStr)
	  if(!couponArr){
		  return
	  }
	  let couponHtml=createDomForCoupon(couponArr)
	  $('.jerry-coupon-inner-box').html(couponHtml)
  }
  //通过折扣码信息生成html
  function createDomForCoupon(couponArr){
	  let dom=""
	  couponArr.forEach((coupon, index) => {
		dom+='<li class="coupon-item">'+
				  '<div class="coupon-desc-box">'+
					  '<i class="icon fa fa-solid fa-tags"></i>'+
					  '<span class="coupon-desc-text">'+ coupon.desc +'</span>'+
				  '</div>'+
				  '<div class="coupon-copy" onclick="copyCode(event)">'+
					  '<span class="code">' + coupon.code + '</span>'+
					  '<i class="icon fa fa-solid fa-copy"></i>'+
					  '<span class="copy-tip" data-code="' + coupon.code + '">COPY CODE</span>'+
				  '</div>'+
			  '</li>\r\n'
	  })
	  return dom
  }
  //解析折扣码信息
  function parseCouponStr(couponStr){
	let couponArr=[]
	// 根据换行或者回车进行识别
	let couponLineList = couponStr.split(/[(\r\n)\r\n]+/)
	couponLineList.forEach((couponLine, index) => {
		//解析单个折扣码
		if (couponLine) {
			let tmp=couponLine.split(":");
			if(tmp[0] && tmp[1] ){
				let coupon={"desc":tmp[0],"code":tmp[1]}
				couponArr.push(coupon)
			}
		}
	})
	return couponArr
  }
//复制指定字符串到剪贴板
function copyToClipboard(str) {
  let el = document.createElement("textarea");
  el.value = str;
  el.setAttribute("readonly", "");
  el.style.position = "absolute";
  el.style.left = "-9999px";
  document.body.appendChild(el);
  let selected =
	document.getSelection().rangeCount > 0
	  ? document.getSelection().getRangeAt(0)
	  : false;
  el.select();
  document.execCommand("copy");
  document.body.removeChild(el);
  if (selected) {
	document.getSelection().removeAllRanges();
	document.getSelection().addRange(selected);
  }
}
//复制折扣码
function copyCode(e) {
	let clickedElement = e.currentTarget
	console.log(clickedElement)
	var copyTipDom = clickedElement.querySelector('.copy-tip')
	copyToClipboard(copyTipDom.getAttribute("data-code"));
	copyTipDom.innerHTML = 'COPIED'
	setTimeout(function () {
	copyTipDom.innerText = "COPY CODE";
	}, 1000);
}
</script>