Jak utworzyć przezroczystą ramkę za pomocą CSS?

101

Mam listylizację następująco:

li{
    display:inline-block;
    padding:5px;
    border:1px solid none;
}
li:hover{
    border:1px solid #FC0;
}

Kiedy najeżdżam kursorem na ligranicę, pojawia się bez liprzesuwania. Czy jest możliwe, aby „obramowanie” było niewidoczne?

William Calleja
źródło

Odpowiedzi:

108

Możesz użyć „przezroczystego” jako koloru. W niektórych wersjach IE pojawia się jako czarny, ale nie testowałem go od czasów IE6.

http://www.researchkitchen.de/blog/archives/css-bordercolor-transparent.php

Douglas
źródło
3
Cóż, działało na ie8, Mozilla, Opera i Chrome, wystarczająco dobre dla mnie, nie wypróbowałem tego na Safari, ale nie mam nic przeciwko safari. wielkie dzięki!
William Calleja,
5
Tak, to właśnie w IE6 to nie działa. IE7 jest OK.
bobince
To niestety nie zadziałało. Skończyło się na tym, że użyłem pseudo po elementach wykonanych całkowicie poza granicami ... co za bałagan!
Alex
51

Wielu z was musi tu wylądować, aby znaleźć rozwiązanie dla nieprzezroczystej granicy zamiast przezroczystej. W takim przypadku możesz użyć rgba, gdzie aoznacza alpha.

.your_class {
    height: 100px;
    width: 100px;
    margin: 100px;
    border: 10px solid rgba(255,255,255,.5);
}

Próbny

Tutaj można zmienić opacityz borderod0-1


Jeśli chcesz po prostu mieć całkowicie przezroczyste obramowanie, najlepiej użyć na transparentprzykładborder: 1px solid transparent;

Mr. Alien
źródło
Możesz użyć tego narzędzia do konwersji z koloru szesnastkowego na kolor rgba ... hexcolortool.com ... gdzie możesz opcjonalnie określić kolor szesnastkowy w adresie URL, na przykład ... hexcolortool.com/#ffcc00
clayRay
32

Możesz usunąć obramowanie i zwiększyć dopełnienie:

li {
  display: inline-block;
  padding: 6px;
  border-width: 0px;
}

li:hover {
  border: 1px solid #FC0;
  padding: 5px;
}
<ul>
  <li>Hovering is great</li>
</ul>

Matt Ellen
źródło
Cóż, to zadziałało jak urok, po prostu zastanawiałem się, czy istnieje czystszy sposób, jak to zrobić? czy w ogóle można było mieć niewidzialną granicę? dzięki jeszcze raz za sugestię.
William Calleja,
3
To brzmi jak bardziej kompatybilne rozwiązanie dla mnie
NibblyPig
Właśnie zdałem sobie sprawę, że kod działa odwrotnie niż potrzebujesz! Naprawiony. Poza tym wybrałbym przezroczysty kolor. Po prostu nie wiedziałem o tym: D
Matt Ellen
Zmniejsz obramowanie i zwiększ dopełnienie nie przyda się, jeśli chcesz na przykład (w moim przypadku) w pełni klikalne <a/>pole. Obramowanie należy do elementu (stąd klikalne), podczas gdy wypełnienie należy do elementu nadrzędnego.
Nico
13

hej, to najlepsze rozwiązanie, jakiego kiedykolwiek doświadczyłem .. to jest CSS3

użyj następującej własności do swojego div lub dowolnego miejsca, w którym chcesz umieścić border trasparent

na przykład

div_class { 
 border: 10px solid #999;
 background-clip: padding-box; /* Firefox 4+, Opera, for IE9+, Chrome */
}

to zadziała ...

Raau
źródło
4

Tak, możesz użyć border: 1px solid transparent

Innym rozwiązaniem jest użycie outlinepo najechaniu (i ustawienie obramowania na 0), co nie wpływa na przepływ dokumentów:

li{
    display:inline-block;
    padding:5px;
    border:0;
}
li:hover{
    outline:1px solid #FC0;
}

NB. Kontur można ustawić tylko jako właściwość sharthand, a nie dla poszczególnych stron. Jest przeznaczony tylko do debugowania, ale działa dobrze.

Niezadowolony Kozioł
źródło
Wielkie dzięki! im więcej opcji mam, tym lepiej
William Calleja
Zauważyłem, że Chrome obecnie ignoruje przezroczyste ramki, więc border: 1px solid transparent nie działa już od wersji Chrome 84. Idź rysunek
MC9000
3

Ponieważ powiedziałeś w komentarzu, że im więcej masz opcji, tym lepiej, oto kolejna.

W CSS3 istnieją dwa różne tak zwane „modele pudełkowe”. Jeden dodaje obramowanie i wypełnienie do szerokości elementu blokowego, a drugi nie. Możesz użyć tego ostatniego, określając

-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;

Wtedy w nowoczesnych przeglądarkach element będzie zawsze miał tę samą szerokość. To znaczy, jeśli zastosujesz do niego obramowanie po najechaniu kursorem, szerokość obramowania nie zwiększy całkowitej szerokości elementu; ramka zostanie dodana „wewnątrz” elementu, że tak powiem. Jeśli jednak dobrze pamiętam, musisz widthwyraźnie określić, aby to zadziałało. Co prawdopodobnie nie jest dla Ciebie opcją w tym konkretnym przypadku, ale możesz o tym pamiętać w przyszłych sytuacjach.

ЯegDwight
źródło
Może to być jeden przypadek użycia przezroczystej ramki - zamiast stosować obramowanie po najechaniu kursorem, zmień jej kolor z przezroczystego na taki, który widzisz.
DaveWalley
2

Ten wpis na blogu ma sposób na emulację border-color: transparentw IE6. Poniższy przykład zawiera poprawkę „hasLayout”, która pojawia się w komentarzach do wpisu na blogu:

/* transparent border */
.testDiv {
    width: 200px;
    height: 200px;
    border: solid 10px transparent;
}
/* IE6 fix */
*html .testDiv {
    zoom: 1;
    border-color: #FEFEFE;
    filter: chroma(color=#FEFEFE);
}

Upewnij się, że border-colorzastosowana w poprawce IE6 nie jest używana w żadnym miejscu .testDivelementu. Zmieniłem przykład z pinkna, #FEFEFEponieważ wydaje się, że jest to jeszcze mniej prawdopodobne.

Synek
źródło
0

Najłatwiejszym rozwiązaniem jest użycie rgbajako koloru: border-color: rgba(0,0,0,0);jest to całkowicie przezroczysty kolor obramowania.

Jake Wilson
źródło
0

Użyj właściwości przezroczystej

border-color : transparent;
Prabesh Guragain
źródło