CSS3の角を丸くしてChrome / Operaのオーバーフローを隠す方法


147

子供からコンテンツをマスクするために、親divの角を丸くする必要があります。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マスクを#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、

6
ただし、これは要素の影を壊します。
ジャックジェームス

1
これは、絶対配置の子を持つラッパーでも機能しますが、他のソリューションでは機能しません。いいね!
Dan Tello

2
Chrome 42.0.2311.90(64ビット)を使用していて、この修正はまだ必要です...ありがとう!
サイモン、2015

2
ソリューションは親要素の影を削除します。
ABDeveloper 2016年

105

border-radius'dアイテムにZ-indexを追加すると、その中にあるものが隠されます。


@Sifu:あなたは単に間違っている。何らかの理由で、提案されているようにz-indexを追加すると、この問題(現在のバージョンのChromeで)が正確に解決しました。これは、トップの回答よりも単純で一般的な解決策です。
Nick F

7
@simon:z-indexを有効にするには、特定の条件を満たす必要があります(たとえば、位置を設定する必要がある)。詳細はこちらをご覧ください。
ニックF

@NickF-Chrome(-ium)のバグでした。-webkit-mask-image: -webkit-radial-gradient(circle, white, black);効果的な回避策でしたが、ありがたいことに、Chromeに受け取った最新のアップデートでバグが修正されています。
サイモン、

コンテナのz-index 1。絶対要素へのz-index -1で解決されました。
aZtraL-EnForceR 2015

これは私のために働いた。上記のラッパーソリューションはありません。
Ruwen、2015

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のボーダー半径にコンテンツをクリップしないため機能します。この追加のレイヤーは単純にそれを作成するため、border-radiusを持つdivは配置されず、配置された要素内に配置されます。
Daniel Beardsley

9
これがバグ/意図された動作であるかどうかを偶然知っていますか?
jmotes

4
バグへの+1投票...
div

@RunLoop Safari 7.1でjsfiddleをテストしたところ、問題なく動作しました。何がうまくいかないのか、具体的に教えていただけますか?
jmotes 2014年

1
D:私たちの同僚は、グラフィックデザイナーが実際にこの答えを見つける前に、この20秒の「発見」
ペール

18

不透明度:0.99; ラッパーで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 2016

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/をチェックアウトする必要があります!


これをさらに短くすることができると思います:inset(0%); ...クリップパスがあるだけでうまくいくようです:-)
Jakob E

ワオ。それは完璧な答えです。
Shashank Bhatt




2

グレイクロウの優れた答えに基づいて...

これは、フィラーコンテンツを含む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

ここで私がそれをどのように行ったかを見てください。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そのような状況でonラッパーを配置する必要がないのはなぜですか。onを設定するだけで同じ結果が得られます#box。また、#box境界線の半径がWebKitを修正するだけの場合は、-webkit-そこにプロパティを含めるだけで済みます。
robertc

迷路、これはいくつかの状況でうまくいくかもしれませんが、私の場合、箱の形を変えない解決策を探しています(そしてラッパーはまだマスクとして働きます)。私の例は非常に単純化されていますが、ラッパーを使用してドロップシャドウをボックスから隠そうとしています(ラッパーのパディングを使用して、必要なシャドウエッジのみを表示します)。
jmotes 2011

1
迷路を助けてくれてありがとう!あなたの解決策は、問題をより批判的に考えるのに役立ちました。ところで、私があなたの投稿に加えた編集は無視できます。自分で作るつもりだった。申し訳ありません:)
jmotes

@ user480837問題ありません。助けてくれてうれしいです。:)
迷路

1
@迷路なんらかの境界線が適用されている場合は機能しません:jsfiddle.net/ptW85/228

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.