Cách tạo các góc tròn CSS3 ẩn tràn trong Chrome / Opera


147

Tôi cần các góc tròn trên div cha để che giấu nội dung từ con của nó. overflow: hiddenhoạt động trong các tình huống đơn giản, nhưng phá vỡ các trình duyệt dựa trên webkit và Opera khi cha mẹ được định vị tương đối hoặc tuyệt đối.

Điều này hoạt động trong Firefox và 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>

Ví dụ về JSFiddle

Cảm ơn đã giúp đỡ!

CẬP NHẬT: Lỗi gây ra sự cố này đã được khắc phục trong Chrome. Tuy nhiên, tôi chưa kiểm tra lại Opera hoặc Safari.

Câu trả lời:


183

Tôi tìm thấy một giải pháp khác cho vấn đề này. Điều này trông giống như một lỗi khác trong WebKit (hoặc có thể là Chrome), nhưng nó hoạt động. Tất cả những gì bạn cần làm - là thêm Mặt nạ CSS WebKit vào phần tử #wrapper. Bạn có thể sử dụng một hình ảnh png pixel đơn và thậm chí đưa nó vào CSS để lưu yêu cầu 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;
}​

Ví dụ về JSFiddle


3
cảm ơn bạn đã sửa chữa đã dùng thử trong safari ngày hôm nay (v6.0.2) và làm việc cho tôi ở đó!
billythetents

6
điều này sẽ phá vỡ bất kỳ bóng trên phần tử tuy nhiên.
Jack James

1
Điều này cũng hoạt động trên giấy gói với trẻ em có vị trí tuyệt đối, trong đó giải pháp khác ở đây không có. Đẹp!
Dan Tello

2
sử dụng Chrome 42.0.2311.90 (64-bit) và cách khắc phục này vẫn được yêu cầu ... cảm ơn!
simon

2
giải pháp của bạn loại bỏ bóng của phần tử cha.
ABDeveloper

105

Thêm chỉ mục z vào mục bán kính đường viền của bạn và nó sẽ che dấu những thứ bên trong nó.


@Sifu: bạn đơn giản là sai. Vì bất kỳ lý do gì, việc thêm chỉ mục z như được đề xuất đã giải quyết vấn đề chính xác này cho tôi (trong phiên bản Chrome hiện tại) và đây là một giải pháp đơn giản, tổng quát hơn so với câu trả lời hàng đầu.
Nick F

7
@simon: hãy nhớ rằng để chỉ số z có hiệu lực, cần phải đáp ứng một số điều kiện nhất định (ví dụ: vị trí cần được đặt). Xem ở đây để biết chi tiết.
Nick F

@NickF - đó là một lỗi trong Chrome (-ium); -webkit-mask-image: -webkit-radial-gradient(circle, white, black);là một giải pháp hiệu quả, nhưng, may mắn thay, lỗi đã được sửa trong bản cập nhật gần đây nhất mà tôi nhận được cho Chrome.
simon

chỉ số z 1 đến container. z-index -1 để phần tử tuyệt đối giải quyết nó cho tôi.
aZtraL-EnForceR

Cái này làm việc cho tôi Các giải pháp bao bọc ở trên không.
Ruwen

58

Không bao giờ có tất cả mọi người, tôi quản lý để giải quyết vấn đề bằng cách thêm một div bổ sung giữa trình bao bọc và hộp.

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>

Cảm ơn mọi người đã giúp đỡ!

http://jsfiddle.net/5fwjp/


12
Điều này hoạt động vì các phần tử được định vị không đưa nội dung của chúng vào bán kính đường viền của chúng trong Webkit. Lớp bổ sung này chỉ đơn giản làm cho nó sao cho div có bán kính đường viền KHÔNG được định vị và chỉ đơn giản là nằm bên trong một phần tử được định vị.
Daniel Beardsley

9
Bạn có thể tình cờ biết nếu đây là một lỗi / hành vi dự định?
jmotes

4
+1 phiếu bầu cho lỗi ... Khi bạn có một bộ sưu tập hình ảnh tự động tạo ra các div và đặt vị trí ở mức tuyệt đối, thì "tính năng" này thực sự rất ...
inf3rno

@RunLoop Tôi vừa thử nghiệm jsfiddle trong Safari 7.1 và hoạt động tốt. Bạn có thể cụ thể hơn về những gì không hoạt động?
jmote

1
Đồng nghiệp của chúng tôi, nhà thiết kế đồ họa thực sự đã "phát hiện" 20 giây này trước khi tìm thấy câu trả lời này: D
Pere

18

độ mờ đục: 0,99; trên trình bao bọc giải quyết lỗi webkit


2
transform: translateY(0);là một thay thế đạt được kết quả tương tự mà không can thiệp vào biểu diễn trực quan của đối tượng (trừ khi bạn đang sử dụng phối cảnh).
kontur

15

Có vẻ như cái này hoạt động:

.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)là đủ cho tôi
kalvn

Lưu ý rằng điều này (đặc biệt, translateZ) sẽ ngầm cho phép tăng tốc phần cứng cho các phần tử của bạn, điều này sẽ mở ra một hộp giun hoàn toàn mới trong một số trường hợp, đáng buồn thay.
doldt

transform: translateZ(0)cũng làm việc cho tôi Trong trường hợp của tôi, ý tưởng không tồi là mặt hàng này được tăng tốc phần cứng.
Sebastien Lorber

9

Được hỗ trợ trong chrome, opera và safari mới nhất, bạn có thể làm điều này:

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

Bạn chắc chắn nên kiểm tra công cụ http://bennettfeely.com/clippy/ !


Tôi nghĩ bạn có thể rút ngắn đường dẫn clip này nhiều hơn : inset (0%); ... chỉ cần có một đường dẫn clip dường như thực hiện thủ thuật :-)
Jakob E

Ồ Đó là câu trả lời hoàn hảo.
Shashank Bhatt


4

thay đổi độ mờ đục của phần tử cha với đường viền và điều này sẽ tổ chức lại các phần tử xếp chồng. Điều này đã làm việc kỳ diệu cho tôi sau nhiều giờ nghiên cứu và thất bại. Nó đơn giản như việc thêm độ mờ 0,99 để tổ chức lại quá trình vẽ trình duyệt này. Kiểm tra http://philipwalton.com/articles/what-no-one-told-you-about-z-index/



2

dựa trên câu trả lời tuyệt vời của Graycrow ...

Đây là một ví dụ thực tế hơn có hai div cicular với một số nội dung phụ. Tôi đã thay thế nền png được mã hóa cứng chỉ bằng một giá trị hex, nghĩa là

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

được thay thế bằng

-webkit-mask-image:#fff;

Xem JSFiddle này ... http://jsfiddle.net/hqLkA/


1

Ở đây nhìn vào cách tôi thực hiện nó; Jsfiddle

Với Mã tôi đã đặt, tôi đã quản lý để nó hoạt động trên Webkit (Chrome / Safari) và Firefox. Tôi không biết nếu nó hoạt động với phiên bản Opera mới nhất. Có, nó hoạt động theo phiên bản mới nhất của 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;
}

Tại sao phải đặt border-radiustrình bao bọc trên tất cả trong tình huống đó, bạn sẽ nhận được kết quả tương tự với chỉ cần đặt nó trên #box. Ngoài ra, nếu #boxbán kính đường viền chỉ để sửa WebKit, bạn chỉ có thể bao gồm -webkit-tài sản ở đó.
robertc

Mê cung, điều này có thể hoạt động trong một số trường hợp, nhưng trong trường hợp của tôi, tôi đang tìm kiếm một giải pháp không biến đổi hình dạng của hộp (và trình bao bọc vẫn hoạt động như một mặt nạ). Ví dụ của tôi đã được đơn giản hóa nhưng tôi đang cố gắng sử dụng trình bao bọc để ẩn hình mờ khỏi hộp (sử dụng phần đệm trên trình bao bọc để chỉ hiển thị các cạnh bóng tôi muốn).
jmotes

1
Cảm ơn sự giúp đỡ mặc dù Mê cung! Giải pháp của bạn đã giúp tôi suy nghĩ về vấn đề nghiêm trọng hơn. Btw, bạn có thể bỏ qua chỉnh sửa tôi thực hiện cho bài viết của bạn. Tôi có nghĩa là để làm cho nó của riêng tôi. Xin lỗi :)
jmotes

@ user480837 Không có vấn đề gì bạn đời, rất vui vì tôi đã được giúp đỡ. :)
Mê cung

1
@Maze Điều đó sẽ không hoạt động nếu một đường viền thuộc loại nào được áp dụng: jsfiddle.net/ptW85/228
chống độc

1

Tôi đã thử mọi câu trả lời nhưng không thành công. Sau vài giờ điều tra tôi đã tìm ra giải pháp cho vấn đề này. Sử dụng các thuộc tính này trong lớp của bạn sẽ không cho phép các phần tử div tràn vào vùng chứa.

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

0

Nếu bạn đang tìm cách tạo mặt nạ cho hình ảnh và định vị hình ảnh bên trong vùng chứa, đừng đặt thuộc tính 'location: perfect'. Tất cả bạn phải làm là thay đổi lề trái và lề phải. Chrome / Opera sẽ tuân thủ quy tắc tràn: quy tắc ẩn và bán kính đường viền.

// 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;
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.