CSS: espacio de control entre viñeta y <li>


177

Me gustaría controlar cuánto espacio horizontal empuja una bala <li>hacia la derecha en un<ol> o <ul>.

Es decir, en lugar de tener siempre

*  Some list text goes
   here.

Me gustaría poder cambiar eso para ser

*         Some list text goes
          here.

o

*Some list text goes
 here.

Miré a mi alrededor pero solo pude encontrar instrucciones para desplazar todo el bloque hacia la izquierda o hacia la derecha, por ejemplo, http://www.alistapart.com/articles/taminglists/


Respuestas:


161

Coloque su contenido en un lugar spanrelativamente posicionado, luego puede controlar el espacio por la leftpropiedad del span.

li span {
  position: relative;
  left: -10px;
}
<ul>
  <li><span>item 1</span></li>
  <li><span>item 2</span></li>
  <li><span>item 3</span></li>
</ul>


Solo para aclarar, la etiqueta <span> puede ser semántica cuando se le asigna una clase, por ejemplo, <span class = "tel"> 123-456-7890 </span> es implícitamente semántica.
ingyhere

44
+1 para responder realmente la pregunta del chico;) (aunque el lapso idealmente en la vida real debería tener una clase de todos modos para una buena práctica de protección futura y semántica: si en el futuro cualquier javascript o desarrollo de nuevas características, etc., tuviera una buena razón para agregar tramos adicionales a su contenido, las cosas podrían ponerse desordenadas)
user56reinstatemonica8

en firefox no se muestra correctamente el texto se superpone a las balas usando este truco
Jay Bhalodi

@ingyhere Dudo que esto sea cierto, ya que no puedo encontrar nada que pruebe esta afirmación. ¿Puedes proporcionar alguna fuente?
El

@Wolle Hmmm. Es un comentario antiguo, y no estoy seguro de la preocupación: si se trata de si <SPAN>puede utilizar ido classetiquetar, eche un vistazo al W3C . Si la pregunta es si puede transmitir un significado semántico, vea esta respuesta . Técnicamente, la <SPAN>etiqueta es un elemento en línea no semántico en sí mismo, pero de alguna manera ofrece una mayor flexibilidad en su reutilización. Hoy en día, creo que uno puede usar el inline-blockdescriptor para permitir una gama mucho mayor de opciones de formato.
ingyhere

120

Para resumir las otras respuestas aquí, si desea un control más preciso sobre el espacio entre viñetas y el texto en un <li>elemento de la lista, sus opciones son:

(1) Use una imagen de fondo:

<style type="text/css">
li {
    list-style-type:none;
    background-image:url(bullet.png);
}
</style>

<ul>
    <li>Some text</li>
</ul>

Ventajas:

  • Puedes usar cualquier imagen que quieras para la viñeta
  • Puede usar CSS background-positionpara colocar la imagen prácticamente en cualquier lugar que desee en relación con el texto, utilizando píxeles, ems o%

Desventajas

  • Agrega un archivo de imagen adicional (aunque pequeño) a su página, aumentando el peso de la página
  • Si un usuario aumenta el tamaño del texto en su navegador, la viñeta se mantendrá en el tamaño original. También es probable que se salga de su posición a medida que aumenta el tamaño del texto.
  • Si está desarrollando un diseño 'receptivo' utilizando solo porcentajes para anchos, podría ser difícil obtener la viñeta exactamente donde lo desea en un rango de anchos de pantalla

2. Use relleno en la <li>etiqueta

<style type="text/css">
ul {padding-left:1em}
li {padding-left:1em}
</style>

<ul>
    <li>Some text</li>
</ul>

Ventajas:

  • Sin imagen = 1 archivo menos para descargar
  • Al ajustar el relleno en el <li>, puede agregar tanto espacio horizontal adicional entre la viñeta y el texto como desee
  • Si el usuario aumenta el tamaño del texto, el espaciado y el tamaño de la viñeta deberían escalarse proporcionalmente

Desventajas

  • No se puede mover la viñeta más cerca del texto que el valor predeterminado del navegador
  • Limitado a formas y tamaños de los tipos de viñetas incorporados de CSS
  • La viñeta debe ser del mismo color que el texto.
  • No hay control sobre el posicionamiento vertical de la bala.

(3) Envuelva el texto en un <span>elemento extra

<style type="text/css">
li {
    padding-left:1em;
    color:#f00; /* red bullet */
}
li span {
    display:block;
    margin-left:-0.5em;
    color:#000; /* black text */
}
</style>

<ul>
    <li><span>Some text</span></li>
</ul>

Ventajas:

  • Sin imagen = 1 archivo menos para descargar
  • Se obtiene un mayor control sobre la posición de la bala que con la opción (2) - se puede mover más cerca del texto (aunque a pesar de mis mejores esfuerzos, parece que no se puede alterar la posición vertical mediante la adición padding-topa la<span> . Alguien más puede tener una solución para esto, sin embargo ...)
  • La viñeta puede tener un color diferente al del texto.
  • Si el usuario aumenta su tamaño de texto, la viñeta debería escalar en proporción (siempre que configure el margen y el margen en ems, no px)

Desventajas

  • Requiere un elemento no semántico adicional (esto probablemente le hará perder más amigos en SO de lo que lo hará en la vida real), pero es molesto para aquellos a quienes les gusta que su código sea lo más ágil y eficiente posible, y viola la separación de presentación y contenido que se supone que debe ofrecer HTML / CSS)
  • No hay control sobre el tamaño y la forma de la bala.

Esperamos algunas nuevas características de estilo de lista en CSS4, para que podamos crear viñetas más inteligentes sin recurrir a imágenes o marcas adicionales :)


44
Gran respuesta. Para que funcione el # 2, asegúrese de mantener su posición de estilo de lista outside.
Tom Auger

El elemento span es la solución para mí. Hice +1 en esta respuesta solo porque prefería el margen negativo al posicionamiento absoluto negativo, sin ninguna buena razón.
FlipMcF

Si tiene texto que envuelve líneas, descubrí que tenía que agregar display: block;al elemento span para que el texto ajustado también se alineara (también terminé usando etiquetas de anclaje en lugar de espacios)
Kevin M

Usar imágenes de fondo para cualquier cosa que no sea solo eso es casi siempre una muy mala idea. No se pueden guardar, no se imprimen y los lectores de pantalla no los mencionan. Usar <span> es la forma más elegante de resolver esto. los rellenos no funcionarán ya que también cambian la posición de las balas.
Bachsau

3
NUNCA usaría la imagen de fondo para esto. Siempre puede usar el elemento: before con el contenido: "•"; luego, usa relleno y posición absoluta en ese elemento anterior para controlarlo.
Yann Chabot

37

Esto debería hacerlo. Asegúrese de colocar sus balas en el exterior. También puede usar pseudo elementos CSS si puede soltarlos en IE7 hacia abajo. Realmente no recomiendo usar pseudo elementos para este tipo de cosas, pero funciona para controlar la distancia.

ul {
  list-style: circle outside;
  width: 100px;
}

li {
  padding-left: 40px;
}

.pseudo,
.pseudo ul {
  list-style: none;
}

.pseudo li {
  position: relative;
}

/* use ISO 10646 for content http://la.remifa.so/unicode/named-entities.html */
.pseudo li:before {
  content: '\2192';
  position: absolute;
  left: 0;
}
<ul>
  <li>Any Browser really</li>
  <li>List item
    <ul>
      <li>List item</li>
      <li>List item</li>
    </ul>
  </li>
</ul>

<ul class="pseudo">
  <li>IE8+ only</li>
  <li>List item
    <ul>
      <li>List item with two lines of text for the example.</li>
      <li>List item</li>
    </ul>
  </li>
</ul>


55
No puedo creer que esta respuesta no sea aceptada. Es 100% CSS, no agrega ningún elemento <span> superfluo, ¡y finalmente me hizo entender por qué hay una opción interna / externa! (y es la respuesta aceptada de la pregunta duplicada mencionada ...)
MindTailor

1
Usar list-style-position: outsidey rellenar los LIelementos le permite aumentar la distancia entre los puntos de viñeta, pero aún así no funciona al revés más allá de un desplazamiento especificado por el navegador. Ver este JS Bin .
Mesagoma

44
Anexo: En los navegadores modernos (IE9 +, FF, Chrome, etc.), use un signo negativo text-indenten <UL>o <LI>para negar la distancia impuesta por el navegador entre la viñeta y el <LI>contenido. Es decir, aumente padding-leftcomo se muestra arriba para aumentar la distancia y reduzca text-indentpara reducir la distancia entre la viñeta y el contenido según lo desee.
Mesagoma

1
Por desgracia , para todos los navegadores de escritorio mencionados anteriormente, si el contenido de una <LI>envoltura en una segunda línea, esas líneas posteriores terminan siendo sangradas en función del margen / relleno / sangría que logramos deshacer para la primera línea text-indent. Suspiro
Mesagoma

Otra opción es utilizar los pseudoelementos: before y configurar el contenido como desee. desde allí, coloque los pseudo elementos como desee.
Kevin

14

Antigua pregunta, pero el: antes del pseudo elemento funciona bien aquí.

<style>
    li:before {
        content: "";
        display: inline-block;
        height: 1rem;  // or px or em or whatever
        width: .5rem;  // or whatever space you want
    }
</style>

Funciona muy bien y no requiere muchas reglas adicionales o html.

<ul>
    <li>Some content</li>
    <li>Some other content</li>
</ul>

¡Salud!


3
Buena y simple respuesta. margin-left: -5px<li>
Agregaría

2
Nota: Esto no admite sangrías colgantes
Eric

Impresionante respuesta, ¡esto funcionó perfectamente con la mínima cantidad de trabajo! ¡Gracias!
KyleFarris

12

Para list-style-type: en línea :

Es casi lo mismo que la respuesta de DSMann8 pero menos código CSS.

Solo necesitas

<style>
    li:before {
        content: "";
        padding-left: 10px;
    }
</style>

<ul>
    <li>Some content</li>
</ul>

Salud


Esto también funciona list-style-position: inside, ¡lo cual es genial!
Matt Dodge

11

Puede usar el padding-leftatributo en los elementos de la lista (¡ no en la lista misma!).


55
Tenga en cuenta que esto solo funciona si list-style-positionestá configurado como predeterminado outside.
agosto

Esta debería ser la respuesta aceptada, al menos para el uso normal. Evita usar un <span>elemento solo para fines de diseño.
Eukras

7

Usar sangría de texto en li funciona mejor.

sangría de texto: -x px; moverá la bala más cerca de li y viceversa.

El uso de relativo en el intervalo de la izquierda negativa podría no funcionar correctamente con versiones anteriores para IE. PD: evita dar posiciones tanto como puedas.


Esto se comporta de manera extraña en Chrome. Se ajusta a poco espacio a -5px;
Ian Warburton

7

Aquí hay otra solución usando css counter y pseudo elementos. Me parece más elegante, ya que no requiere el uso de marcado html adicional ni clases de CSS:

ol,
ul {
    list-style-position: inside;
}

li {
    list-style-type: none;
}

ol {
    counter-reset: ol; //reset the counter for every new ol
}

ul li:before {
        content: '\2022 \00a0 \00a0 \00a0'; //bullet unicode followed by 3 non breakable spaces
}

ol li:before {
        counter-increment: ol;
        content: counter(ol) '.\00a0 \00a0 \00a0'; //css counter followed by a dot and 3 non breakable spaces
}

Utilizo espacios no rompibles para que el espaciado solo afecte a la primera línea de los elementos de mi lista (si el elemento de la lista tiene más de una línea de largo). Puedes usar relleno aquí en su lugar.


7

Antigua pregunta pero aún relevante. Recomiendo usar negativo text-indent. list-style-positiondebe ser outside.

Pros:

  • La bala se posiciona correctamente de forma automática
  • Cambiar el tamaño de fuente no rompe la posición de la viñeta
  • Sin elementos adicionales (no :: pseudo-elementos también)
  • Funciona tanto para RTL como para LTR sin cambios en CSS.

Contras:

  • tratar
  • a
  • encontrar
  • uno :)

2
Intenté usar este método, pero la sangría no funciona para mí si hay saltos de línea. La sangría de texto solo sangrará la primera línea.
Matt

6

Una lista desordenada comienza con la etiqueta ul. Cada elemento de la lista comienza con Los elementos de la lista se marcarán con viñetas (pequeños círculos negros) de forma predeterminada:

    <!DOCTYPE html>
    <html>
       <body>
          <h2>Normal List </h2>
          <ul>
             <li>Coffee</li>
             <li>Tea</li>
             <li>Milk</li>
          </ul>
       </body>
    </html>

Salida:

<!DOCTYPE html>
<html>
<body>

<h2>Normal List </h2>

<ul>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>

</body>
</html>

La propiedad de sangría de texto especifica la sangría de la primera línea en un bloque de texto.
Nota: Se permiten valores negativos. La primera línea se sangrará a la izquierda si el valor es negativo.

<ul style='text-indent: -7px;'>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>

Gracias por la respuesta, intente anotar sus soluciones, sin embargo, para facilitar la comprensión de los demás.
cdomination

Esta es la mejor respuesta y debe ser aceptada. CSS mínimo!
KawaiKx

5

Parece que puede (de alguna manera) controlar el espaciado utilizando relleno en la etiqueta <li>.

<style type="text/css">
    li { padding-left: 10px; }
</style>

El problema es que no parece permitirte arrugarlo como tu ejemplo final.

Para eso, puede intentar desactivar list-style-type y usar & bull;

<ul style="list-style-type: none;">
    <li>&bull;Some list text goes here.</li>
</ul>

5

Parece que hay una solución mucho más limpia si solo desea reducir el espacio entre la viñeta y el texto:

li:before {
    content: "";
    margin-left: -0.5rem;
}

4

También puede utilizar un reemplazo de imagen de fondo como alternativa, que le brinda un control total sobre el posicionamiento vertical y horizontal.

Ver la respuesta a esta pregunta



0

Puede usar ul li:beforey una imagen de fondo, y asignar position: relativey position:absolutea liy li:before, respectivamente. De esta manera, puede crear una imagen y colocarla donde desee en relación con el li.


0

Úselo padding-left:1em; text-indent:-1empara la <li>etiqueta.
Entonces, list-style-position: insidepara la <ul>etiqueta.

<ul style='list-style-position: inside;'>
  <li style='padding-left: 1em; text-indent: -1em;'>Item 1</li>
</ul>

0

La siguiente solución funciona bien cuando desea mover el texto más cerca de la viñeta e incluso si tiene varias líneas de texto.

margin-right le permite mover el texto más cerca de la viñeta

text-indent asegura que varias líneas de texto aún se alineen correctamente

li:before {
  content: "";
  margin-right: -5px; /* Adjust this to move text closer to the bullet */
}

li {
  text-indent: 5px; /* Aligns second line of text */
}
<ul>
  <li> Item 1 ... </li>
  <li> Item 2 ... this item has tons and tons of text that causes a second line! Notice how even the second line is lined up with the first!</li>
  <li> Item 3 ... </li>
</ul>

ingrese la descripción de la imagen aquí


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.