เพิ่มคุณสมบัติเคอร์เซอร์ CSS เมื่อใช้“ pointer-events: none”


95

ฉันกำลังพยายามปิดการใช้งานลิงก์เฉพาะและใช้รูปแบบเคอร์เซอร์ แต่คำสั่ง CSS นี้cursor: text;จะไม่มีผล เคอร์เซอร์เป็นค่าเริ่มต้นเสมอ ฉันใช้ Firefox เวอร์ชันล่าสุด

CSS:

pointer-events: none !important;
cursor: text;
color: Blue;

@PHPglue สองสิ่ง: w3fools.comและมันใช้ไม่ได้จริงๆแม้ว่ามันจะเป็นเพียงองค์ประกอบนี้ในหน้า: jsfiddle.net/brh9r8h6
melancia

คำตอบ:


121

การใช้pointer-events: noneจะปิดการโต้ตอบของเมาส์ทั้งหมดกับองค์ประกอบนั้น หากคุณต้องการเปลี่ยนcursorคุณสมบัติคุณจะต้องใช้การเปลี่ยนแปลงกับองค์ประกอบหลัก คุณสามารถรวมลิงค์ด้วยองค์ประกอบและเพิ่มcursorคุณสมบัติเข้าไปได้

ตัวอย่างที่นี่

HTML

<span class="wrapper">
    <a href="#">Some Link</a>
</span>

CSS

.wrapper {
    position: relative;
    cursor: text;  /* This is used */
}
.wrapper a {
    pointer-events: none;
}

มีความไม่สอดคล้องกันของเบราว์เซอร์บางส่วน เพื่อให้ใช้งานได้ใน IE11 ดูเหมือนว่าคุณต้องมีองค์ประกอบหลอก องค์ประกอบหลอกยังช่วยให้คุณเลือกข้อความใน FF ผิดปกติคุณสามารถเลือกข้อความใน Chrome ได้โดยไม่ต้องใช้มัน

อัปเดตตัวอย่าง

.wrapper:after {
    content: '';
    position: absolute;
    width: 100%; height: 100%;
    top: 0; left: 0;
}

รหัสของคุณทำงานจนกว่าฉันลบแท็กแม่ของมัน แต่มันอยู่ใน <div> <li> <span> และในกรณีนี้ก็ยังคงเป็นเคอร์เซอร์เริ่มต้น
Dragut

@ user3721912 คุณช่วยยกตัวอย่างได้ไหม นั่นจะเป็นประโยชน์
Josh Crozier

ใช่นั่นคือสิ่งที่ฉันต้องการจะพูดฉันหมายความว่าแท็กช่วงของฉันไม่ได้อยู่คนเดียว แต่มี <div> <li> ผู้ปกครองมันถูกล้อมรอบด้วยแท็ก <div> <li>
Dragut

23

คำถามเดิมค่อนข้างยาว แต่นี่เป็นวิธีแก้ปัญหาของฉันโดยไม่มีองค์ประกอบการตัดและเคอร์เซอร์ที่ไม่มีเหตุการณ์ตัวชี้:

<!-- Add tabindex="-1" so that element cannot be reached by keyboard -->
<a href="url" class="disabled" tabindex="-1" onfocus="this.blur()">Disabled link</a>

CSS:

/* Adding cursor just works: */
.disabled {
    cursor: not-allowed;
}

/* Makes link non-clickable: */
.disabled:active {
    pointer-events: none;
}

ตัวอย่าง CodePen

แก้ไข:

  • Chrome ได้เริ่มให้ความสำคัญกับการคลิกองค์ประกอบที่มีแอตทริบิวต์ tabindex (แม้จะมี tabindex = "- 1") วิธีแก้ปัญหาที่เร็วที่สุดคือตั้งค่าonfocus="this.blur()"เป็นองค์ประกอบที่ไม่โฟกัส
  • คุณต้องป้องกันไม่ให้โฟกัสองค์ประกอบมิฉะนั้นจะเปิดใช้งานได้โดยใช้ปุ่ม Enter

ทำได้ดี! ฉลาด. ขอบคุณ
Joe Dooley

คำตอบต่ำกว่า! ขอบคุณ!
trpx

สะอาดเรียบง่ายและสำคัญที่สุดถูกต้อง! ขอบคุณ!
Dazag

13

โดยระบุว่าpointer-events:noneคุณกำลังประกาศอย่างแข็งขันว่าไม่มีการโต้ตอบของเมาส์ระหว่างองค์ประกอบและเคอร์เซอร์ ดังนั้นจึงไม่สามารถมีเคอร์เซอร์ได้เช่นกัน - พฤติกรรมทั้งหมดของเมาส์จะมองไม่เห็น

หลักฐานที่จะพบได้ที่นี่


อีกครั้งตรรกะไม่ดีที่จะปรับสิ่งนี้ สมมติว่าคุณต้องการโต้ตอบกับเมาส์ แต่คุณกำลังใช้สิ่งนี้ด้วยตัวเองใน JavaScript หรือคุณไม่ได้ใช้ JavaScript แต่ต้องการจัดรูปแบบบางอย่างเช่นการปรับขนาดพื้นที่ข้อความโดยเพิ่มเคอร์เซอร์ <-> ที่ด้านล่างขวา แต่คุณไม่ต้องการให้สิ่งนั้นปิดกั้นฟังก์ชันการปรับขนาดพื้นฐานดังนั้นคุณจึงสร้างตัวชี้เหตุการณ์: ไม่มี; แต่จะลบเคอร์เซอร์ ตรรกะที่รุนแรง ฉันมองไม่เห็นว่านี่เป็นคำตอบสำหรับคำถามอย่างไร
George

4

pointer-events: none !important;ลบ ปิดการใช้งานลิงก์โดยใช้ JavaScript:

anchorElement.onclick = function(){
  return false;
}

หากคุณไม่ทราบว่า JavaScript anchorElementเป็น Node หรือ Element เอง วิธีทั่วไปในการรับองค์ประกอบคือการใช้idแอตทริบิวต์HTML สมมติว่าเรามี:

<a id='whatever' href='#'>Text Here</a>

รหัสของคุณอาจเป็น:

document.getElementById('whatever').onclick = function(){
  return false;
}

มีหลายวิธีในการรับโหนด


ดูเหมือนจะเป็นตรรกะ แต่ฉันไม่ดีที่ JavaScript คงจะดีไม่น้อยหากคุณแสดงตัวอย่างการใช้งาน
Dragut

0

กรณีการใช้งานของฉันเป็นองค์ประกอบที่ลากได้ซึ่งไม่มีตัวชี้เหตุการณ์หรือองค์ประกอบหลักใด ๆ ที่มีตัวชี้เหตุการณ์

ฉันแก้ไขได้โดยใช้รูปแบบโกลบอลตามเงื่อนไขบังคับให้เคอร์เซอร์จับขณะลากเท่านั้น (ฉันใช้ React และ style-components แต่สามารถใช้ตรรกะเดียวกันกับ vanilla js ได้)

const SetDraggingCursor = createGlobalStyle`
  * {
    cursor: grabbing !important;
  }
`;

// ...

{isDragging && <SetDraggingCursor />}

0

คุณสามารถสร้าง div อื่นและวางตำแหน่งให้ตรงกับ div สุดท้ายของคุณและสร้าง css ดังนี้:

.example{
    background-color: rgba(255, 255, 255, 0); //opacity:0
    z-index: 1;
    cursor: not-allowed;
}

0

แทนที่จะเป็น wrapper สามารถทำได้ด้วย CSS บริสุทธิ์จากด้านในเช่นกัน (ฉันใช้สิ่งนี้กับองค์ประกอบเว็บวัสดุดังนั้นโค้ดจึงซับซ้อนขึ้นเล็กน้อย)

button:disabled {
    > * {
        cursor: not-allowed;
        pointer-events: initial;
    }

    &::before {
        background-color: #fff0;
    }

    &::after {
        background-color: #fff0;
    }
}
<button>
    <svg .../>
</button>

ฉันยังพยายาม::beforeและ::afterมีbutton:disabledโดยตรง แต่ก็ไม่สามารถทำให้มันเกิดขึ้น ...

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