Desplaza una imagen de fondo desde la derecha usando CSS

443

¿Hay alguna manera de colocar una imagen de fondo a una cierta cantidad de píxeles desde la derecha de su elemento?

Por ejemplo, para colocar algo a una cierta cantidad de píxeles (digamos, 10) desde la izquierda , así es como lo haría:

#myElement {
    background-position: 10px 0;
}
nickf
fuente
¿Seguramente no quieres decir background-position: -10px 0;? Solo comprobando :)
thirtydot
1
Sé que esto tiene varios duplicados, pero no puedo encontrar ninguno de ellos.
Pekka
1
@thirtydot que lo mueve 10 píxeles hacia la izquierda desde el borde izquierdo.
nickf
es estúpido que no esté disponible ...
Juan
@nickf te das cuenta de que no estaba disponible en la mayoría de los dispositivos para finales de 2013, ¿verdad?
Juan

Respuestas:

786

Encontré útil esta característica CSS3:

/* to position the element 10px from the right */
background-position: right 10px top;

Hasta donde sé, esto no es compatible con IE8. En el último Chrome / Firefox funciona bien.

Ver ¿Puedo usar? para obtener detalles sobre los navegadores compatibles?

Fuente utilizada: http://tanalin.com/en/blog/2011/09/css3-background-position/

Actualización :

Esta característica ahora es compatible con todos los principales navegadores, incluidos los navegadores móviles.

Steven
fuente
23
Esto es genial, pero desafortunadamente no funciona en Safari 5.1.7 (que es extremadamente importante si se ve desde teléfonos móviles)
MosheElisha
55
Funciona ahora en dispositivos móviles (marcado en Android, iOS y WindowsPhone). Todavía Safari 5.1.7 no es compatible con la posición de fondo dada aquí.
Szorstki
8
Estoy usando esto pero con un porcentaje de reserva para navegadores antiguos, por ejemplo. posición de fondo: 95% centro; posición de fondo: centro de 13px derecho;
gregdev
1
No estoy seguro de cuántas personas siguen usando navegadores lo suficientemente antiguos como para no admitir esto. Los usuarios de Safari ya deberían tener una versión más nueva, aunque todavía hay muchos dispositivos Android más antiguos. caniuse.com/#feat=css-background-offsets Es bastante fácil usar un porcentaje de reserva para estos (aunque no es exactamente lo mismo).
Mark
29
Tenga en cuenta que esto solo funciona si especifica una posición cardinal para la posición vertical y horizontal, como right left top bottom. Por ejemplo, lo siguiente no se procesará: background-position: right 10px 10pxpero debe escribirse comobackground-position: right 10px top 10px
chadiusvt
110

!! Respuesta desactualizada, ya que CSS3 trajo esta característica

¿Hay alguna manera de colocar una imagen de fondo a una cierta cantidad de píxeles desde la derecha de su elemento?

No

Las soluciones populares incluyen

  • establecer un margin-right en el elemento en su lugar
  • Agregar píxeles transparentes a la imagen misma y posicionarla top right
  • o calcular la posición usando jQuery después de conocer el ancho del elemento.
Pekka 웃
fuente
66
Un soporte más completo para la 'posición de fondo' CSS3 extendida está a la vuelta de la esquina: stackoverflow.com/questions/501375/…
Vlad Magdalin
92

La solución más fácil es usar porcentajes. Esta no es exactamente la respuesta que estaba buscando, ya que solicitó precisión de píxeles, pero si solo necesita algo para tener un poco de relleno entre el borde derecho y la imagen, dar algo a una posición del 99% generalmente funciona lo suficientemente bien.

Código:

/* aligns image to the vertical center and horizontal right of its container with a small amount of padding between the right edge */
div.middleleft {
  background: url("/images/source.jpg") 99% center no-repeat;
}
Matt Brock
fuente
30
+1 "Pasaremos por la alineación de píxeles la próxima semana": siempre funciona.
moonwave99
2
Esta solución parece funcionar de manera más consistente en todos los navegadores.
Evan Haas
49

Respuesta desactualizada: ahora se implementa en los principales navegadores, consulte las otras respuestas a esta pregunta.

CSS3 ha modificado la especificación de background-positionmodo que funcione con diferentes puntos de origen. Desafortunadamente, no puedo encontrar ninguna evidencia de que esté implementado todavía en ninguno de los principales navegadores.

http://www.w3.org/TR/css3-background/#the-background-position Véase el ejemplo 12.

background-position: right 3em bottom 10px;
Tami
fuente
Gracias Tami! Desafortunadamente, esto no funcionó para mí ni en Firefox 4 ni en Chrome 11.
nickf
Esto se implementa en Opera. Pensé que era demasiado bueno para ser verdad y luego lo probé en otros navegadores y tenía razón.
Vian Esterhuizen
1
Esto todavía no funciona en la versión actual de Chrome. Version 21.0.1180.89
andlrc
3
Chrome Canary (v26) ahora es compatible con esto. Una vez que llegue al canal de lanzamiento y Safari actualice su motor, solo IE6-8 carecerá de soporte (IE9 / 10 ya admite el nuevo formato).
Vlad Magdalin
1
Acabo de probar esto y ahora funciona en Firefox (v.18.0.2), IE (v.9.0.8) y Chrome (v.25.0.1364.97), pero aún no funciona en Safari (v.5.1.2) . Me encantaría saber si alguien sabe cuándo se puede implementar ;-)
Chaya Cooper
40

Como se propone aquí , esta es una solución de navegador cruzado que funciona perfectamente:

background: url('/img.png') no-repeat right center;
border-right: 10px solid transparent;

Lo utilicé ya que la función CSS3 de especificar las compensaciones propuestas en la respuesta marcada como resolver la pregunta aún no es compatible con los navegadores. P.ej

luksak
fuente
1
¿Qué pasa cuando necesito que ese borde sea de cierto color?
machineaddict
1
Esta es una gran respuesta porque puede tener una precisión de píxeles mientras se mantiene compatible con todos los navegadores. ¡Gracias! (Y si desea un borde que sea de cierto color, use un contenedor de algún tipo para ajustar la entrada y agregue el borde a ese elemento.)
Gavin
23

La respuesta más apropiada es la nueva sintaxis de cuatro valores para la posición de fondo, pero hasta que todos los navegadores lo admitan, su mejor enfoque es una combinación de respuestas anteriores en el siguiente orden:

background: url(image.png) no-repeat 97% center; /* default, Android, Sf < 6 */
background-position: -webkit-calc(100% - 10px) center; /* Sf 6 */
background-position: right 10px center; /* Cr 25+, FF 13+, IE 9+, Op 10.5+ */
stedman
fuente
15

Un truco simple pero sucio es simplemente agregar el desplazamiento que desea a la imagen que está utilizando como fondo. no es mantenible, pero hace el trabajo.

Merosi
fuente
8

Esto funcionará en la mayoría de los navegadores modernos ... aparte de IE (soporte de navegador) . Aunque esa página enumera> = IE9 como compatible, mis pruebas no estuvieron de acuerdo con eso.

Puede usar la propiedad calc () css3 así;

.class_name {
    background-position: calc(100% - 10px) 50%;
}

Para mí, esta es la forma más limpia y lógica de lograr un margen a la derecha. También uso una alternativa de usar border-right: 10px solid transparent;para IE.

Novocaína
fuente
1
Esto es genial, pero desafortunadamente no funciona en Safari 5.1.7 (que es extremadamente importante si se ve desde teléfonos móviles)
MosheElisha
Luego, debe usar una posición de fondo que funcione en Safari, y una que pueda ser anulada por los navegadores que puedan usarla. Por ejemplo: background-position: 92% 8px; background-position: calc(100% - 12px) 8px;
Laki Politis
No funciona en todos los navegadores, amigo. La right 10px centersintaxis tiene un soporte más extendido en los navegadores.
Farzad YZ
Lea la primera línea donde afirmo que esto funciona en "los navegadores más modernos". Nunca dije que funciona en todos ellos.
Novocaína
Según caniuse, el uso de un calc colapsaría IE9 ... una vez que lo reemplazaras _con un-
Ruskin
4

Ok, si entiendo lo que estás pidiendo, harías esto;

Tiene su contenedor DIV llamado #main-containery .my-elementeso está dentro de él. Use esto para comenzar;

#main-container { 
  position:relative;
}
/*To make the element absolute - floats above all else within the parent container do this.*/
.my-element {
  position:absolute;
  top:0;
  right:10px;
}

/*To make the element apart of elements, something tangible that affects the position of other elements on the same level within the parent then do this;*/
.my-element {
  float:right;
  margin-right:10px;
}

Por cierto, es mejor usar clases si hace referencia a un elemento de nivel inferior dentro de una página (supongo que, por lo tanto, mi cambio de nombre es anterior.

Desi
fuente
3

La especificación CSS3 que permite diferentes orígenes para la posición de fondo ahora es compatible con Firefox 14 pero aún no con Chrome 21 (aparentemente IE9 los admite en parte, pero no lo he probado yo mismo)

Además del problema de Chrome al que @MattyF hizo referencia, hay un resumen más sucinto aquí: http://code.google.com/p/chromium/issues/detail?id=95085

Tom Gaulton
fuente
Acabo de probar esto, y ahora funciona en Firefox (v.18.0.2), IE (v.9.0.8) y Chrome (v.25.0.1364.97), pero no en Safari (v.5.1.2)
Chaya Cooper
3

Si tiene elementos proporcionados, puede usar:

.valid {
    background-position: 98% center;
}

.half .valid {
    background-position: 96% center;
}

En este ejemplo, .validsería la clase con la imagen y.half sería una fila con la mitad del tamaño del estándar.

Sucio, pero funciona como un encanto y es razonablemente manejable.

Nighto
fuente
1
En mi caso (usando un diseño de ancho fijo) esto hace exactamente lo que necesito. Gracias.
Gavin
3

Si desea usar esto para agregar flechas / otros íconos a un botón, por ejemplo, ¿podría usar pseudoelementos css?

Si realmente es una imagen de fondo para todo el botón, tiendo a incorporar el espacio en la imagen, y solo uso

background-position: right 0;

Pero si tengo que agregar, por ejemplo, una flecha diseñada a un botón, tiendo a tener este html:

<a href="[url]" class="read-more">Read more</a>

Y tienden a hacer lo siguiente con CSS:

.read-more{
    position: relative;
    padding: 6px 15px 6px 35px;//to create space on the right
    font-size: 13px;
    font-family: Arial;
}

.read-more:after{
    content: '';
    display: block;
    width: 10px;
    height: 15px;
    background-image: url('../images/btn-white-arrow-right.png');
    position: absolute;
    right: 12px;
    top: 10px;
}

Al usar el selector: after, agrego un elemento usando CSS solo para contener este pequeño icono. Puede hacer lo mismo simplemente agregando un lapso o<i> elemento dentro del elemento a. Pero creo que esta es una forma más limpia de agregar iconos a los botones y es compatible con varios navegadores.

Puedes ver el violín aquí: http://codepen.io/anon/pen/PNzYzZ

Stijn_d
fuente
eso debería ser content: ''; más que content:0;una solución útil para mí
Nat
3
background-position: calc(100% - 8px);
Celo Murapa
fuente
2

usa el centro a la derecha como la posición y luego agrega un borde transparente para compensarlo?

André Figueira
fuente
1
Eso no está mal, pero luego el contenido también se desplazaría desde la derecha. Esto puede o no ser un factor decisivo. Aquí hay un ejemplo de cómo se ve: jsbin.com/ijewoq/1
nickf
Piensa que es solo un caso de equilibrio con un poco de prueba y error :) ¡espero que funcione!
André Figueira
2

Si tiene un elemento de ancho fijo y conoce el ancho de su imagen de fondo, simplemente puede establecer la posición del fondo en: el ancho del elemento - el ancho de la imagen - el espacio que desea a la derecha.

Por ejemplo: con un elemento de 100 píxeles de ancho y una imagen de 300 píxeles de ancho, para obtener un espacio de 10 píxeles a la derecha, lo establece en 100-300-10 = -210 píxeles:

#myElement {
  background:url(my_image.jpg) no-repeat -210px top;
  width:100px;
}

Y obtienes los 80 píxeles más a la derecha de tu imagen a la izquierda de tu elemento, y un espacio de 20 píxeles a la derecha.

Sé que puede sonar estúpido, pero a veces ahorra tiempo ... Lo uso de manera vertical (espacio en la parte inferior) para enlaces de navegación con texto debajo de la imagen.

Sin embargo, no estoy seguro de que se aplique a su caso.

Julix
fuente
2

mi problema era que necesitaba que la imagen de fondo se mantuviera a la misma distancia del borde derecho cuando se cambia el tamaño de la ventana, es decir, para tableta / móvil, etc. Mi solución es usar un porcentaje de este modo:

background-position: 98% 6px;

y se queda en su lugar.

JC_Dev
fuente
Eso podría funcionar en situaciones en las que conozca exactamente las dimensiones de la ventana, pero durante la mayor parte del tiempo en la web, no puede estar seguro de eso. Eche un vistazo a la respuesta aceptada que funcionará en todas las situaciones (en los navegadores compatibles).
nickf
2

¡si! bien para colocar una imagen de fondo como si fuera 0px desde el lado derecho del navegador en lugar de la izquierda - yo uso:

background-position: 100% 0px;
David Jazzy Dawson
fuente