Arka plan rengini yalnızca dolgu için ekleyebilir miyim?


88

Bu kutu için kenarlık, dolgu ve arka plan rengini içeren bir başlık kutum var, arka plan rengini yalnızca kenarlıktan sonraki dolgulu bölge için ve ardından genişliğin geri kalanı için aynı arka plan rengini değiştirebilir miyim (yani verilen kodda gri) ?

Dolgulu arka plan rengini istediğim kodda bir tutam:

nav {
    margin:0px auto;
    width:100%;
    height:50px;
    background-color:grey;
    float:left;
    padding:10px;
    border:2px solid red;
}

3
Ben öyle düşünmüyorum, ama ben istiyorum aşk kanıtladı yanlış için. (Sanırım bir öğeyi yerleştirmeniz gerekecek.)
David, Monica'nın eski durumuna getirilmesini söylüyor

Hayır, haklısın David.
Eli Gassert

2
@DavidThomas aynısını dilerim! görelim ..
Pavan Nadig

EliGassert umm .. o zaman içinde farklı renkler olan bir kutu bulundurmak için ne yapabilirim?
Pavan Nadig

1
cevabımı kontrol et YAPILABİLİR.
Muhammad Umer

Yanıtlar:


40

Saf CSS ile başka bir seçenek şunun gibi bir şey olabilir:

nav {
    margin: 0px auto;
    width: 100%;
    height: 50px;
    background-color: white;
    float: left;
    padding: 10px;
    border: 2px solid red;
    position: relative;
    z-index: 10;
}

nav:after {
    background-color: grey;
    content: '';
    display: block;
    position: absolute;
    top: 10px;
    left: 10px;
    right: 10px;
    bottom: 10px;
    z-index: -1;
}

Demo burada


sözde sınıf öğeniz sağ taraftaki ana kutusunun ötesine geçiyorwidth: 100%;
Simon

Şimdi sağ taraftaki aralık çok büyük, sadece% 95 genişlik ayarlamak çok güvenilir değil, özellikle de dolgu değiştiğinde. ;)
Simon

@ Simon, neden kodu yerleştirdiğinizi açıklar mısınız position:relative;, görebiliyorum, sonra ekranda görünmüyor! .. ama bu nasıl çalışıyor?
Pavan Nadig

2
@Pavan Nadig Konum görecelidir, böylece z-endeksi değeri eklenebilir ve yürürlüğe girebilir. Z-endeksi yalnızca konumlandırılmış elemanlarda çalışır.
gotohales

Sanırım bunun en iyi açıklaması burada
Simon

80

Herkese özür dilerim, dolguyu gerçekten ayarlamak zorunda olmadığınız gerçek çözüm budur.

http://jsfiddle.net/techsin/TyXRY/1/

Ne yaptım ...

  • Arka planda bir başlangıç ​​ve bitiş rengine sahip iki degrade uygulandı. Düz renk kullanmak yerine. Tek bir arka plan için iki düz renge sahip olamamanın nedeni.
  • Sonra her birine farklı arka plan klibi özelliği uyguladı.
  • böylece bir rengin içerik kutusuna ve diğerinin kenarlığa uzanmasını sağlayarak dolguyu ortaya çıkarır.

Kendi kendime söylersem akıllıca.

div {
    padding: 35px;
    background-image:
      linear-gradient(to bottom,
        rgba(240, 255, 40, 1) 0%,
        rgba(240, 255, 40, 1) 100%),
      linear-gradient(to bottom,
        rgba(240, 40, 40, 1) 0%,
        rgba(240, 40, 40, 1) 100%);
    background-clip: content-box, padding-box;
}

6
Çok zeki. Kemanları
Ilan

şu anda jsfiddle.net/TyXRY/123 (123) adresinde ama ne yaptıkları veya kimin yaptığı benim için net değil.
Muhammad Umer

Bunu severim. Orta kısım (yani içerik kutusu) şeffaf olamaz ve alttaki (örn. Gövde) renge bir delik açamaz. Bunu denediğimde Chrome'da sadece dış gradyanı görüyorum.
MSC

1
Dahice! Buna bir geçiş eklemenin bir yolu var mı? Denedim ama başaramadım.
Garavani

transition: all 0.3s 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.275);
Benny K

44

background-clipVe box-shadowözelliklerini kullanın .

1) Set background-clip: content-box- bu, arka planı yalnızca içeriğin kendisiyle sınırlar (hem dolguyu hem de sınırı örtmek yerine)

2) Bir iç box-shadow Yayılma yarıçapı dolgu ile aynı değere ayarlanmış .

Diyelim ki dolgu 10px - set box-shadow: inset 0 0 0 10px lightGreen - bu sadece dolgu alanını açık yeşil yapacak.

Codepen demosu

nav {
  width: 80%;
  height: 50px;
  background-color: gray;
  float: left;
  padding: 10px; /* 10px padding */
  border: 2px solid red;
  background-clip: content-box; /* <---- */
  box-shadow: inset 0 0 0 10px lightGreen; /* <-- 10px spread radius */
}
ul {
  list-style: none;
}
li {
  display: inline-block;
}
<h2>The light green background color shows the padding of the element</h2>
<nav>
  <ul>
    <li><a href="index.html">Home</a>
    </li>
    <li><a href="/about/">About</a>
    </li>
    <li><a href="/blog/">Blog</a>
    </li>
  </ul>
</nav>

Bu tekniği kapsayan kapsamlı bir eğitim için bu harika css-tricks gönderisine bakın


Ne anlama 0 0 0geliyor?
Nakilon

1
@Nakilon'un box-shadowdört özelliği vardır. Bu uygulamada yatay gölge, dikey gölge ve bulanıklık mesafesi gerekli 0 0 0olmadığından h-shadow v-shadowve blurdeğerleri 0 olarak ayarlanır . Bu sadece içeri doğru ( inset) giden sağlam bir gölge 10px.
trlkly

Basit ama etkili!
timgeb

9

Bu efekt için arka plan gradyanlarını kullanabilirsiniz. Örneğiniz için sadece aşağıdaki satırları ekleyin (bu çok fazla koddur çünkü satıcı öneklerini kullanmanız gerekir):

background-image: 
    -moz-linear-gradient(top, #000 10px, transparent 10px),
    -moz-linear-gradient(bottom, #000 10px, transparent 10px),
    -moz-linear-gradient(left, #000 10px, transparent 10px),
    -moz-linear-gradient(right, #000 10px, transparent 10px);
background-image: 
    -o-linear-gradient(top, #000 10px, transparent 10px),
    -o-linear-gradient(bottom, #000 10px, transparent 10px),
    -o-linear-gradient(left, #000 10px, transparent 10px),
    -o-linear-gradient(right, #000 10px, transparent 10px);
background-image: 
    -webkit-linear-gradient(top, #000 10px, transparent 10px),
    -webkit-linear-gradient(bottom, #000 10px, transparent 10px),
    -webkit-linear-gradient(left, #000 10px, transparent 10px),
    -webkit-linear-gradient(right, #000 10px, transparent 10px);
background-image: 
    linear-gradient(top, #000 10px, transparent 10px),
    linear-gradient(bottom, #000 10px, transparent 10px),
    linear-gradient(left, #000 10px, transparent 10px),
    linear-gradient(right, #000 10px, transparent 10px);

Gereksiz işaretlemeye gerek yok.

Çift kenarlık istiyorsanız, border ve padding yerine anahat ve border kullanabilirsiniz.

İstenilen etkiyi elde etmek için sözde unsurları da kullanabilirsiniz, ancak buna karşı tavsiye ederim. Sözde öğeler, CSS'nin sağladığı çok güçlü bir araçtır, eğer onları böyle şeyler için "harcarsanız", muhtemelen onları başka bir yerde özleyeceksiniz.

Başka bir yolu yoksa yalnızca sözde öğeleri kullanırım. Kötü oldukları için değil, tam tersi, çünkü Joker'imi ziyan etmek istemiyorum.


1
IE9'u görmezden gelirseniz, bunu degradelerle yapabilirsiniz, ancak sözde sınıflar en azından IE8'e kadar desteklenir.
Simon

Bu doğru. Ancak, css3pie.com'u kullanmaya değer birçok vaka varsa
dave

1
Atık nedir? Sözde öğeler sınırlı bir süre için kullanılmak üzere kısıtlanmış mı?
Anwar

Evet, sınırlıdırlar. Her eleman için 2 tane var (1x :: önce, 1x :: sonra).
dave

6

cevaplar tüm olası çözümleri söyledi

BOX-SHADOW ile bir tane daha var

işte JSFIDDLE

ve kod

nav {
    margin:0px auto;
    width:100%;
    height:50px;
    background-color:grey;
    float:left;
    padding:10px;
    border:2px solid red;
    box-shadow: 0 0 0 10px blue inset;
}

IE9'u da destekler, bu nedenle gradyan çözümünden daha iyidir, daha fazla destek için uygun önekler ekleyin

IE8 bunu desteklemiyor, ne yazık!



2

Bu, IE8 / 9 için de çalışan uygun bir CSS çözümü olacaktır (tabi html5shiv ile IE8): codepen

nav {
  margin:0px auto;
  height:50px;
  background-color:gray;
  padding:10px;
  border:2px solid red;
  position: relative;
  color: white;
  z-index: 1;
}

nav:after {
  content: '';
  background: black;
  display: block;
  position: absolute;
  margin: 10px;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: -1;
}

1

Bunu yapmak için kesin bir işlevsellik yoktur.

İçine başka bir öğe sarmadan, sınırı bir kutu gölgesiyle ve dolguyu kenarlıkla değiştirebilirsiniz. Ancak kutu gölgesinin öğenin boyutlarına katkıda bulunmadığını unutmayın.

jsfiddle gerçekten yavaş oluyor, yoksa bir örnek eklerim.


0

Başlığı başka bir div ile sarar ve sınırlarla oynarım.

<div class="header-border"><div class="header-real">

    <p>Foo</p>

</div></div>

CSS:

.header-border { border: 2px solid #000000; }
.header-real { border: 10px solid #003399; background: #cccccc; padding: 10px; }

bu harika .. bu arada, tüm kutuyu kullandığım için <nav>, buna sınıfları nasıl ekleyebilirim?
Pavan Nadig

Ders <nav>alabileceğine inanıyorum . @Mookamafoob cevabına bir göz atın. Aslında tarayıcı desteği konusunda endişelendiğim için bunu böyle yapmayacağım. Ancak HTML5 / CSS3'ü tercih ediyorsanız, bunu yapmanın yolu budur.
2013

0

Dolgu üzerinde aşağıdaki gibi bir div yapabilirsiniz:

<div id= "paddingOne">
</div>
<div id= "paddingTwo">
</div>

#paddingOne {
width: 100;
length: 100;
background-color: #000000;
margin: 0;
z-index: 2;
}
#paddingTwo {
width: 200;
length: 200;
background-color: #ffffff;
margin: 0;
z-index: 3;

genişlik, uzunluk, arka plan rengi, kenar boşlukları ve z-endeksi elbette değişebilir, ancak dolguyu kapatmak için z-endeksinin dolgunun üzerine uzanması için 0'dan büyük olması gerekir. Yönünü değiştirmek için konumlandırma vb. İle oynayabilirsiniz. Umarım yardımcı olur!

PS div'ler html'dir ve #paddingOne ve #paddingTwo, css'dir (kimse bunu anlamamışsa :)

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.