Chrome / Opera에서 CSS3 둥근 모서리가 오버플로를 숨기는 방법


147

자녀의 콘텐츠를 마스킹하려면 부모 div에 둥근 모서리가 필요합니다. overflow: hidden간단한 상황에서는 작동하지만 부모가 상대적으로 또는 절대적으로 위치하면 웹킷 기반 브라우저 및 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)의 다른 버그처럼 보이지만 작동합니다. WebWit CSS 마스크 를 #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)에서 시도해 보았습니다.
billythetalented 13:22에

6
그러나 요소의 그림자가 깨집니다.
잭 제임스

1
이것은 다른 솔루션으로는 그렇지 않은 자식 위치가 절대적으로있는 래퍼에서 작동합니다. 좋은!
Dan Tello

2
Chrome 42.0.2311.90 (64 비트)을 사용하는데이 수정은 여전히 필요합니다 ... 감사합니다!
사이먼

2
귀하의 솔루션은 부모 요소의 그림자를 제거합니다.
ABDeveloper

106

z-index를 border-radius의 항목에 추가하면 그 안에있는 것들이 가려집니다.


@ 시푸 : 당신은 단순히 잘못입니다. 어떤 이유로 든 제안 된대로 z-index를 추가하면 (현재 Chrome 버전에서)이 정확한 문제가 해결되었으며 이는 최상위 답변보다 더 간단하고 일반적인 솔루션입니다.
Nick F

7
@simon : z- 색인이 효과를 발휘하려면 특정 조건이 충족되어야합니다 (예 : 위치를 설정해야 함). 자세한 내용은 여기 를 참조 하십시오 .
Nick F

@NickF-Chrome (-ium)의 버그였습니다. -webkit-mask-image: -webkit-radial-gradient(circle, white, black);효과적인 해결 방법 이었지만 고맙게도 버그는 Chrome에받은 최신 업데이트에서 수정되었습니다.
사이먼

컨테이너에 대한 z- 인덱스 1 z-index -1을 절대 요소로 해결했습니다.
aztraL-EnForceR

이것은 나를 위해 일했습니다. 위의 래퍼 솔루션은 그렇지 않습니다.
Ruwen

58

모두에게 신경 쓰지 마십시오. 래퍼와 상자 사이에 div를 추가하여 문제를 해결할 수있었습니다.

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의 경계 반경에 클립하지 않기 때문에 작동합니다. 이 추가 레이어는 단순히 경계 반경이있는 div가 배치되지 않고 배치 된 요소 안에 앉아 있도록합니다.
Daniel Beardsley

9
이것이 버그 / 의도 한 행동인지 우연히 알고 있습니까?
jmotes

4
버그에 +1 투표 ... div를 자동으로 생성하고 위치를 절대로 설정하는 이미지 갤러리가있는 경우이 "기능"은 실제로 sux ...
inf3rno

@RunLoop 방금 Safari 7.1에서 jsfiddle을 테스트했으며 정상적으로 작동합니다. 작동하지 않는 것에 대해 더 구체적으로 설명 할 수 있습니까?
jmotes

1
우리의 동료 그래픽 디자이너는 실제로이 답변을 찾기 전에이 20 초 후에 "발견"했습니다 : D
Pere

18

불투명도 : 0.99; 랩퍼에서 웹킷 버그 해결


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

최신 크롬, 오페라 및 사파리에서 지원되며 다음과 같이 할 수 있습니다.

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

당신은 확실히 도구 http://bennettfeely.com/clippy/를 확인해야합니다 !


클립 경로를 훨씬 더 단축시킬 수 있다고 생각합니다 . inset (0 %); ... 그냥 클립 경로를 갖는 것은 트릭을 수행하는 것 같습니다 :-)
Jakob E

와. 완벽한 답변입니다.
Shashank Bhatt




2

그레이 크로우의 탁월한 답변을 바탕으로 ...

다음은 필러 내용이 포함 된 두 개의 cicular div가있는보다 실제적인 예입니다. 하드 코딩 된 png 배경을 16 진수 값으로 바꿨습니다.

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

로 대체

-webkit-mask-image:#fff;

이 JSFiddle을 참조하십시오 ... http://jsfiddle.net/hqLkA/


1

여기 내가 어떻게했는지 보자. JS 피들

내가 넣은 코드를 사용하여 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

미로, 이것은 어떤 상황에서는 작동 할 수 있지만, 제 경우에는 상자 모양을 변형시키지 않는 솔루션을 찾고 있습니다 (래퍼는 여전히 마스크로 작동합니다). 내 예제는 매우 단순화되었지만 래퍼를 사용하여 상자에서 그림자를 숨기려고합니다 (래퍼의 패딩을 사용하여 원하는 그림자 가장자리 만 보이도록).
jmotes

1
미로를 도와 주셔서 감사합니다! 귀하의 솔루션은 문제를보다 비판적으로 생각하는 데 도움이되었습니다. Btw, 당신은 당신의 게시물에 대한 편집을 무시할 수 있습니다. 나는 그것을 내 자신으로 만들려고했다. 죄송합니다 :)
jmotes

@ user480837 아니오 문제가있는 친구, 도와 주셔서 감사합니다. :)
Maze

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.