วิธีปิดการใช้งานปุ่มส่ง & ลิงก์เมื่อคลิกใน CSS บริสุทธิ์


9

ฉันได้ท้าทายตัวเองในการสร้างประสบการณ์แบบโต้ตอบและโต้ตอบในรูปแบบ HTML และ CSS เท่านั้น (ไม่มี Javascript) จนถึงตอนนี้ฉันยังไม่พบคุณลักษณะใด ๆ ที่ฉันต้องการซึ่งฉันไม่สามารถทำได้ใน CSS และ HTML ล้วนๆ อันนี้อาจจะยากหน่อย

ฉันต้องการที่จะป้องกันผู้ใช้จากการดับเบิลคลิก<a>, <input type="submit">และ<button>แท็ก นี่คือการป้องกันไม่ให้ส่งแบบฟอร์มซ้ำซ้อนหรือส่งคำขอ 2 GET ไปยัง URL โดยไม่ได้ตั้งใจ สิ่งนี้สามารถทำได้ใน CSS บริสุทธิ์ แม้ว่าเราจะไม่สามารถตั้งค่าได้disabledหากปราศจาก JS แต่ควรมีเทคนิคการปิดบังหรือการผสมผสานของสไตล์ที่สามารถจัดการได้ที่นี่ในปี 2020

นี่คือตัวอย่างง่ายๆของความพยายาม:

.clicky:focus{
  display: none;
  pointer-events: none;
}
<a href="#down" class="clicky">test</a>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p id="down">target</p>

น่าเสียดายที่นี่ปิดใช้งานก่อนที่เหตุการณ์การคลิกจริงจะเริ่มขึ้นด้วยเหตุผลบางประการ จุดยึดอาจไม่ใช่วิธีที่ดีที่สุดในการทดสอบหรือ ฉันจะพยายามต่อไป


คุณสามารถสร้างแบบฟอร์มให้ชั้นเรียนเองหลังจากถูกส่งในครั้งแรกได้หรือไม่
SIGSTACKFAULT

1
อาจเป็นpointer-events: allค่าเริ่มต้น แต่ไม่อยู่ใน: ใช้งานหรือ: สถานะโฟกัส? เช่นเดียวกับที่ตั้งไว้pointer-events: noneสำหรับรัฐเหล่านั้น?
Jeremy Harris

อาจel:active, el:focusรวมกับตัวชี้เหตุการณ์
Paragon512

มันใช้ได้ไหม? : active {display: none; // ตัวอย่างเช่น
MD Hesari

เพิ่มความพยายาม มันปิดการใช้งานก่อนที่จะเริ่มการคลิก
Paragon512

คำตอบ:


4

แนวคิดหนึ่งคือมีเลเยอร์ที่อยู่ด้านบนขององค์ประกอบหลังจากคลิกครั้งแรกเพื่อหลีกเลี่ยงชั้นที่สอง

นี่เป็นแนวคิดพื้นฐานที่ฉันจะพิจารณาระยะเวลา1sระหว่างสองคลิกที่คุณสามารถลดได้ ลองคลิกปุ่ม / ลิงก์จากนั้นคุณจะสังเกตเห็นว่าคุณสามารถคลิกได้อีกครั้งหลังจาก1sนั้น

ฉันกำลังเพิ่มการซ้อนทับขนาดเล็กเพื่อดูเคล็ดลับ

.button {
  position:relative;
  display:inline-block;
}
.button span{
  position:absolute;
  top:0;
  left:0;
  right:0;
  bottom:100%;
  z-index:-1;
  animation:overlay 1s 0s; /* Update this value to adjust the duration */
  transition:0s 2s; /* not this one! this one need to be at least equal to the above or bigger*/
}


.button *:active + span {
  animation:none;
  bottom:0;
  transition:0s 0s;
}

@keyframes overlay {
  0%,100% {
    z-index:999;
    background:rgba(255,0,0,0.2); /* To illustrate */
  }
}
<div class="button">
  <button>Click me</button>
  <span></span>
</div>

<div class="button">
  <a href="#" onclick="console.log('clicked !')">Click me</a>
  <span></span>
</div>


1
ดูเหมือนว่าจะไม่ทำงานกับ<a>แท็ก
Aleksandr Belugin

@AleksandrBelugin ทำงานได้ดีตรวจสอบการอัปเดต บางทีคุณอาจจะทำอะไรผิดพลาด
Temani Afif

ฉันคิดว่ามันยังให้ฉันคลิกปุ่ม 2 ครั้ง? ฉันสามารถเห็นปุ่มกดครั้งที่สอง
Paragon512

1
@TemaniAfif เมื่อฉันทำเช่นนี้<a href="#" onclick="console.log('lalala')">Click me</a>เพื่อเชื่อมโยงกับส่วนที่เหลือของรหัสบันทึกอะไรเพื่อคอนโซล ฉันหมายถึงไม่มีการคลิกลิงค์
อเล็กซานเดอร์เบลูจิน

1
ดูเหมือนว่าวิธีที่ดีที่สุดในการทดสอบนี้คือด้วย<a>แท็ก ฉันลองทดสอบด้วยปุ่มส่ง แต่การตรวจสอบผู้ตรวจสอบเครือข่ายนั้นแปลกและไม่สอดคล้องกัน เมื่อฉันคลิกลิงก์มันไม่ได้เป็นการเริ่มต้นการคลิก หากคุณตั้งเป้าหมายเป็นจุดยึดและคลิกที่ลิงก์มันจะปิดการใช้งานลิงค์ แต่จะไม่ข้ามไปที่จุดยึด
Paragon512

0

ทางออกแรก

แนวคิดคือการใช้radio buttonสถานะโดย:checkedทำการปรับเปลี่ยน เราซ่อนradioวงกลมและเมื่อ:checkedสำหรับ<a>แต่งหน้าpointer-events: none;และbuttonsมีชนิดที่แตกต่างกันที่เราซ่อนไว้และแสดงdisabledคน

div {
  margin: 10px;
}

#radio0, .my-checkbox {
  position: absolute;
  height: 0;
  width: 0;
  opacity: 0;
}

#radio0 + a label {
  cursor: pointer;
}

#radio0:checked+a {
  pointer-events: none;
}

.btn-one,
.btn-two {
  padding: 0;
}

.btn-one>label,
.btn-two>label {
  padding: 1px 6px;
}

.my-checkbox:checked+.btn-one {
  display: none;
}

.btn-two {
  display: none;
}

.my-checkbox:checked+.btn-one+.btn-two {
  display: inline-block;
}
<div>
  <input id="radio0" type="radio" onclick="console.log('radio0 clicked!')">
  <a href="#">
    <label for="radio0">
        Click the link!
      </label>
  </a>
</div>

<div>
  <input type="radio" id="radio1" class="my-checkbox">
  <button type="button" class="btn-one" onclick="console.log('radio1 clicked!')">
      <label for="radio1">Click the button!</label>
    </button>
  <button type="button" class="btn-two" onclick="console.log('radio1 NOT clicked!')" disabled>
        <label for="radio1">Click the button!</label>
      </button>
</div>

<div>
  <input type="radio" id="radio2" class="my-checkbox">
  <button type="submit" class="btn-one" onclick="console.log('radio2 clicked!')">
    <label for="radio2">Submit!</label>
  </button>
  <button type="submit" class="btn-two" onclick="console.log('radio2 NOT clicked!')" disabled>
      <label for="radio2">Submit!</label>
    </button>
</div>

ทางออกที่สอง

linksนี้เป็นหนึ่งในชุดสูทสำหรับ :targetความคิดที่จะใช้ Targe elementถูกซ่อนไว้ในตอนแรก จากนั้นเมื่อมีการกำหนดเป้าหมายการใช้งาน:targetเพื่อการpointer-events: none;<a>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.