ใช้ภาพเช่นช่องทำเครื่องหมาย


165

ฉันต้องการที่จะมีทางเลือกให้กับช่องทำเครื่องหมายมาตรฐาน - โดยทั่วไปฉันต้องการใช้ภาพและเมื่อผู้ใช้คลิกที่ภาพมันจะหายไปและวางซ้อนกล่องกา

โดยพื้นฐานแล้วฉันต้องการทำสิ่งที่ Recaptcha 2 ทำเมื่อมันทำให้คุณคลิกภาพที่ตรงตามเกณฑ์ที่กำหนด คุณสามารถดูตัวอย่างของ Recaptcha ได้ที่นี่แต่ในบางครั้งคุณอาจจะสามารถแก้ปัญหาข้อความได้ซึ่งต่างจากการเลือกรูปภาพ ดังนั้นนี่คือภาพหน้าจอ:

ภาพหน้าจอของ Google Recaptcha

เมื่อคุณคลิกที่ภาพใดรูปหนึ่ง (ในกรณีนี้มีรูปภาพของสเต็ก) รูปภาพที่คุณคลิกจะมีขนาดเล็กลงและมีเครื่องหมายสีน้ำเงินปรากฏขึ้นเพื่อระบุว่าคุณได้ทำเครื่องหมายไว้แล้ว

สมมติว่าฉันต้องการทำซ้ำตัวอย่างที่แน่นอนนี้

ฉันรู้ว่าฉันมีช่องทำเครื่องหมายที่ซ่อนอยู่ 9 ช่องและแนบ jQuery บางอย่างเพื่อให้เมื่อฉันคลิกที่ภาพก็จะเลือก / ยกเลิกการเลือกช่องทำเครื่องหมายที่ซ่อนอยู่ แต่สิ่งที่เกี่ยวกับการหดตัวของภาพ / เห็บซ้อนทับ?


2
คุณสามารถมีภาพที่เหมือนกันสองภาพ: ภาพเดียวกับเห็บและภาพอื่น ๆ ไม่มีเห็บ และเปลี่ยนรูปภาพเมื่อคลิก
Alex

23
@Alex นั่นจะเป็นทางออกที่ไม่ยืดหยุ่นอย่างยิ่ง
Siguza

2
คุณได้ลองเพิ่ม / ลบคลาส CSS เมื่อคลิกซึ่งจะแทนที่ขนาดของภาพและทำ:beforeเวทย์ให้กับภาพเห็บหรือไม่?
Hexaholic

3
@Alex "ไม่ยืดหยุ่น" ในแง่ที่ว่ามันต้องใช้งานมากขึ้นในการเปลี่ยนแปลงสิ่งต่าง ๆ เช่นเพิ่มรูปภาพใหม่ให้กับคอลเลกชันหรือเปลี่ยนไอคอน "ticked" เมื่อสิ่งนี้ไม่ได้เกิดขึ้นหากสร้างเอฟเฟกต์แบบโปรแกรมที่ รันไทม์
Siguza

2
@Christian เปลี่ยนช่องทำเครื่องหมายด้วยสิ่งที่กำหนดเองคือการตัดสินใจการออกแบบที่เป็นที่นิยม (แม้ว่าจะเป็นเพียงช่องทำเครื่องหมายสไตล์) และการหาวิธีที่ดี / ง่ายที่จะทำ และคำถามนี้ (การแทนที่ช่องทำเครื่องหมายแทนสิ่งอื่น) ทำให้มันน่าสนใจอย่างแน่นอน โดยเฉพาะอย่างยิ่งโปรดสังเกตว่าคำตอบที่ได้รับการยอมรับนั้นไม่ใช้ JS เลยแม้จะมีความซับซ้อนที่ชัดเจนของงาน
Izkata

คำตอบ:


309

โซลูชัน HTML / CSS แบบ semantic ล้วนๆ

สิ่งนี้ง่ายต่อการติดตั้งด้วยตัวคุณเองโดยไม่จำเป็นต้องมีวิธีแก้ไขปัญหาล่วงหน้า นอกจากนี้มันจะสอนคุณอย่างมากเนื่องจากคุณดูไม่ง่ายกับ CSS

นี่คือสิ่งที่คุณต้องทำ:

ช่องทำเครื่องหมายของคุณต้องมีidแอตทริบิวต์ที่แตกต่าง นี้ช่วยให้คุณเชื่อมต่อ<label>กับมันโดยใช้ฉลากfor-attribute

ตัวอย่าง:

<input type="checkbox" id="myCheckbox1" />
<label for="myCheckbox1"><img src="http://someurl" /></label>

การติดป้ายกำกับกับช่องทำเครื่องหมายจะก่อให้เกิดพฤติกรรมเบราว์เซอร์: เมื่อใดก็ตามที่มีคนคลิกที่ป้ายกำกับ (หรือภาพที่อยู่ภายใน) ช่องทำเครื่องหมายจะถูกสลับ

ถัดไปคุณซ่อนช่องทำเครื่องหมายโดยใช้ตัวอย่างdisplay: none;จากมัน

ตอนนี้สิ่งที่คุณต้องทำคือตั้งค่าสไตล์ที่คุณต้องการสำหรับlabel::beforeองค์ประกอบหลอกของคุณ(ซึ่งจะใช้เป็นองค์ประกอบทดแทนช่องทำเครื่องหมายภาพ):

label::before {
    background-image: url(../path/to/unchecked.png);
}

ในขั้นตอนสุดท้ายที่ยุ่งยากคุณใช้ประโยชน์จาก:checkedตัวเลือกหลอกของ CSS เพื่อเปลี่ยนภาพเมื่อมีการทำเครื่องหมายในช่องทำเครื่องหมาย:

:checked + label::before {
    background-image: url(../path/to/checked.png);
}

+( ที่อยู่ติดกันพี่น้องเลือก ) ทำให้แน่ใจว่าคุณจะเปลี่ยนป้ายกำกับที่โดยตรงทำตามช่องทำเครื่องหมายที่ซ่อนอยู่ในมาร์กอัป

คุณสามารถปรับให้เหมาะสมด้วยการใส่ภาพทั้งสองลงใน spritemap และใช้การเปลี่ยนแปลงbackground-positionแทนการสลับรูปภาพเท่านั้น

แน่นอนคุณต้องไปที่ตำแหน่งฉลากอย่างถูกต้องและนำไปใช้display: block;และการตั้งค่าที่ถูกต้องและwidthheight

แก้ไข:

ตัวอย่างโค้ดและตัวอย่างที่ฉันสร้างขึ้นหลังจากคำแนะนำเหล่านี้ใช้เทคนิคเดียวกัน แต่แทนที่จะใช้รูปภาพสำหรับช่องทำเครื่องหมายการเปลี่ยนช่องทำเครื่องหมายจะทำด้วย CSS ล้วนๆและสร้าง::beforeบนฉลากที่เมื่อตรวจสอบcontent: "✓";แล้ว เพิ่มเส้นขอบโค้งมนและช่วงการเปลี่ยนภาพหวาน ๆ และผลลัพธ์ที่ได้ก็น่าพึงพอใจจริงๆ!

นี่คือ codepen ที่ใช้งานได้ซึ่งแสดงเทคนิคและไม่ต้องการรูปภาพสำหรับช่องทำเครื่องหมาย:

http://codepen.io/anon/pen/wadwpx

นี่คือรหัสเดียวกันในตัวอย่าง:

ul {
  list-style-type: none;
}

li {
  display: inline-block;
}

input[type="checkbox"][id^="cb"] {
  display: none;
}

label {
  border: 1px solid #fff;
  padding: 10px;
  display: block;
  position: relative;
  margin: 10px;
  cursor: pointer;
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

label::before {
  background-color: white;
  color: white;
  content: " ";
  display: block;
  border-radius: 50%;
  border: 1px solid grey;
  position: absolute;
  top: -5px;
  left: -5px;
  width: 25px;
  height: 25px;
  text-align: center;
  line-height: 28px;
  transition-duration: 0.4s;
  transform: scale(0);
}

label img {
  height: 100px;
  width: 100px;
  transition-duration: 0.2s;
  transform-origin: 50% 50%;
}

:checked+label {
  border-color: #ddd;
}

:checked+label::before {
  content: "✓";
  background-color: grey;
  transform: scale(1);
}

:checked+label img {
  transform: scale(0.9);
  box-shadow: 0 0 5px #333;
  z-index: -1;
}
<ul>
  <li><input type="checkbox" id="cb1" />
    <label for="cb1"><img src="https://picsum.photos/seed/1/100" /></label>
  </li>
  <li><input type="checkbox" id="cb2" />
    <label for="cb2"><img src="https://picsum.photos/seed/2/100" /></label>
  </li>
  <li><input type="checkbox" id="cb3" />
    <label for="cb3"><img src="https://picsum.photos/seed/3/100" /></label>
  </li>
  <li><input type="checkbox" id="cb4" />
    <label for="cb4"><img src="https://picsum.photos/seed/4/100" /></label>
  </li>
</ul>


32
ดีใจที่คุณชอบมัน! เริ่มเล่นซอกับ CSS ให้มากขึ้นมันสนุกมากและ CSS สามารถทำอะไรได้มากกว่าที่คุณคาดหวัง (ยกเว้นการจัดกึ่งกลางแนวตั้งนั่นยากเกินไป;)
connexo

1
ใช่และการทำความเข้าใจกับวิธีการทำงานจะทำให้คุณคิดในอนาคตทุกครั้งที่คุณต้องการการกระทำของ DOM เมื่อคลิก และคุณคิดว่าคุณสามารถตอบโต้ได้เท่านั้น:hover:)
connexo

นั่นจะเป็นสิ่งต่อไปของฉันเพื่อดูบน Pluralsight - บางสิ่ง CSS :)
bgs264

6
นี่เป็นสิ่งที่ดีมาก! ฉันสังเกตเห็นปัญหาเล็ก ๆ เมื่อคุณคลิกที่ป้ายกำกับเดียวกันสองครั้งมันจะเลือกภาพ วิธีนี้แก้ไขได้: codepen.io/anon/pen/jPmNjg
Ayesh K

1
เห็บจะดูดีกว่าในฐานะ SVG เนื้อหา CSS ทำให้คุณรู้สึกดีกับแบบอักษรของระบบที่แย่มาก
Adria

31

โซลูชัน CSS เพียว

มีการเรียกใช้อุปกรณ์เรียบร้อยสามชิ้น:

  1. :checkedเลือก
  2. ::beforeหลอกตัวเลือก
  3. contentคุณสมบัติcss

label:before {
  content: url("https://cdn1.iconfinder.com/data/icons/windows8_icons_iconpharm/26/unchecked_checkbox.png");
  position: absolute;
  z-index: 100;
}
:checked+label:before {
  content: url("https://cdn1.iconfinder.com/data/icons/windows8_icons_iconpharm/26/checked_checkbox.png");
}
input[type=checkbox] {
  display: none;
}
/*pure cosmetics:*/
img {
  width: 150px;
  height: 150px;
}
label {
  margin: 10px;
}
<input type="checkbox" id="myCheckbox1" />
<label for="myCheckbox1">
  <img src="https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR0LkgDZRDTgnDrzhnXGDFRSItAzGCBEWEnkLMdnA_zkIH5Zg6oag">
</label>
<input type="checkbox" id="myCheckbox2" />
<label for="myCheckbox2">
  <img src="https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcRhJjGB3mQxjhI5lfS9SwXou06-2qT_0MjNAr0atu75trXIaR2d">
</label>
<input type="checkbox" id="myCheckbox3" />
<label for="myCheckbox3">
  <img src="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQuwWbUXC-lgzQHp-j1iw56PIgl_2eALrEENUP-ld72gq3s8cVo">
</label>


เป็นไปได้อย่างไรที่จะเพิ่มการทำงานของปุ่มตัวเลือกลงในช่องทำเครื่องหมายเหล่านี้ ฉันหมายถึงเมื่อคุณคลิกที่ภาพภาพที่เลือกไว้แล้วจะถูกยกเลิกการเลือก
Libertad

ใครก็ตามที่ถามตัวเองคำถามเดียวกันเป็น @Libertad เพียงแค่เปลี่ยนประเภทปัจจัยการผลิตวิทยุและให้พวกเขาทั้งหมดที่มีชื่อเดียวกัน "แอตทริบิวต์" <input type="radio" name="myRadio" id="myRadio1" />ยังเปลี่ยน CSS ของคุณเพื่อซ่อนกระสุน:input[type=radio]{display: none;}
ลู

8

ดูปลั๊กอิน jQuery นี้: imgCheckbox (ในเวลา npmและbower )

ข้อสงวนสิทธิ์:ไม่จำเป็นต้องใช้ Javascript ในการแก้ปัญหานี้ ความตึงเครียดอยู่ระหว่างการบำรุงรักษาและประสิทธิภาพของรหัส แม้ว่าจะไม่จำเป็นต้องใช้ปลั๊กอิน (หรือจาวาสคริปต์ใด ๆ ) แต่ก็ช่วยให้สามารถสร้างได้เร็วขึ้นและเปลี่ยนได้ง่ายขึ้น

Barebones Solution:

ด้วยHTML ที่ง่ายมาก(ไม่มีข้อผิดพลาดใด ๆ กับช่องทำเครื่องหมายและป้ายกำกับ ฯลฯ ):

<img class="checkable" src="http://lorempixel.com/100/100" />

คุณสามารถใช้toggleClassของ jQuery เพื่อเปิด / ปิด a selectedหรือcheckedคลาสบนclickเหตุการณ์:

$("img.checkable").click(function () {
    $(this).toggleClass("checked");
});

รายการที่ตรวจสอบจะถูกดึงด้วย

$(".checked")

พลัสความเย็น:

คุณสามารถจัดสไตล์ภาพตามสิ่งนี้ แต่ปัญหาใหญ่คือไม่มีองค์ประกอบ DOM อื่น ๆ ที่คุณไม่สามารถใช้::beforeและ::afterเพิ่มสิ่งต่าง ๆ เช่นเครื่องหมายถูก วิธีแก้ไขคือการห่อรูปภาพของคุณด้วยองค์ประกอบอื่น (และเหมาะสมที่จะแนบตัวฟังการคลิกกับองค์ประกอบที่ถูกห่อด้วย)

$("img.checkable").wrap("<span class='fancychecks'>")

นี่ทำให้ html ของคุณสะอาดจริงๆและ js ของคุณสามารถอ่านได้อย่างไม่น่าเชื่อ ดูตัวอย่างข้อมูล ...

การใช้ปลั๊กอินjCherybox imgCheckbox :

ฉันได้สร้างปลั๊กอินที่สามารถใช้งานได้ง่ายเช่นเดียวกับ:

$("img").imgCheckbox();
  • ฉีดข้อมูลสำหรับภาพที่ตรวจสอบลงในแบบฟอร์มของคุณ
  • รองรับเครื่องหมายถูกที่กำหนดเอง
  • รองรับ CSS ที่กำหนดเอง
  • รองรับองค์ประกอบที่เลือกไว้ล่วงหน้า
  • รองรับกลุ่มวิทยุแทนการสลับภาพอย่างง่าย
  • มีการเรียกกลับเหตุการณ์
  • ค่าเริ่มต้นที่เหมาะสม
  • น้ำหนักเบาและใช้งานง่ายสุด ๆ

ดูการทำงาน (และดูแหล่งที่มา )


ฉันชอบวิธีการนี้เช่นกัน แต่มีข้อเสียหลายประการที่น่ากล่าวถึงมากที่สุดสิ่งนี้คือ: สมมติว่าผู้ใช้มีความตั้งใจที่จะเลือกภาพข้อมูลที่ได้รับจากผู้ใช้ด้วยวิธีนี้จะต้องถูกประมวลผลอย่างแน่นอน โทรผ่าน AJAX หรือส่งแบบฟอร์ม สำหรับ pruposes ของการประมวลผลเพิ่มเติมของข้อมูลที่ได้รับจากผู้ใช้มีช่องทำเครื่องหมายที่ตัวเลือกจำนวนมากจะต้องสะท้อนให้เห็นและประมวลผลเป็นเพียงวิธีธรรมชาติความหมายของการทำมัน
connexo

สิ่งนี้เป็นจริงมันอยู่ในรายการสิ่งที่ต้องทำของฉันสำหรับปลั๊กอิน - เพื่อไฮแจ็กการส่งแบบฟอร์มและฉีดข้อมูลลงในแบบฟอร์ม แต่คุณถูกต้องช่องทำเครื่องหมายมีความหมายสำหรับรูปแบบ
jcuenod

ฉันพยายามใช้ปลั๊กอินของคุณ แต่ถ้าฉันเพิ่มรูปภาพเพิ่มเติมหลังจากการกำหนดค่าเริ่มต้นดูเหมือนจะไม่มีทางทำลายอินสแตนซ์ก่อนหน้าเพื่อให้สามารถรวมรูปภาพใหม่ได้
Ian Kim

@IanKim กรณีการใช้งานที่น่าสนใจคุณสามารถอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่คุณพยายามทำในปัญหาเกี่ยวกับ GitHub? github.com/jcuenod/imgCheckbox
jcuenod

มันเป็นปลั๊กอินที่ยอดเยี่ยม! โปรดเผยแพร่ Webjar =)
naXa

6

ฉันจะเพิ่ม div พิเศษด้วยposition: relative;และclass="checked"มีความกว้าง / ความสูงเท่ากันกับภาพที่มีและอยู่ในตำแหน่งleft: 0; top: 0;ที่มีไอคอนมากกว่า display: none;มันเริ่มต้นด้วย

ตอนนี้คุณสามารถฟังกิจกรรมclick-event:

$( '.captcha_images' ).click( function() {
    $(this + '.checked').css( 'display', 'block' );
    $(this).animate( { width: '70%', height: '70%' } );
});

วิธีนี้คุณสามารถรับไอคอนและปรับขนาดรูปภาพให้เล็กลงได้

หมายเหตุ: แค่ต้องการแสดงให้คุณเห็น "ตรรกะ" ที่อยู่เบื้องหลังความคิดของฉันตัวอย่างนี้อาจใช้งานไม่ได้หรือมีข้อบกพร่องบางอย่างในนั้น


เทคนิคที่ฉันแสดงให้เห็นนั้นเรียบง่ายและแข็งแกร่งมันมักถูกนำไปใช้ในสถานการณ์ที่คุณไม่มีช่องทำเครื่องหมายใด ๆ ความหมายเช่นสลับการแสดงองค์ประกอบอื่น ๆ และสิ่งที่คล้ายกัน นี่คือ usecase ที่ไม่เพียง แต่เป็นโซลูชันที่ง่ายที่สุดและยืดหยุ่นที่สุด แต่ยังดีที่สุดในเชิงความหมายด้วย
connexo

2
ใช่คุณพูดถูก. ตอนแรกฉันต้องการชี้ให้เห็นคำตอบแรกของคุณและปรับปรุง (ก่อนการแก้ไข) เพราะฉันชอบ No-JS และ Semantic แบบดี แต่ฉันอ่านว่า OP ต้องการบางสิ่งด้วย jQuery ดังนั้นฉันจึงเปลี่ยนคำตอบ ฉันจำได้ว่าฉันลงคะแนนได้ที่ไหนเพราะ OP ไม่ต้องการโซลูชันที่ "ดีกว่า" หรือ "วิธีที่ถูกต้อง" แต่วิธีที่เขาเขียนนั้นแน่นอน อาจมีบางสิ่งที่ฉันคิดมากหรือไม่เข้าใจหรือขึ้นอยู่กับ OP?
Cagatay Ulubay

2

ฉันพบว่ามีคำตอบอื่น ๆ ที่ไม่ได้ใช้<label>(เพราะเหตุใด) หรือต้องการการจับคู่forและidแอตทริบิวต์ ซึ่งหมายความว่าหากคุณมีรหัสการปะทะรหัสของคุณจะไม่ทำงานและคุณต้องจำไว้ว่าต้องสร้างรหัสที่ไม่ซ้ำกันในแต่ละครั้ง

นอกจากนี้หากคุณซ่อนinputด้วยdisplay:noneหรือvisibility:hiddenเบราว์เซอร์จะไม่เน้นไปที่มัน

ช่องทำเครื่องหมายและข้อความ (หรือในกรณีนี้ภาพ) สามารถห่อด้วยป้ายกำกับ:

.fancy-checkbox-label > input[type=checkbox] {
  position: absolute;
  opacity: 0;
  cursor: inherit;
}
.fancy-checkbox-label {
  font-weight: normal;
  cursor: pointer;
}
.fancy-checkbox:before {
  font-family: FontAwesome;
  content: "\f00c";
  background: #fff;
  color: transparent;
  border: 3px solid #ddd;
  border-radius: 3px;
  z-index: 1;
}
.fancy-checkbox-label:hover > .fancy-checkbox:before,
input:focus + .fancy-checkbox:before {
  border-color: #bdbdff;
}
.fancy-checkbox-label:hover > input:not(:checked) + .fancy-checkbox:before {
  color: #eee;
}
input:checked + .fancy-checkbox:before {
  color: #fff;
  background: #bdbdff;
  border-color: #bdbdff;
}
.fancy-checkbox-img:before {
  position: absolute;
  margin: 3px;
  line-height: normal;
}
input:checked + .fancy-checkbox-img + img {
  transform: scale(0.9);
  box-shadow: 0 0 5px #bdbdff;
}
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-T8Gy5hrqNKT+hzMclPo118YTQO6cYprQmhrYwIiQ/3axmI1hQomh7Ud2hPOy8SP1" crossorigin="anonymous">
<p>
  <label class="fancy-checkbox-label">
    <input type="checkbox">
    <span class="fancy-checkbox"></span>
    A normal checkbox
  </label>
</p>
<p>
  <label class="fancy-checkbox-label">
    <input type="checkbox">
    <span class="fancy-checkbox fancy-checkbox-img"></span>
    <img src="http://placehold.it/150x150">
  </label>
</p>


1

ต่อไปนี้เป็นตัวอย่างการเลือกภาพอย่างรวดเร็ว

อัปเดตตัวอย่างโดยใช้ Knockout.js:

var imageModel = function() {
    this.chk = ko.observableArray();
};
ko.applyBindings(new imageModel());
    input[type=checkbox] {
        display:none;
      }
 
  input[type=checkbox] + label
   {
       display:inline-block;
        width:150px;
        height:150px;
        background:#FBDFDA;
        border:none;
   }
   
   input[type=checkbox]:checked + label
    {
        background:#CFCFCF;
        border:none;
        position:relative;
        width:100px;
        height:100px;
        padding: 20px;
    }

   input[type=checkbox]:checked + label:after
    {
        content: '\2713';
        position:absolute;
        top:-10px;
        right:-10px;
        border-radius: 10px;
        width: 25px;
        height: 25px;
        border-color: white;
        background-color: blue;
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script>
<input type='checkbox' name='image1' value='image1' id="image1" data-bind="checked: chk"/><label for="image1"></label><label for="image1"><img class='testbtn'/></label>

<div data-bind="html: chk"></div>


1
ในขณะที่ฉันชอบวิธีการของคุณมันจะเป็นประโยชน์สำหรับคนส่วนใหญ่ที่จะระบุว่าคุณกำลังใช้ Knockout.js ในตัวอย่างของคุณ
connexo

@connexo ไชโยเพิ่งอัปเดตเพื่อพูดตัวอย่างโดยใช้ Knockout.js
YaBCK

0

หากต้องการขยายคำตอบที่ยอมรับสำหรับทุกคนที่ใช้ WordPress & GravityForms เพื่อสร้างฟอร์มและต้องการเติมข้อมูลในช่องทำเครื่องหมายโดยอัตโนมัติด้วยรายการโพสต์และรูปขนาดย่อที่แนะนำ

// Change '2' to your form ID
add_filter( 'gform_pre_render_2', 'populate_checkbox' );
add_filter( 'gform_pre_validation_2', 'populate_checkbox' );
add_filter( 'gform_pre_submission_filter_2', 'populate_checkbox' );
add_filter( 'gform_admin_pre_render_2', 'populate_checkbox' );

function populate_checkbox( $form ) {

    foreach( $form['fields'] as &$field )  {

        // Change '41' to your checkbox field ID
        $field_id = 41;
        if ( $field->id != $field_id ) {
            continue;
        }

        // Adjust $args for your post type
        $args = array(
                'post_type' => 'pet',
                'post_status' => 'publish',
                'posts_per_page' => -1,
                'tax_query' => array(
                        array(
                                'taxonomy' => 'pet_category',
                                'field' => 'slug',
                                'terms' => 'cat'
                        )
                )
        );

        $posts = get_posts( $args );

        $input_id = 1;

        foreach( $posts as $post ) {

            $feat_image_url = wp_get_attachment_image( get_post_thumbnail_id( $post->ID ), 'thumbnail' );
            $feat_image_url .= '<br />' . $post->post_title;

            if ( $input_id % 10 == 0 ) {
                $input_id++;
            }

            $choices[] = array( 'text' => $feat_image_url, 'value' => $post->post_title );
            $inputs[] = array( 'label' => $post->post_title, 'id' => "{$field_id}.{$input_id}" );

            $input_id++;
        }

        $field->choices = $choices;
        $field->inputs = $inputs;

    }

    return $form;
}

และ CSS:

.gform_wrapper .gfield_checkbox li[class^="gchoice_2_41_"] {
    display: inline-block;
}

.gform_wrapper .gfield_checkbox li input[type="checkbox"][id^="choice_2_41_"] {
    display: none;
}


.gform_wrapper .gfield_checkbox li label[id^="label_2_41_"] {
    border: 1px solid #fff;
    padding: 10px;
    display: block;
    position: relative;
    margin: 10px;
    cursor: pointer;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

label[id^="label_2_41_"]:before {
    font-family: "font-icons";
    font-size: 32px;
    color: #1abc9c;
    content: " ";
    display: block;
    background-color: transparent;
    position: absolute;
    top: -5px;
    left: -5px;
    width: 25px;
    height: 25px;
    text-align: center;
    line-height: 28px;
    transition-duration: 0.4s;
    transform: scale(0);
}

label[id^="label_2_41_"] img {
    transition-duration: 0.2s;
    transform-origin: 50% 50%;
}

:checked + label[id^="label_2_41_"] {
    border-color: #ddd;
}

/* FontAwesome tick */
:checked + label[id^="label_2_41_"]:before {
    content: "\e6c8";
    background-color: transparent;
    transform: scale(1);
}

:checked + label[id^="label_2_41_"] img {
    transform: scale(0.9);
    box-shadow: 0 0 5px #333;
    z-index: 0;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.