Desloque uma imagem de fundo da direita usando CSS

443

Existe uma maneira de posicionar uma imagem de plano de fundo em um determinado número de pixels à direita de seu elemento?

Por exemplo, para posicionar algo com um certo número de pixels (digamos, 10) da esquerda , é assim que eu faria:

#myElement {
    background-position: 10px 0;
}
nickf
fonte
Você certamente não quer dizer background-position: -10px 0;? Apenas checando :) #
3030dotdot
1
Eu sei que isso tem várias duplicatas, mas não consigo encontrar nenhuma delas.
Pekka
1
@thirtydot que o move 10 pixels para a esquerda a partir da borda esquerda.
nickf 28/02
seu estúpido que ele não é disponível ...
Juan
@nickf você percebe que não estava disponível na maioria dos dispositivos até o final de 2013, certo?
317 Juan Juan

Respostas:

786

Achei esse recurso CSS3 útil:

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

Tanto quanto sei, isso não é suportado no IE8. No mais recente Chrome / Firefox, funciona bem.

Consulte Posso usar para obter detalhes sobre os navegadores suportados.

Fonte usada: http://tanalin.com/en/blog/2011/09/css3-background-position/

Atualização :

Agora, esse recurso é suportado em todos os principais navegadores, incluindo navegadores móveis.

Steven
fonte
23
Isso é ótimo, mas infelizmente ele não funciona no Safari 5.1.7 (que é extremamente importante para a vista de telefones móveis)
MosheElisha
5
Ele funciona agora em dispositivos móveis (verificado no Android, iOS e WindowsPhone). Ainda o Safari 5.1.7 não suporta a posição de fundo fornecida como aqui.
precisa saber é o seguinte
8
Estou usando isso, mas com uma porcentagem de fallback para navegadores mais antigos, por exemplo. posição de fundo: 95% do centro; posição de fundo: centro 13px direito;
gregdev
1
Não tenho certeza de quantas pessoas ainda estão usando navegadores com idade suficiente para não suportar isso. Os usuários do Safari devem estar em uma versão mais recente agora, embora muitos dispositivos Android mais antigos ainda estejam disponíveis. caniuse.com/#feat=css-background-offsets Fácil o suficiente para usar um percentual de fallback para eles (embora não seja exatamente o mesmo).
Mark
29
Observe que isso só funciona se você especificar uma posição cardinal para as posições vertical e horizontal, como right left top bottom. Por exemplo, o seguinte não será renderizado: background-position: right 10px 10pxmas deve ser escrito comobackground-position: right 10px top 10px
chadiusvt 14/08/2015
110

!! Resposta desatualizada, pois CSS3 trouxe esse recurso

Existe uma maneira de posicionar uma imagem de plano de fundo em um determinado número de pixels à direita de seu elemento?

Não.

Soluções populares incluem

  • definindo um margin-rightno elemento
  • adicionando pixels transparentes à própria imagem e posicionando-a top right
  • ou calcular a posição usando jQuery depois que a largura do elemento for conhecida.
Pekka 웃
fonte
6
Um apoio mais abrangente para o CSS3 estendida 'background-position' está ao virar da esquina: stackoverflow.com/questions/501375/...
Vlad Magdalin
92

A solução mais fácil é usar porcentagens. Esta não é exatamente a resposta que você estava procurando desde que pediu precisão em pixels, mas se você precisar de algo para ter um pequeno preenchimento entre a borda direita e a imagem, dar a uma posição de 99% algo geralmente funciona bem o suficiente.

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
fonte
30
+1 "Veremos o alinhamento de pixels na próxima semana" - sempre funciona.
moonwave99
2
Esta solução parece funcionar de forma mais consistente nos navegadores.
Evan Haas
49

Resposta desatualizada: Agora está implementado nos principais navegadores. Consulte as outras respostas para esta pergunta.

O CSS3 modificou a especificação de background-positionpara que funcione com diferentes pontos de origem. Infelizmente, não consigo encontrar nenhuma evidência de que ela tenha sido implementada nos principais navegadores.

http://www.w3.org/TR/css3-background/#the-background-position Veja o exemplo 12.

background-position: right 3em bottom 10px;
Tami
fonte
Obrigado Tami! Infelizmente, isso não funcionou para mim em qualquer Firefox 4 ou Chrome 11.
nickf
Isso é implementado no Opera. Achei que era bom demais para ser verdade e testei em outros navegadores e estava certo.
Vian Esterhuizen
1
Isso ainda não funciona na versão atual do Chrome. Version 21.0.1180.89
andlrc
3
O Chrome Canary (v26) agora suporta isso. Quando isso chegar ao canal de lançamento e o Safari atualizar seu mecanismo, apenas o IE6-8 não terá suporte (o IE9 / 10 já suporta o novo formato).
precisa saber é o seguinte
1
Acabei de testar isso e agora está trabalhando no Firefox (v.18.0.2), IE (v.9.0.8) e Chrome (v.25.0.1364.97), mas ainda não está funcionando no Safari (v.5.1.2) . Gostaria de saber se alguém sabe quando isso pode ser desenrolado ;-)
Chaya Cooper
40

Conforme proposto aqui , esta é uma solução bonita para vários navegadores que funciona perfeitamente:

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

Eu o usei, pois o recurso CSS3 de especificar as compensações propostas na resposta marcada como solução da questão ainda não é suportado nos navegadores. Por exemplo

luksak
fonte
1
E quando eu preciso que essa borda tenha uma determinada cor?
precisa saber é o seguinte
1
Essa é uma ótima resposta, pois você pode ter precisão de pixel, mantendo-o compatível com vários navegadores. Obrigado! (E se você quiser uma fronteira que é uma determinada cor, use uma capa de algum tipo para embrulhar a entrada e adicionar o limite a esse elemento.)
Gavin
23

A resposta mais apropriada é a nova sintaxe de quatro valores para a posição de segundo plano, mas até que todos os navegadores suportem, sua melhor abordagem é uma combinação de respostas anteriores na seguinte ordem:

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
fonte
15

Um truque simples, porém sujo, é simplesmente adicionar o deslocamento desejado à imagem que você está usando como plano de fundo. não é sustentável, mas faz o trabalho.

Merosi
fonte
8

Isso funcionará nos navegadores mais modernos ... além do IE (suporte ao navegador) . Embora essa página lista> = IE9 como compatível, meus testes não concordaram com isso.

Você pode usar a propriedade calc () css3 assim;

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

Para mim, esta é a maneira mais limpa e lógica de obter uma margem para a direita. Eu também uso um substituto do border-right: 10px solid transparent;IE.

Novocaína
fonte
1
Isso é ótimo, mas infelizmente ele não funciona no Safari 5.1.7 (que é extremamente importante para a vista de telefones móveis)
MosheElisha
Em seguida, você deve usar uma posição em segundo plano que funcione no Safari e uma que possa ser substituída por navegadores que possam usá-lo. Por exemplo: background-position: 92% 8px; background-position: calc(100% - 12px) 8px;
Laki Politis
Não funciona em todos os navegadores, cara. A right 10px centersintaxe possui mais suporte estendido nos navegadores.
Farzad YZ 03/02
Por favor, leia a primeira linha em que afirmo que isso funciona nos "navegadores mais modernos". Eu nunca disse que funciona em todos eles.
Novocaine
De acordo com caniuse, o uso de um calc iria falhar IE9 ... uma vez que você substituiu o _com um-
Ruskin
4

Ok, se eu entendo o que você está pedindo, você faria isso;

Você tem seu contêiner DIV chamado #main-containere .my-elementestá nele. Use isso para você começar;

#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;
}

A propósito, é melhor usar classes se você fizer referência a um elemento de nível inferior em uma página (presumo que você seja o meu nome alterado acima.

Desi
fonte
3

A especificação CSS3, que permite origens diferentes para a posição de segundo plano, agora é suportada no Firefox 14, mas ainda não no Chrome 21 (aparentemente o IE9 as suporta parcialmente, mas eu ainda não testei)

Além do problema do Chrome que o @MattyF referenciou, há um resumo mais sucinto aqui: http://code.google.com/p/chromium/issues/detail?id=95085

Tom Gaulton
fonte
Acabei de testar isso e agora está funcionando no Firefox (v.18.0.2), IE (v.9.0.8) e Chrome (v.25.0.1364.97), mas não no Safari (v.5.1.2)
Chaya Cooper
3

Se você tiver elementos proporcionais, poderá usar:

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

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

Neste exemplo, .validseria a classe com a imagem e.half seria uma linha com metade do tamanho da padrão.

Sujo, mas funciona como um encanto e é razoavelmente gerenciável.

Nighto
fonte
1
No meu caso (usando um layout de largura fixa), isso faz exatamente o que eu preciso. Obrigado.
Gavin
3

Se você quiser usar isso para adicionar setas / outros ícones a um botão, por exemplo, poderá usar pseudoelementos css?

Se for realmente uma imagem de plano de fundo para o botão inteiro, costumo incorporar o espaçamento na imagem e usar

background-position: right 0;

Mas se eu tiver que adicionar, por exemplo, uma seta projetada a um botão, eu tenderá a ter este html:

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

E tende a fazer o seguinte com 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;
}

Usando o seletor: after, adiciono um elemento usando CSS apenas para conter esse pequeno ícone. Você pode fazer o mesmo adicionando uma extensão ou<i> elemento dentro do elemento a. Mas acho que essa é uma maneira mais limpa de adicionar ícones aos botões e é compatível com vários navegadores.

você pode conferir o violino aqui: http://codepen.io/anon/pen/PNzYzZ

Stijn_d
fonte
que deve ser content: ''; mais do que content:0;mas esta era uma solução útil para mim
Nat
3
background-position: calc(100% - 8px);
Zeal Murapa
fonte
2

usar centro direito como a posição e adicionar uma borda transparente para compensá-la?

André Figueira
fonte
1
Isso não é ruim, mas o conteúdo também seria deslocado da direita. Isso pode ou não ser um desastre. Aqui está um exemplo de como ela se parece: jsbin.com/ijewoq/1
nickf
Pense que é apenas um caso de equilibrar com um pouco de tentativa e erro :) espero que funcione!
André Figueira
2

Se você possui um elemento de largura fixa e conhece a largura da sua imagem de plano de fundo, basta definir a posição do plano de fundo para: largura do elemento - largura da imagem - a lacuna desejada à direita.

Por exemplo: com um elemento de 100 px e uma imagem de 300 px, para obter um intervalo de 10 px à direita, você o define como 100-300-10 = -210 px:

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

E você obtém os 80 pixels mais à direita da sua imagem à esquerda do seu elemento e um intervalo de 20 px à direita.

Eu sei que pode parecer estúpido, mas às vezes economiza tempo ... Eu uso muito isso de maneira vertical (lacuna na parte inferior) para links de navegação com texto abaixo da imagem.

Não tenho certeza se isso se aplica ao seu caso.

Julix
fonte
2

meu problema era que eu precisava da imagem de plano de fundo para manter a mesma distância da borda direita quando a janela é redimensionada, ou seja, para tablet / celular etc. Minha correção é usar um percenatge como:

background-position: 98% 6px;

e fica no lugar.

JC_Dev
fonte
Isso pode funcionar em situações nas quais você sabe exatamente as dimensões da janela, mas na maior parte do tempo na Web, não pode ter certeza disso. Dê uma olhada na resposta aceita, que funcionará em todas as situações (nos navegadores suportados).
nickf
2

sim! bem para posicionar uma imagem de fundo como se 0px do lado direito do navegador em vez da esquerda - eu uso:

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