Décalage d'une image d'arrière-plan à droite à l'aide de CSS

443

Existe-t-il un moyen de positionner une image d'arrière-plan à un certain nombre de pixels à droite de son élément?

Par exemple, pour positionner quelque chose d'un certain nombre de pixels (disons, 10) à partir de la gauche , voici comment je procéderais:

#myElement {
    background-position: 10px 0;
}
nickf
la source
Tu ne veux sûrement pas dire background-position: -10px 0;? Je vérifie juste :)
thirtydot
1
Je sais que cela a un certain nombre de doublons, mais je ne trouve aucun d'entre eux.
Pekka
1
@thirtydot qui le déplace de 10 pixels à gauche du bord gauche.
nickf le
c'est stupide qu'il ne soit pas disponible ...
Juan
@nickf, vous vous rendez compte qu'il n'était pas disponible sur la plupart des appareils fin 2013, n'est-ce pas?
Juan

Réponses:

786

J'ai trouvé cette fonctionnalité CSS3 utile:

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

Pour autant que je sache, cela n'est pas pris en charge dans IE8. Dans le dernier Chrome / Firefox, cela fonctionne bien.

Voir Puis-je utiliser pour plus de détails sur les navigateurs pris en charge.

Source utilisée: http://tanalin.com/en/blog/2011/09/css3-background-position/

Mise à jour :

Cette fonctionnalité est désormais prise en charge dans tous les principaux navigateurs, y compris les navigateurs mobiles.

Steven
la source
23
C'est génial mais malheureusement cela ne fonctionne pas sur Safari 5.1.7 (ce qui est extrêmement important s'il est vu par les téléphones mobiles)
MosheElisha
5
Il fonctionne maintenant sur les appareils mobiles (vérifié sur Android, iOS et WindowsPhone). Safari 5.1.7 ne prend toujours pas en charge la position d'arrière-plan donnée comme ici.
Szorstki
8
J'utilise cela, mais avec un pourcentage de repli pour les browers plus âgés, par exemple. position en arrière-plan: 95% au centre; position d'arrière-plan: centre droit 13px;
gregdev
1
Je ne sais pas combien de personnes utilisent encore des navigateurs assez vieux pour ne pas le supporter. Les utilisateurs de Safari devraient désormais utiliser une version plus récente, bien que de nombreux appareils Android plus anciens soient toujours disponibles. caniuse.com/#feat=css-background-offsets Assez facile à utiliser un pourcentage de repli pour ceux-ci (bien que ce ne soit pas exactement le même).
Mark
29
Veuillez noter que cela ne fonctionne que si vous spécifiez une position cardinale pour la position verticale et horizontale telle que right left top bottom. Par exemple, ce qui suit ne sera pas rendu: background-position: right 10px 10pxmais devrait être écrit commebackground-position: right 10px top 10px
chadiusvt
110

!! Réponse obsolète, car CSS3 a apporté cette fonctionnalité

Existe-t-il un moyen de positionner une image d'arrière-plan à un certain nombre de pixels à droite de son élément?

Nan.

Les solutions de contournement populaires incluent

  • mettre un margin-rightsur l'élément à la place
  • ajouter des pixels transparents à l'image elle-même et la positionner top right
  • ou calculer la position à l'aide de jQuery une fois que la largeur de l'élément est connue.
Pekka 웃
la source
6
Une prise en charge plus complète de la position d'arrière-plan CSS3 étendue est imminente
Vlad Magdalin
92

La solution la plus simple consiste à utiliser des pourcentages. Ce n'est pas exactement la réponse que vous cherchiez depuis que vous avez demandé une précision en pixels, mais si vous avez juste besoin de quelque chose pour avoir un petit rembourrage entre le bord droit et l'image, donner quelque chose à 99% fonctionne généralement assez bien.

Code:

/* 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
la source
30
+1 "Nous passerons par l'alignement des pixels la semaine prochaine" - fonctionne toujours.
moonwave99
2
Cette solution semble fonctionner de manière plus cohérente sur tous les navigateurs.
Evan Haas
49

Réponse obsolète: elle est désormais implémentée dans les principaux navigateurs, voir les autres réponses à cette question.

CSS3 a modifié la spécification de background-positionafin qu'il fonctionne avec un point d'origine différent. Malheureusement, je ne trouve aucune preuve qu'il est encore implémenté dans les principaux navigateurs.

http://www.w3.org/TR/css3-background/#the-background-position Voir l'exemple 12.

background-position: right 3em bottom 10px;
Tami
la source
Merci Tami! Malheureusement, cela n'a pas fonctionné pour moi dans Firefox 4 ou Chrome 11.
nickf
Ceci est implémenté dans Opera. Je pensais que c'était trop beau pour être vrai, puis j'ai testé dans d'autres navigateurs et j'avais raison.
Vian Esterhuizen
1
Cela ne fonctionne toujours pas dans la version actuelle de Chrome. Version 21.0.1180.89
andlrc
3
Chrome Canary (v26) prend désormais en charge cela. Une fois que cela se répercute sur le canal de sortie et que Safari met à jour son moteur, seul IE6-8 manquera de support (IE9 / 10 supporte déjà le nouveau format).
Vlad Magdalin
1
Je viens de le tester et cela fonctionne maintenant dans Firefox (v.18.0.2), IE (v.9.0.8) et Chrome (v.25.0.1364.97), mais cela ne fonctionne pas encore dans Safari (v.5.1.2) . J'adorerais savoir si quelqu'un sait quand cela pourra être déployé ;-)
Chaya Cooper
40

Comme proposé ici , c'est une jolie solution multi-navigateur qui fonctionne parfaitement:

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

Je l'ai utilisé car la fonctionnalité CSS3 de spécification des décalages proposés dans la réponse marquée comme résolvant la question n'est pas encore si bien prise en charge par les navigateurs. Par exemple

luksak
la source
1
Qu'en est-il lorsque j'ai besoin que cette bordure soit d'une certaine couleur?
machineaddict
1
C'est une excellente réponse car vous pouvez avoir une précision en pixels tout en la gardant compatible avec tous les navigateurs. Merci! (Et si vous voulez une bordure d'une certaine couleur, utilisez un wrapper d'un certain type pour envelopper l'entrée et ajouter la bordure à cet élément.)
Gavin
23

La réponse la plus appropriée est la nouvelle syntaxe à quatre valeurs pour la position d'arrière-plan, mais jusqu'à ce que tous les navigateurs la prennent en charge, votre meilleure approche est une combinaison de réponses antérieures dans l'ordre suivant:

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
la source
15

Une astuce simple mais sale consiste à simplement ajouter le décalage souhaité à l'image que vous utilisez comme arrière-plan. ce n'est pas maintenable, mais cela fait le travail.

Merosi
la source
8

Cela fonctionnera sur la plupart des navigateurs modernes ... à part IE (support du navigateur) . Même si cette page répertorie> = IE9 comme prise en charge, mes tests n'étaient pas d'accord avec cela.

Vous pouvez utiliser la propriété calc () css3 comme ceci;

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

Pour moi, c'est le moyen le plus propre et le plus logique de réaliser une marge à droite. J'utilise également une solution de rechange border-right: 10px solid transparent;pour IE.

Novocaïne
la source
1
C'est génial mais malheureusement cela ne fonctionne pas sur Safari 5.1.7 (ce qui est extrêmement important s'il est vu par les téléphones mobiles)
MosheElisha
Ensuite, vous devez utiliser une position d'arrière-plan qui fonctionne dans Safari et qui peut être remplacée par les navigateurs qui peuvent l'utiliser. Par exemple: background-position: 92% 8px; background-position: calc(100% - 12px) 8px;
Laki Politis
Ne fonctionne pas sur tous les navigateurs mec. La right 10px centersyntaxe a un support plus étendu dans les navigateurs.
Farzad YZ
Veuillez lire la première ligne où je déclare que cela fonctionne sur "les navigateurs les plus modernes". Je n'ai jamais dit que cela fonctionne sur chacun d'eux.
Novocaine
Selon caniuse, l'utilisation d'un calc se bloquerait IE9 ... une fois que vous avez remplacé le _par un-
Ruskin
4

Ok si je comprends ce que vous demandez, vous feriez cela;

Vous avez votre conteneur DIV appelé #main-containeret .my-elementqui s'y trouve. Utilisez-le pour commencer;

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

Soit dit en passant, il est préférable d'utiliser des classes si vous faites référence à un élément de niveau inférieur dans une page (je suppose que vous êtes donc mon changement de nom ci-dessus.

Desi
la source
3

La spécification CSS3 autorisant différentes origines pour la position d'arrière-plan est maintenant prise en charge dans Firefox 14 mais toujours pas dans Chrome 21 (apparemment IE9 les prend en charge en partie, mais je ne l'ai pas testé moi-même)

En plus du problème Chrome référencé par @MattyF, il existe un résumé plus succinct ici: http://code.google.com/p/chromium/issues/detail?id=95085

Tom Gaulton
la source
Je viens de tester cela, et cela fonctionne maintenant dans Firefox (v.18.0.2), IE (v.9.0.8) et Chrome (v.25.0.1364.97), mais pas dans Safari (v.5.1.2)
Chaya Cooper
3

Si vous avez des éléments proportionnés, vous pouvez utiliser:

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

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

Dans cet exemple, .validserait la classe avec l'image et .halfserait une ligne avec la moitié de la taille de celle standard.

Sale, mais fonctionne comme un charme et c'est raisonnablement gérable.

Nighto
la source
1
Dans mon cas (en utilisant une disposition à largeur fixe), cela fait exactement ce dont j'ai besoin. Merci.
Gavin
3

Si vous souhaitez l'utiliser pour ajouter des flèches / autres icônes à un bouton par exemple, vous pouvez utiliser des pseudo-éléments css?

Si c'est vraiment une image d'arrière-plan pour l'ensemble du bouton, j'ai tendance à incorporer l'espacement dans l'image, et à utiliser simplement

background-position: right 0;

Mais si je dois ajouter par exemple une flèche conçue à un bouton, j'ai tendance à avoir ce html:

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

Et ont tendance à faire ce qui suit avec 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;
}

En utilisant le sélecteur: after, j'ajoute un élément en CSS juste pour contenir cette petite icône. Vous pouvez faire de même en ajoutant simplement une étendue ou un <i>élément à l'intérieur de l'élément a. Mais je pense que c'est une façon plus propre d'ajouter des icônes aux boutons et qu'il est compatible avec tous les navigateurs.

vous pouvez consulter le violon ici: http://codepen.io/anon/pen/PNzYzZ

Stijn_d
la source
cela devrait être content: ''; plutôt que, content:0;mais c'était une solution utile pour moi
Nat
3
background-position: calc(100% - 8px);
Zeal Murapa
la source
2

utiliser le centre à droite comme position puis ajouter une bordure transparente pour la compenser?

André Figueira
la source
1
Ce n'est pas mal, mais le contenu serait également déplacé vers la droite. Cela peut ou peut ne pas être un brise-accord. Voici un exemple de son apparence: jsbin.com/ijewoq/1
nickf
Pensez que c'est juste un cas d'équilibrage avec un petit essai et erreur :) j'espère que cela fonctionne!
André Figueira
2

Si vous avez un élément à largeur fixe et connaissez la largeur de votre image d'arrière-plan, vous pouvez simplement définir la position d'arrière-plan sur: la largeur de l'élément - la largeur de l'image - l'écart que vous voulez à droite.

Par exemple: avec un élément de 100 pixels de large et une image de 300 pixels de large, pour obtenir un écart de 10 pixels à droite, vous le définissez sur 100-300-10 = -210 px:

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

Et vous obtenez les 80 pixels les plus à droite de votre image à gauche de votre élément, et un écart de 20 pixels à droite.

Je sais que ça peut sembler stupide mais parfois ça fait gagner du temps ... J'utilise ça beaucoup de manière verticale (écart en bas) pour les liens de navigation avec du texte en dessous de l'image.

Je ne sais pas si cela s'applique à votre cas.

Julix
la source
2

mon problème était que j'avais besoin de l'image d'arrière-plan pour rester à la même distance de la bordure droite lorsque la fenêtre est redimensionnée, c'est-à-dire pour tablette / mobile, etc. Ma solution consiste à utiliser un percenatge comme ceci:

background-position: 98% 6px;

et il reste en place.

JC_Dev
la source
Cela peut fonctionner dans des situations où vous connaissez exactement les dimensions de la fenêtre, mais la plupart du temps sur le Web, vous ne pouvez pas en être sûr. Jetez un œil à la réponse acceptée qui fonctionnera dans toutes les situations (sur les navigateurs pris en charge).
nickf
2

Oui! bien pour positionner une image d'arrière-plan comme si 0px du côté droit du navigateur au lieu de la gauche - j'utilise:

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