Alt öğeleri etkilemeden arka plan görüntüsünün saydamlığını ayarlama


214

Alt öğelerin opaklığını etkilemeden arka plan görüntüsünün opaklığını ayarlamak mümkün müdür?

Misal

Altbilgideki tüm bağlantıların özel bir madde işaretine (arka plan resmi) ihtiyacı vardır ve özel madde işaretinin opaklığı% 50 olmalıdır.

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%;
}  

Ne Denedim

Liste öğelerinin opaklığını% 50 olarak ayarlamaya çalıştım, ancak daha sonra bağlantı metninin opaklığı da% 50 - ve alt öğelerin opaklığını sıfırlamanın bir yolu yok gibi görünüyor:

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

Ayrıca rgba kullanmayı denedim, ancak arka plan görüntüsü üzerinde herhangi bir etkisi yoktur:

#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%;
}


Yanıtlar:


119

Sen CSS kullanabilirsiniz linear-gradient()ile 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>


Bu en iyi çözüm!
Dzenis H.

93

Resminizi bir resim düzenleyicisine alın, opaklığı azaltın, bir .png olarak kaydedin ve bunun yerine kullanın.


8
Hmm ... ben sadece aşağı indirdim, ama kabul edilen bu cevaba bakın: stackoverflow.com/a/6502295/131809 10 kez upvoted ve hemen hemen aynı.
Alex

9
Bu iyi bir seçenek, neden bu kadar çok downvotes olduğunu bilmiyorum. Eğer bunu iki kez değerlendirebilseydim yapardım. Kısmen opak bir ana elemanın alt elemanı, kısmen opak olacaktır ve olması gerekir. Tüm "geçici çözümler", sonunda düzeltilmesi gereken hatalardır.
Rob

6
@mystrdat Resmi zaten indiriyorsunuz, bu fazladan bir istek değil.
brad

2
@mystrdat Ama zaten ok görüntüsünü indiriyor. Resimsiz bir çözüm sunmadınız, bu yüzden benim açımdan buydu. Zaten ok görüntüsünü indiriyor, gerektiğinde de gelebilir, bu da ekstra bir istek olmaz. Nereden geldiğini anlamıyorum.
brad

1
@ özür dilerim, tekrar kontrol ettiğim soruyu yanlış okudum.
mystrdat

42

Bu, her tarayıcıda çalışır

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; 
}

Şeffaflığın tüm kapsayıcıyı ve alt öğelerini etkilemesini istemiyorsanız, bu geçici çözümü denetleyin. Göreceli olarak konumlandırılmış bir ebeveyni olan kesinlikle konumlandırılmış bir çocuğunuz olmalıdır.

Demoyu http://www.impressivewebs.com/css-opacity-that-doesnt-affect-child-elements/ adresinden kontrol edin.


Ben düz kopya yapıştırılan zaman çalışması için yukarıdaki kodda "tırnak" olarak değiştirmek gerektiğini düşünüyorum.
nsantorello

6
bu cevap hala insanların şu soruna bulduğu en iyi çözümdür: "bir alt öğenin üst öğenin CSS opaklık değerini miras almaması nasıl yapılır?" Çocuğun gerçekten bir çocuk olmasına ihtiyacım var .. ve belge akışında ... ve bunun için javascript / flash getirmek istemiyorum; saf CSS'yi tercih edin.
govinda

% 50 opak ebeveyn <li> 'in% 100 opak olmasını istediğim alt resimler var. <li> position:relative;ve img'yi ayarlamak, img'deki position:absolute;devralınmış opaklığı geçersiz kılmama izin vermez ve <li> 'in kendileri için mutlak konumlandırma kullanamam (bu bir karmaşa ;-). Javascript'te denedim imgs[i].style.opacity = '1';, ancak bu da miras alınan opaklığı geçersiz kılmak için çalışmıyor. Doğru anlarsam, rgba'yı da kullanamam çünkü sadece arka plan rengini değil, imgs'i de etkilemem gerekiyor. Benim için bir tavsiye var mı?
govinda

26
Bu yanıtın hiçbir anlamı yok. Verilen kod, asker tam olarak ne olduğu üzerine yapmak istemiyor çünkü öyle değil çalışır , açıklama veya bağlantı eşleşmiyor. Neden bu kadar çok insanın bunu iptal ettiğini anlamakta çok zorlanıyorum.
BoltClock

Eğer soru 'Bir elemente% 50 şeffaflık nasıl ayarlanır' olsaydı, bu iyi bir cevap olurdu.
lharby

29

Görüntüyü madde işareti olarak kullanıyorsanız: before sözde öğesi olarak düşünebilirsiniz.

#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
Filtre sadece bir IE çözümü
Hüseyin

1
Bence bu muhtemelen en iyi çözüm. Saf bir CSS çözümüdür. IE7 desteğini kullanarak kesmek de mümkündür *zoom: expression( … );(bkz : after ve: css sözde öğeleri IE 7 için hack önce ), ancak IE7 nihayet passé haline geliyor.
üçüncü çeyrek


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;
}

Opaklık .99 (1'den az) ile kesmek, z-endeksi içeriği oluşturur, böylece global z-endeksi değerleri hakkında endişelenemezsiniz. (Kaldırmaya çalışın ve üst paketin pozitif z-endeksine sahip olduğu bir sonraki demoda neler olduğunu görün.)
Öğenizde zaten z-endeksi varsa, bu saldırıya ihtiyacınız yoktur.

Bu tekniğin demosu .


Opaklık için neden 1'den daha düşük bir değer belirlememiz gerektiğini biliyor musunuz? Çapraz tarayıcı çözümü mü?
zVictor

1
@zVictor evet, bu w3c standart davranış. Bkz. CSS z dizinini anlama: Yığın bağlamı .
kullanıcı

4

Ne yazık ki, bu cevabı yazarken, bunu yapmanın doğrudan bir yolu yoktur . Gerek:

  1. arka plan için yarı saydam bir resim kullanın (çok daha kolay).
  2. opak olmasını istediğiniz çocukların yanına ekstra bir öğe (div gibi) ekleyin, arkaplana ekleyin ve yarı saydam hale getirdikten sonra, belirtilen çocukların arkasına yerleştirin.

4

Başka bir seçenek, aradığımız opak arka plan efektini taklit etmek için sahte bir öğeyi tam arkasındaki orijinal öğenin tam boyutuna yerleştirmek için CSS Tricks yaklaşımıdır. Bazen sözde eleman için bir yükseklik ayarlamanız gerekebilir.

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" özelliği, IE7 / 8 için çalışabilmek için opaklık yüzdesi için çift yerine bir tamsayıya ihtiyaç duyar.

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

Not: Bunu cevap olarak gönderiyorum, çünkü SO, bir düzenleme için en az 6 değiştirilmiş karaktere ihtiyaç duyuyor.


2

Gerçekten ince ayar yapmak için tarayıcı hedefleme sarmalayıcılarına uygun seçimleri koymanızı öneririm. IE7 ve IE8'i "başkalarıyla güzel oynamak" için alamadığımda benim için çalışan tek şeydi (şu anda onları desteklemeye devam eden bir yazılım şirketi için çalışıyorum).

/* 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);
}

Yukarıdaki kodda fazlalıklar olabilir - kimse daha fazla temizlemek istiyorsa, çekinmeyin!


3
Her tarayıcıyı ayrı ayrı hedeflemek gereksizdir, tek bir seçici blok içindeki tarayıcı öneklerini kullanmanız yeterlidir. Tarayıcı önekleriyle, tarayıcı yalnızca uygun CSS özelliğini kullanır. Zaman geçtikçe ve söz konusu mülkün sözdizimi standart hale geldiğinde, tarayıcı satıcıları önekler için destek bırakacak ve herhangi bir önek olmadan CSS özelliğini kullanacaktır (örneğin, Firefox -moz-border-radiusFirefox 13'te desteği bıraktı ve border-radiusşimdi standart özelliği arıyor ). IE7 ve IE8 farklı bir hikaye, ama bu sadece IE :-p
üçüncü çeyrek

Buna kimin oy verdiğini ve nedenini bilmek istiyorum, lütfen. Oylama, bilgilendirici geribildirim olmadan işe yaramaz. Yanıtlarımı geliştirmek istiyorum. Sadece bilgi eski olduğu için lütfen tarihi kontrol edin. :) Teşekkürler.
kod-suşi

@ code-sushi: Downvote, yorumunuzla aynı zamanda gerçekleştiyse, üçüncü tarafın yorumunu kabul eden başka birinden gelmiş olabileceğini düşünün (yorumun kendisinde bulunan oylara dikkat edin). Cevabınıza oy vermedim ama katılıyorum - bunu eklemek istiyorum 1) KHTML -khtml-opacity, medya sorgusunu anlamadığı, işe yaramaz hale getirdiği için asla görmeyecek 2) IE sandığınızdan daha kararlı; IE için geçerli olan bir kurala IE olmayan önekler eklediğiniz için "patlamaz". Karşılaştığınız zaman, sorun başka bir yerden gelmiş olmalı.
BoltClock

Orijinal cevabım yaklaşık 2 yıl önceydi ve bu yıl olduğu gibi son oylama yakın zamanda gerçekleşti. Sadece merak ettim. IE yorumlarına gelince, hala desteğe ihtiyaç duyduklarında 7'ye ulaştılar; Pek çok durumda bugünlerde IE 7 görmezden gelmek eminim. Geri bildiriminiz için teşekkürler.
code-sushi

1

Opaklığı yalnızca madde işaretine ayarlamanız gerekiyorsa, neden alfa kanalını doğrudan görüntüye ayarlamıyorsunuz? Bu arada, tüm öğenin (ve alt öğelerinin) opaklığını değiştirmeden opaklığı css üzerinden bir arka plan görüntüsüne ayarlamanın bir yolu olduğunu düşünmüyorum.


1

Sadece yukarıdakilere eklemek için ... alfa kanalını yeni renk nitelikleriyle kullanabilirsiniz. rgba (0,0,0,0) tamam bu yüzden siyah ama sıfır opaklıkla ebeveyn olarak çocuğu etkilemeyecek. Bu sadece Chrome, FF, Safari ve .... üzerinde çalışıyor.

onaltılık renklerinizi RGBA'ya dönüştürün


4
Bu background-imageOP tarafından talep edildiği gibi çalışmaz .
Torsten Walter


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;
    }

Bu kodu deneyebilirsiniz. Bence işe yarayacak. Demoyu ziyaret edebilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.