子要素に影響を与えずに背景画像の不透明度を設定します


214

子要素の不透明度に影響を与えずに背景画像の不透明度を設定することは可能ですか?

フッターのすべてのリンクにはカスタムの箇条書き(背景画像)が必要であり、カスタムの箇条書きの不透明度は50%にする必要があります。

HTML

<div id="footer">
    <ul>
        <li><a href="#">Link 1</a></li>
        <li><a href="#">Link 2</a></li>
        <li><a href="#">Link 3</a></li>
        <li><a href="#">Link 4</a></li>
        <li><a href="#">Link 5</a></li>
    </ul>
</div>  

CSS

#footer ul li {
    background: url(/images/arrow.png) no-repeat 0 50%;
}  

私が試したこと

リストアイテムの不透明度を50%に設定してみましたが、リンクテキストの不透明度も50%になり、子要素の不透明度をリセットする方法がないようです。

#footer ul li {
    background: url(/images/arrow.png) no-repeat 0 50%;
    /* will also set the opacity of the link text */        
    opacity: 0.5;
}

私もrgbaを使用してみましたが、それは背景画像に影響を与えません:

#footer ul li {
    /* rgba doesn't apply to the background image */
    background: rgba(255, 255, 255, 0.5) url(/images/arrow.png) no-repeat 0 50%;
}


回答:


119

あなたは、CSSを使用することができますlinear-gradient()rgba()

div {
  width: 300px;
  height: 200px;
  background: linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.5)), url("https://i.imgur.com/xnh5x47.jpg");
}
span {
  background: black;
  color: white;
}
<div><span>Hello world.</span></div>


これが最善の解決策です!
Dzenis H.

93

画像を画像エディターに取り込み、不透明度を下げて.pngとして保存し、代わりにそれを使用します。


8
うーん...私は反対票を投じただけですが、この受け入れられた答えを見てください:stackoverflow.com/a/6502295/131809は 10回反対票を投じましたが、ほとんど同じです。
Alex

9
これは良い選択肢ですが、なぜそれほど多くの反対投票が行われるのかはわかりません。これを2回賛成できるとしたら、部分的に不透明な親要素の子要素は、部分的に不透明になるため、そうする必要があります。すべての「回避策」はバグであり、最終的に修正する必要があります。
RobW

6
@mystrdatすでにイメージをダウンロードしています。これは追加のリクエストではありません。
ブラッド2013

2
@mystrdatしかし、彼はすでに矢印の画像をダウンロードしています。画像以外のソリューションを提供していないので、それが私のポイントでした。彼はすでに矢印の画像をダウンロードしていますが、必要に応じて表示されることもあります。これは追加のリクエストではありません。どこから来たのかわかりません。
ブラッド2013年

1
@brad申し訳ありませんが、もう一度確認したところ、質問を間違って読んだことがわかりました。
mystrdat 2013年

41

これはすべてのブラウザで動作します

div {
 -khtml-opacity:.50; 
 -moz-opacity:.50; 
 -ms-filter:"alpha(opacity=50)";
  filter:alpha(opacity=50);
  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
  opacity:.50; 
}

透明度がコンテナ全体とその子に影響を与えたくない場合は、この回避策を確認してください。絶対配置の子と、相対的配置の親が必要です。

http://www.impressivewebs.com/css-opacity-that-doesnt-affect-child-elements/でデモを確認してください


私はあなたがまっすぐにコピー&ペーストする場合の作業にそのためには「に上記のコードでは引用符"に変更する必要があると思う。
nsantorello

6
この答えは、「子要素が親要素のCSS不透明度値を継承しないようにする方法」という問題に対して人々が見つけた最善の解決策ですか?私は子供が本当に子供であることを必要とします。そして、ドキュメントフローで...そして、これのためにjavascript / flashを持ち込みたくありません。純粋なCSSを好む。
govinda

50%の不透明な親<li>に100%不透明な子画像が含まれています。<li>をposition:relative;とimgに設定しても、img position:absolute;の継承された不透明度を上書きすることはできません。また、<li>自体の絶対配置を使用することはできません(それは混乱です;-)。Javascriptで私は試しましたimgs[i].style.opacity = '1';が、それも継承された不透明度を上書きするようには機能しません。私が正しく理解していれば、背景色だけでなくimg自体にも影響を与える必要があるため、rgbaも使用できません。誰か私におすすめがありますか?
govinda

26
この全体の答えは意味がありません。与えられたコードは、それが機能しないため質問者が正確に実行したくないものであることに加え、説明またはリンクと一致しません。なぜこれほど多くの人が賛成したのか理解するのに非常に苦労しています。
BoltClock

質問が「要素に50%の透明度を設定する方法」である場合、これは良い答えです。
lharby

29

画像を箇条書きとして使用している場合は、:before疑似要素を検討できます。

#footer ul li {
}

#footer ul li:before {
    content: url(/images/arrow.png);
    filter:alpha(opacity=50);
    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
    opacity:.50;
}

3
フィルターはIEソリューションにすぎません
フセイン

1
これがおそらく最良の解決策だと思います。これは純粋なCSSソリューションです。IE7のサポートを使用してIE7サポートをハッキングすることも可能です*zoom: expression( … );:afterおよび:before css疑似要素をIE 7にハックするを参照)。
サードパーティ2013


9
#footer ul li {
  position: relative;
  opacity: 0.99;
}

#footer ul li::before {
  content: "";
  position: absolute;
  width: 100%;
  height: 100%;
  z-index: -1;
  background: url(/images/arrow.png) no-repeat 0 50%;
  opacity: 0.5;
}

不透明度.99(1未満)でハックすると、z-indexコンテキストが作成されるため、グローバルz-index値について心配する必要はありません。(それを削除して、親ラッパーが正のz-indexを持つ次のデモで何が起こるかを確認してください。)
要素にすでにz-indexがある場合、このハックは必要ありません。

このテクニックのデモ


不透明度に1未満の値を設定する必要がある理由を知っていますか?クロスブラウザソリューションですか?
zVictor 2014年

1
@zVictorはい、これはw3c標準化された動作です。CSS z-indexの理解:スタッキングコンテキストを参照してください。
ユーザー

4

残念ながら、この回答を書いている時点では、これを行う直接的な方法はありません。必要がある:

  1. 背景に半透明の画像を使用します(はるかに簡単です)。
  2. 不透明にする子の隣に要素(divなど)を追加し、背景を追加して、半透明にした後、言及した子の後ろに配置します。

4

もう1つのオプションは、CSS Tricksアプローチであり、擬似要素をその直後に元の要素の正確なサイズで挿入して、探している不透明な背景効果を偽造します。場合によっては、疑似要素の高さを設定する必要があります。

div {
  width: 200px;
  height: 200px;
  display: block;
  position: relative;
}

div::after {
  content: "";
  background: url(image.jpg);
  opacity: 0.5;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  position: absolute;
  z-index: -1;   
}

3

「filter」プロパティは、IE7 / 8で機能するために、不透明度のパーセンテージを2倍ではなく整数にする必要があります。

filter: progid:DXImageTransform.Microsoft.Alpha(opacity=50);

PS:私はこれを回答として投稿します。SOなので、編集には少なくとも6つの変更された文字が必要です。


2

本当に微調整するために、ブラウザーをターゲットとするラッパーに適切な選択を配置することをお勧めします。これは、IE7とIE8が「他の人とうまく連携する」ことができなかったときに私にとってうまくいった唯一のことでした(現在、私はそれらをサポートし続けるソフトウェア会社で働いているため)。

/* color or background image for all browsers, of course */            
#myBackground {
    background-color:#666; 
}
/* target chrome & safari without disrupting IE7-8 */
@media screen and (-webkit-min-device-pixel-ratio:0) {
    #myBackground {
        -khtml-opacity:.50; 
        opacity:.50;
    }
}
/* target firefox without disrupting IE */
@-moz-document url-prefix() {
    #myBackground {
        -moz-opacity:.50;
        opacity:0.5;
    }
}
/* and IE last so it doesn't blow up */
#myBackground {
    opacity:.50;
    filter:alpha(opacity=50);
    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.5);
}

上記のコードに冗長性がある可能性があります-誰かがそれをさらにクリーンアップしたい場合は、お気軽に!


3
各ブラウザーを個別にターゲットにする必要はありません。単一のセレクターブロック内でブラウザーのプレフィックスを使用するだけです。ブラウザの接頭辞を使用すると、ブラウザは適切なCSSプロパティのみを使用します。時間が経過し、そのプロパティの構文が標準化されると、ブラウザーベンダーはプレフィックスのサポートを削除し、プレフィックスのないCSSプロパティを使用します(たとえば、-moz-border-radiusFirefox 13でのサポートが廃止され、border-radius現在は標準のプロパティのみが検索されます)。IE7とIE8は別の話ですが、それはIEだけです:-p
サードパーティ

誰が反対票を投じたのか、そしてその理由を教えてください。有益なフィードバックがなければ、投票は役に立たない。答えを改善できるようになりたいのですが。情報が古くなっているだけの場合は、日付を確認してください。:)ありがとう。
code-sushi

@ code-sushi:コメントとほぼ同時にダウン投票が発生した場合は、第三者のコメントに偶然同意した誰かからのコメントである可能性があります(コメント自体への投票に注意してください)。私はあなたの答えに投票しませんでしたが、同意する必要があります-追加したいと思います。1)KHTMLは-khtml-opacity、メディアクエリを理解しないため、表示されません。IEに適用されるルールにIE以外のプレフィックスを追加したからといって、それは「爆発」しません。問題は、あなたが直面したときに、他の場所から来たに違いありません。
BoltClock

私の最初の回答は2年近く前の回答でしたが、今年のように最近、反対票が投じられました。ちょっと気になっただけ。IEのコメントに関しては、それでもサポートが必要な7に関係していました。今ではほとんどの場合IE 7を無視しても問題ないと確信しています。ご意見をいただきありがとうございます。
code-sushi 14

1

弾丸のみに不透明度を設定する必要がある場合は、画像に直接アルファチャネルを設定してみませんか?ちなみに、要素全体(およびその子)の不透明度を変更せずにcssを介して背景画像に不透明度を設定する方法はないと思います。


1

上記に追加するだけです。新しいカラー属性を持つアルファチャネルを使用できます。rgba(0,0,0,0)わかりました。これは黒ですが、不透明度がゼロなので、親としては子に影響しません。これはChrome、FF、Safariでのみ機能します。

16進数の色をRGBAに変換する


4
これはbackground-image、OPの要求どおりには機能しません。
Torsten Walter

1

私はこの問題についてかなり良くて簡単なチュートリアルを見つけました。私はそれがうまく機能すると思います(そしてそれはIEをサポートしますが、クライアントに他のブラウザを使用するように伝えます):

RGBaとフィルターを介して、子要素に影響を与えずにCSSの背景を透明化

そこから、グラデーションサポートなどを追加できます。


まあ、それは直接動作しません。たとえば、divをbackground-color:(255,255,255,0.5)の親要素として配置する必要があります
Francisco

0
#footer ul li
     {
       position:relative;
       list-style:none;
     }
    #footer ul li:before
     {
       background-image: url(imagesFolder/bg_demo.png);
       background-repeat:no-repeat;
       content: "";
       top: 5px;
       left: -10px;
       bottom: 0;
       right: 0;
       position: absolute;
       z-index: -1;
       opacity: 0.5;
    }

このコードを試すことができます。うまくいくと思います。デモにアクセスできます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.