วิธีทำให้ CSS3 ปัดเศษมุมซ่อนเร้นใน Chrome / Opera


147

ฉันต้องการมุมโค้งมนบน div parent เพื่อปกปิดเนื้อหาจาก childen ของมัน overflow: hiddenทำงานได้ในสถานการณ์ที่เรียบง่าย แต่หยุดพักในเบราว์เซอร์ที่ใช้ webkit และ Opera เมื่อผู้ปกครองอยู่ในตำแหน่งที่ค่อนข้างหรือแน่นอน

ใช้งานได้ใน Firefox และ IE9:

CSS

#wrapper {
  width: 300px;
  height: 300px;
  border-radius: 100px;
  overflow: hidden;
  position: absolute;
}

#box {
  width: 300px;
  height: 300px;
  background-color: #cde;
}

HTML

<div id="wrapper">
  <div id="box"></div>
</div>

ตัวอย่างบน JSFiddle

ขอบคุณสำหรับความช่วยเหลือ!

อัปเดต:ข้อผิดพลาดที่ทำให้เกิดปัญหานี้ได้รับการแก้ไขตั้งแต่ใน Chrome ฉันยังไม่ได้ทดสอบ Opera หรือ Safari อีกครั้ง

คำตอบ:


183

ฉันพบวิธีแก้ไขปัญหาอื่นสำหรับปัญหานี้ นี่ดูเหมือนข้อผิดพลาดอื่นใน WebKit (หรืออาจเป็น Chrome) แต่ก็ใช้งานได้ สิ่งที่คุณต้องทำ - คือการเพิ่มWebKit CSS Maskให้กับองค์ประกอบ #wrapper คุณสามารถใช้รูปภาพ png พิกเซลเดียวและรวมไว้ใน CSS เพื่อบันทึกคำขอ HTTP

#wrapper {
width: 300px; height: 300px;
border-radius: 100px;
overflow: hidden;
position: absolute; /* this breaks the overflow:hidden in Chrome/Opera */

/* this fixes the overflow:hidden in Chrome */
-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);
}

#box {
width: 300px; height: 300px;
background-color: #cde;
}​

ตัวอย่าง JSFiddle


3
ขอบคุณสำหรับการแก้ไขนี้ ทดลองใช้ซาฟารีวันนี้ (v6.0.2) และทำงานให้ฉันที่นั่น!
สอง

6
สิ่งนี้จะทำลายเงาใด ๆ ในองค์ประกอบอย่างไรก็ตาม
แจ็คเจมส์

1
สิ่งนี้ใช้ได้กับ wrappers ที่มีเด็กอยู่ในตำแหน่งแน่นอนเช่นกันซึ่งโซลูชันอื่นที่นี่ไม่ได้ ดี!
Dan Tello

2
ใช้ Chrome 42.0.2311.90 (64 บิต) และการแก้ไขนี้ยังคงต้อง ... ขอบคุณ!
simon

2
โซลูชันของคุณจะลบเงาขององค์ประกอบหลัก
ABDeveloper

106

เพิ่มดัชนี z ลงในรายการ border-radius'd ของคุณและมันจะปกปิดสิ่งที่อยู่ภายใน


@Sifu: คุณแค่ผิด ไม่ว่าจะด้วยเหตุผลใดก็ตามการเพิ่ม z-index ตามที่แนะนำแก้ไขปัญหานี้ให้ฉัน (ใน Chrome เวอร์ชันปัจจุบัน) และนี่เป็นวิธีที่ง่ายกว่าและเป็นคำตอบทั่วไปมากกว่าคำตอบยอดนิยม
Nick F

7
@simon: โปรดจำไว้ว่าเพื่อให้ดัชนี z มีผลต้องมีเงื่อนไขบางประการ (เช่นต้องกำหนดตำแหน่ง) ดูที่นี่สำหรับรายละเอียด
Nick F

@NickF - เป็นข้อบกพร่องใน Chrome (-ium); -webkit-mask-image: -webkit-radial-gradient(circle, white, black);เป็นวิธีแก้ปัญหาที่มีประสิทธิภาพ แต่โชคดีที่ข้อผิดพลาดได้รับการแก้ไขในการอัปเดตล่าสุดที่ฉันได้รับกับ Chrome
simon

z-index 1 ไปยังคอนเทนเนอร์ z-index -1 ถึงองค์ประกอบที่แน่นอนแก้ไขให้ฉัน
aZtraL-EnForceR

อันนี้ใช้ได้สำหรับฉัน วิธีแก้ปัญหา wrapper ข้างต้นไม่ได้
Ruwen

58

ไม่ต้องห่วงทุกคนฉันจัดการแก้ไขปัญหาด้วยการเพิ่ม div เพิ่มเติมระหว่าง wrapper และ box

CSS

#wrapper {
    position: absolute;
}

#middle {
    border-radius: 100px;
    overflow: hidden; 
}

#box {
    width: 300px; height: 300px;
    background-color: #cde;
}

HTML

<div id="wrapper">
    <div id="middle">
        <div id="box"></div>
    </div>
</div>

ขอบคุณทุกคนที่ช่วย!

http://jsfiddle.net/5fwjp/


12
สิ่งนี้ทำงานได้เนื่องจากองค์ประกอบที่อยู่ในตำแหน่งจะไม่ตัดเนื้อหาไปยังรัศมีเส้นขอบใน Webkit เลเยอร์พิเศษนี้ทำให้มันง่ายขึ้นดังนั้นตำแหน่งที่ไม่มีรัศมีและไม่ได้อยู่ในตำแหน่ง
Daniel Beardsley

9
คุณจะรู้หรือไม่ว่านี่เป็นปัญหา / พฤติกรรมที่ตั้งใจ?
jmotes

4
+1 โหวตให้ข้อผิดพลาด ... เมื่อคุณมีแกลเลอรี่ภาพซึ่งจะสร้าง div และตั้งตำแหน่งเป็นสัมบูรณ์ดังนั้น "ฟีเจอร์" นี้จะช่วยให้คุณ ...
inf3rno

@ RunLoop ฉันเพิ่งทดสอบ jsfiddle ใน Safari 7.1 และทำงานได้ดี คุณจะเจาะจงมากขึ้นเกี่ยวกับสิ่งที่ไม่ทำงานหรือไม่
jmotes

1
เพื่อนร่วมงานของเรานักออกแบบกราฟิก "ค้นพบ" 20 วินาทีก่อนที่จะพบคำตอบนี้: D
Pere

18

ความทึบ: 0.99; บน wrapper แก้ข้อผิดพลาด webkit


2
transform: translateY(0);เป็นอีกทางเลือกหนึ่งที่บรรลุผลลัพธ์เดียวกันโดยไม่รบกวนการแสดงภาพวัตถุ (เว้นแต่คุณกำลังใช้เปอร์สเปคทีฟ)
kontur

15

ดูเหมือนว่างานนี้:

.wrap {
    -webkit-transform: translateZ(0);
    -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%);
}

http://jsfiddle.net/qWdf6/82/


4
transform: translateZ(0)ก็เพียงพอแล้วสำหรับฉัน
kalvn

โปรดทราบว่านี่ (โดยเฉพาะtranslateZ) จะเปิดใช้งานการเร่งความเร็วฮาร์ดแวร์สำหรับองค์ประกอบของคุณโดยปริยายซึ่งจะเปิดกระป๋องหนอนใหม่ในบางกรณีเศร้า
doldt

transform: translateZ(0)ยังทำงานให้ฉัน ในกรณีของฉันมันไม่ได้เป็นความคิดที่ดีว่ารายการนี้เร่งฮาร์ดแวร์
Sebastien Lorber

9

รองรับ Chrome, Opera และ Safari ล่าสุดคุณสามารถทำสิ่งนี้ได้:

-webkit-clip-path: inset(0 0 0 0 round 100px);
clip-path: inset(0 0 0 0 round 100px);

คุณควรตรวจสอบเครื่องมือhttp://bennettfeely.com/clippy/ !


ฉันคิดว่าคุณสามารถตัดทอนเส้นทางคลิปนี้ให้สั้นลง: สิ่งที่ใส่เข้าไป (0%); ... เพียงแค่มีเส้นทางคลิปดูเหมือนจะทำเคล็ดลับ :-)
Jakob E

ว้าว. มันเป็นคำตอบที่สมบูรณ์แบบ
Shashank Bhatt

6

ไม่ใช่คำตอบ แต่เป็นข้อบกพร่องที่ถูกจัดเก็บไว้ใต้แหล่ง Chromium: http://code.google.com/p/chromium/issues/detail?id=62363

น่าเสียดายที่ดูเหมือนว่าไม่มีใครทำงานอยู่ :(


1
และ 3 ปีต่อมาก็ยังไม่ได้รับการแก้ไข>. <
Nathan Hornby

4

เปลี่ยนความทึบขององค์ประกอบพาเรนต์ด้วยเส้นขอบและสิ่งนี้จะจัดระเบียบองค์ประกอบที่ซ้อนกันอีกครั้ง สิ่งนี้ได้ผลอย่างน่าอัศจรรย์สำหรับฉันหลังจากชั่วโมงการวิจัยและความพยายามที่ล้มเหลว มันง่ายเหมือนการเพิ่มความทึบของ 0.99 อีกครั้งเพื่อจัดระเบียบกระบวนการทาสีของเบราว์เซอร์ ตรวจสอบhttp://philipwalton.com/articles/what-no-one-told-you-about-z-index/



2

ตามคำตอบที่ดีของ graycrow ...

นี่คือตัวอย่างโลกแห่งความเป็นจริงที่มี div cicular สองตัวที่มีเนื้อหาตัวเติม ฉันเปลี่ยนพื้นหลัง png ที่เขียนโค้ดยากด้วยค่าฐานสิบหกเช่น

-=-webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);

ถูกแทนที่ด้วย

-webkit-mask-image:#fff;

ดู JSFiddle นี้ ... http://jsfiddle.net/hqLkA/


1

ดูที่ฉันทำมัน; Jsfiddle

ด้วยรหัสที่ฉันใส่ฉันจัดการเพื่อให้มันทำงานบน Webkit (Chrome / Safari) และ Firefox ฉันไม่รู้ว่ามันใช้งานได้กับ Opera เวอร์ชันล่าสุดหรือไม่ ใช่มันทำงานภายใต้ Opera เวอร์ชันล่าสุด

#wrapper {
  width: 300px; height: 300px;
  border-radius: 100px;
  overflow: hidden;
  position: absolute; /* this breaks the overflow:hidden in Chrome/Opera */
}

#box {
  width: 300px; height: 300px;
  background-color: #cde;
  border-radius: 100px;
  -webkit-border-radius: 100px;
  -moz-border-radius: 100px;
  -o-border-radius: 100px;
}

รำคาญวางทำไมในเสื้อคลุมที่ทุกคนอยู่ในสถานการณ์ที่คุณจะได้รับผลเดียวกันมีเพียงการตั้งค่าบนborder-radius #boxนอกจากนี้หาก#boxรัศมีชายแดนเป็นเพียงการแก้ไข WebKit คุณสามารถรวม-webkit-คุณสมบัติที่นั่น
robertc

เขาวงกตสิ่งนี้อาจใช้ได้ในบางสถานการณ์ แต่ในกรณีของฉันฉันกำลังมองหาวิธีแก้ปัญหาที่ไม่เปลี่ยนรูปทรงของกล่อง (และเสื้อคลุมยังคงใช้งานได้เป็นหน้ากาก) ตัวอย่างของฉันง่ายมาก แต่ฉันพยายามใช้ wrapper เพื่อซ่อน dropshadow จากกล่อง (ใช้ padding บน wrapper เพื่อทำเฉพาะเงาที่ฉันต้องการให้มองเห็น)
jmotes

1
ขอบคุณสำหรับความช่วยเหลือแม้ว่าเขาวงกต! วิธีแก้ปัญหาของคุณช่วยให้ฉันคิดถึงปัญหายิ่งขึ้น แต่คุณสามารถเพิกเฉยต่อการแก้ไขที่ฉันทำกับโพสต์ของคุณได้ ฉันตั้งใจจะทำให้เป็นของตัวเอง ขออภัย :)
jmotes

@ user480837 ไม่มีปัญหาเพื่อนดีใจที่ฉันได้รับความช่วยเหลือ :)
เขาวงกต

1
@Maze จะไม่ทำงานหากมีการใช้เส้นขอบของการเรียงลำดับใด ๆ : jsfiddle.net/ptW85/228
antitoxic

1

ฉันลองทุกคำตอบ แต่ไม่ประสบความสำเร็จ หลังจากตรวจสอบไม่กี่ชั่วโมงฉันพบวิธีแก้ปัญหานี้ การใช้คุณสมบัตินี้ในคลาสของคุณจะไม่อนุญาตให้องค์ประกอบ div ล้นคอนเทนเนอร์

.container {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
}

0

หากคุณต้องการสร้างมาสก์สำหรับรูปภาพและจัดวางรูปภาพภายในคอนเทนเนอร์ไม่ได้ตั้งค่าแอตทริบิวต์ 'position: absolute' สิ่งที่คุณต้องทำคือเปลี่ยนระยะขอบซ้ายและระยะขอบขวา Chrome / Opera จะปฏิบัติตามกฎมากเกินไป: กฎซ่อนเร้นและเส้นขอบรัศมี

// Breaks in Chrome/Opera.
    .container {
        overflow: hidden;
        border-radius: 50%;
        img {
            position: absolute;
            left: 20px;
            right: 20px;
        }
    }

// Works in Chrome/Opera.
    .container {
        overflow: hidden;
        border-radius: 50%;
        img {
            margin-left: 20px;
            margin-right: 20px;
        }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.