Dostosować pozycję obrazu w stylu listy?


169

Czy istnieje sposób na dostosowanie pozycji obrazu w stylu listy?

Kiedy używam wypełnienia dla elementów listy, obraz pozostanie na swoim miejscu i nie będzie się przesuwał z wypełnieniem ...


1
Szkoda, że ​​to wciąż nie jest uwzględnione w specyfikacji CSS. Jaki jest punkt, list-style-imagejeśli nie można go ustawić? Wygląda na to, że w rezultacie większość ludzi stosuje obejścia takie jak ::beforei background-imagezamiast tego.
— Mentalist

Odpowiedzi:


205

Nie całkiem. Twoje wypełnienie (prawdopodobnie) jest stosowane do elementu listy, więc wpłynie tylko na rzeczywistą zawartość elementu listy.

Połączenie stylów tła i dopełnienia może stworzyć coś, co wygląda podobnie, np

li {
  background: url(images/bullet.gif) no-repeat left top; /* <-- change `left` & `top` too for extra control */
  padding: 3px 0px 3px 10px;
  /* reset styles (optional): */
  list-style: none;
  margin: 0;
}

Być może chcesz dodać styl do kontenera listy nadrzędnej (ul), aby ustawić pozycje listy wypunktowanej, ten artykuł A List Apart ma dobre odniesienie początkowe.


1
Spowoduje to przesunięcie stylu listy nieco bardziej na prawo niż normalne elementy listy, co jest nieco „wyłączone”, jeśli poniżej znajdują się normalne elementy. Nie znam niezależnego rozwiązania, ale w zależności od szerokości obrazu poprawi to: "margin: 0 0 0 -7px;"
— e-motiv

W przypadku górnego pozycjonowania zmiana topwartości zadziałała dla mnie zamiast górnej wyściółki. background: url(images/bullet.gif) no-repeat left 8px;
— Sridhar Katakam

Szkoda, że ​​nie możesz bezpośrednio zmienić stylu listy. To sprawia, że ​​ludzie stosują różnego rodzaju obejścia. Naprawdę wolałbym używać stylu listy do czegoś, co jest naprawdę stylem listy, ale nie mogę sprawić, by wyglądało tak, jak chcę.
— mcv

75

Zwykle ukrywam typ listy i używam obrazu tła, który jest ruchomy

li 
{
    background: url(/Images/arrow_icon.gif) no-repeat 7px 7px transparent;
    list-style-type: none;
    margin: 0;
    padding: 0px 0px 1px 24px;
    vertical-align: middle;
}

„7px 7px” jest tym, co wyrównuje obraz tła wewnątrz elementu i jest również względem wypełnienia.


21

Możliwe rozwiązanie tego pytania, o którym jeszcze nie wspomniano, jest następujące:

    li {
        position: relative;
        list-style-type: none;
    }

    li:before {
        content: "";
        position: absolute;
        top: 8px;
        left: -16px;
        width: 8px;
        height: 8px;
        background-image: url('your-bullet.png');
    }

Możesz teraz użyć górnej / lewej części li: before, aby ustawić nowy punktor. Zwróć uwagę, że szerokość i wysokość li: before muszą mieć takie same wymiary, jak wybrany obraz tła. Działa to w przeglądarce Internet Explorer 8 i nowszych.


To moim zdaniem najlepsze rozwiązanie. Jeśli wyślesz pseudoelement :: before po lewej stronie, osiągniesz ten sam efekt.
— TaylorMac,

12

Miałem ten sam problem, ale nie mogłem użyć opcji tła (i nie chciałem używać wielu środowisk), więc pomyślałem o innym rozwiązaniu

to jest przykład menu, które ma kwadratowy wskaźnik dla aktywnej / bieżącej pozycji menu (domyślny styl listy jest ustawiony na Brak w innej regule)

nav ul li.active>a:before{
    content: "■";
    position: absolute;
    top: -22px;
    left: 55px;
    font-size: 33px;

}

tworzy kwadrat za pomocą znaku kwadratu z pseudoklasą „: before” i można go dowolnie pozycjonować za pomocą pozycjonowania bezwzględnego.


8

Oto, co zrobiłem, aby małe szare bloki były po lewej stronie i pośrodku tekstu ze zwiększoną wysokością linii:

line-height:200%;
padding-left:13px;
background-image:url('images/greyblock.gif');
background-repeat:no-repeat;
background-position:left center;

Mam nadzieję, że to komuś pomoże: D


6

Ostatecznie zdecydowałem się na zmodyfikowanie samego obrazu, aby dodać trochę odstępów.

Używanie obrazu tła na li, jak niektórzy sugerują, działa w wielu przypadkach, ale kończy się niepowodzeniem, gdy lista jest używana razem z obrazkiem pływającym (na przykład, aby tekst zawinął się wokół obrazu).

Mam nadzieję że to pomoże.


6

Inną opcją, którą możesz zrobić, jest:

li:before{
    content:'';
    padding: 0 0 0 25px;
    background:url(../includes/images/layouts/featured-list-arrow.png) no-repeat 0 3px;
}

Użyj (0 3px), aby ustawić obraz listy.

Działa w IE8 +, Chrome, Firefox i Opera.

Używam tej opcji, ponieważ możesz łatwo zamienić styl listy i jest duża szansa, że ​​nawet nie będziesz musiał używać obrazu. (skrzypce poniżej)

http://jsfiddle.net/flashminddesign/cYAzV/1/

AKTUALIZACJA:

To uwzględni tekst / treść przechodzącą do drugiej linii:

ul{ 
    list-style-type:none;
}

li{
    position:relative;
}

ul li:before{
    content:'>';
    padding:0 10px 0 0;
    position:absolute;
    top:0; left:-10px;
}

Dodaj dopełnienie po lewej: do li, jeśli chcesz mieć więcej miejsca między punktorem a treścią.

http://jsfiddle.net/McLeodWebDev/wfzwm0zy/


1
zaktualizowana wersja zajmie się dodatkową linią JSfiddle
— McLeodWebDev


3

Myślę, że naprawdę chcesz dodać wypełnienie (obecnie dodajesz do <li>) do tagu <ul>, a następnie punkty będą przesuwać się wraz z tekstem <li>.

Istnieje również pozycja w stylu listy, na którą możesz spojrzeć. Wpływa na sposób zawijania linii wokół obrazów punktorów.


3

jak odpowiedź „darren”, ale niewielka modyfikacja

li 
{
background: url("images/bullet.gif") left center no-repeat;
padding-left: 14px;
margin-left: 24px;
}

działa w różnych przeglądarkach, wystarczy dostosować dopełnienie i marginesy

Edytuj zagnieżdżone: dodaj ten styl, aby dodać lewy margines do pod-zagnieżdżonej listy

ul ul {margin-left: 15px; }


3

Używam czegoś takiego, wydaje mi się całkiem czysty i prosty:

ul { 
     list-style:  none;
     /* remove left padding, it's usually unwanted: */
     padding:  0;
}

li:before {
     content:  url(icon.png);
     display:  inline-block;
     vertical-align:  middle;

     /* If you want some space between icon and text: */
     margin-right:   1em;
}

Powyższy kod działa tak, jak w większości moich przypadków.
W celu dokładnej regulacji możesz zmodyfikować vertical-align, np .:

vertical-align:  top;

/* or */
vertical-align:  -10px;

/* or whatever you need instead of "middle" */

Można ustawić list-style: nonena lizamiast uljeśli wolisz.


0

Zaakceptowana odpowiedź wydaje mi się trochę dziwna, zdecydowanie też musi przepychać się dodatkowymi komendami dopełnienia i css.

Nigdy nie dodaję dopełnienia do listy elementów osobiście, zwykle kontrolując wysokość wiersza i sporadyczny margines wystarczy.

Kiedy mam problem z wyrównaniem z niestandardowymi obrazami w stylu listy, po prostu dodaję piksel lub dwa dodatkowe miejsce wokół dowolnej strony, która jest wymagana, aby dostosować jej położenie względem każdej linii listy.


Nigdy nie miałeś do czynienia z renderowaniem w różnych przeglądarkach, prawda?
— Volker E.

0

rozwiązanie z fontawesome

#polyNedir ul li { position:relative;padding-left:20px }
#polyNedir ul li:after{font-family:fontawesome;content:'\f111';position:absolute;left:0px;top:3px;color:#fff;font-size:10px;}

0

Ukryj domyślny obraz punktora i używaj go, background-imageponieważ masz znacznie większą kontrolę, na przykład:

li {
    background-image: url(https://material.io/tools/icons/static/icons/baseline-add-24px.svg);
    background-repeat: no-repeat;
    background-position: left 50%;
    padding-left: 2em;
}

ul {
    list-style: none;
}
<ul>
<li>foo</li>
<li>bar</li>
</ul>


0

My solution:

ul {
    line-height: 1.3 !important;
    li {
        font-size: x-large;
        position: relative;
        &:before {
            content: '';
            display: block;
            position: absolute;
            top: 5px;
            left: -25px;
            height: 23px;
            width: 23px;
            background-image: url(../img/list-char.png) !important;
            background-size: 23px;
            background-repeat: no-repeat;
        }
    }
}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.