83 votes

CSS position:fixed à l'intérieur d'un élément positionné

J'ai un div positionné dont le contenu peut être trop long, ce qui fait apparaître des barres de défilement ( overflow:auto ensemble). Il fonctionne comme une boîte de dialogue dans une application ajax. Je veux fixer un bouton de fermeture dans le coin supérieur droit pour que, lorsque l'utilisateur fait défiler la division, elle ne disparaisse pas.

J'ai essayé avec position:fixed; right:0; top:0 mais il a placé le bouton en haut à droite de la page et non dans le div (dans firefox).

Est-il possible de placer ce bouton en utilisant uniquement les CSS sans avoir à manipuler les offsetWidth/Height en js à chaque événement de défilement ?

ps : la hauteur et la largeur du div n'est pas une valeur fixe, elle dépend de la taille du contenu et de la taille de la fenêtre du navigateur. L'utilisateur peut également la redimensionner s'il le souhaite.

1 votes

Il peut être intéressant d'envisager l'utilisation d'un div avec une image d'arrière-plan à position fixe pour le bouton.

1 votes

@NickM semble être une bonne idée mais comment cliquer sur le bouton alors ?

0 votes

@ithil Tant que la hauteur et la largeur de la division sont définies pour correspondre à celles de l'image d'arrière-plan, elle devrait être cliquable. En ce qui concerne les manipulation le clic, cela dépend si vous utilisez du HTML simple ou du JS. Si c'est juste du HTML, vous pouvez envelopper le div dans un fichier de type a avec une balise href (ou même simplement utiliser un a au lieu d'une balise div et le définir comme display: inline-block ). Si c'est JS, vous pouvez écouter pour un clic sur le div . Ai-je bien compris votre question ?

88voto

Sotiris Points 16807

Vous pouvez utiliser le position:fixed; mais sans ensemble left y top . Ensuite, vous le pousserez vers la droite en utilisant margin-left pour le placer dans la position que vous souhaitez.

Regardez une démo ici : http://jsbin.com/icili5

6 votes

@Sotiris pouvez-vous fournir une référence qui explique pourquoi cela devrait fonctionner ? Pourquoi les navigateurs doivent-ils positionner un fixed de cette manière lorsque top y left ne sont pas spécifiés ? stackoverflow.com/questions/8712047/

0 votes

J'ai écrit le JS le plus alambiqué jusqu'à ce que je tombe sur ça. Joli.

1 votes

Ce n'est pas le comportement souhaité

5voto

Damien Pirsy Points 15492

Position:fixed donne une position absolue par rapport à la fenêtre du BROWSER. Il va donc bien sûr s'y placer.

Alors que position:absolute se réfère à l'élément parent, donc si vous placez votre <div> à l'intérieur de l'élément < div> du conteneur, il devrait se positionner là où vous l'aviez prévu. Quelque chose comme

EDIT : grâce à @Sotiris, qui a raison, la solution peut être obtenue en utilisant une position:fixed et une margin-left. Comme ceci : http://jsfiddle.net/NeK4k/

0 votes

L'utilisateur peut faire défiler le bouton de fermeture si j'utilise l'absolu (c'était mon premier essai avant d'être corrigé).

0 votes

On dirait que tout le monde a mal lu vouloir le garder à l'écran. Dans ce cas, vous devez utiliser javascript pour le positionner correctement par rapport à la div en question, ou utiliser javascript pour le faire défiler correctement en utilisant position : absolute.

2voto

4esn0k Points 295

Il semble que les transformations css peuvent être utilisées

"La propriété 'transform' établit un nouveau système de coordonnées locales à l'élément",

mais ... ce n'est pas cross-browser, il semble que seul Opera fonctionne correctement.

1 votes

Il fonctionne maintenant dans Chrome et Firefox. Voici un exemple. codepen.io/anon/pen/ZOqrYo

0 votes

Merci @PatrickMcElhaney pour votre exemple, c'est la solution que je cherchais :)

0voto

thatmiddleway Points 1321

Si votre bouton de fermeture doit être du texte, cela fonctionne très bien pour moi :

#close {
  position: fixed;
  width: 70%; /* the width of the parent */
  text-align: right;
}
#close span {
  cursor: pointer;
}

Alors votre HTML peut juste être :

<div id="close"><span id="x">X</span></div>

-2voto

Dominic Points 2812

Dans votre div parent, définissez position: relative; et utiliser position: absolute; pour l'élément que vous souhaitez positionner par rapport au parent. Cela vous permettra de positionner correctement votre bouton dans les limites de la division parent plutôt que dans celles de la page.

position: absolute est en fait positionné par rapport aux limites du premier parent avec position définie à une valeur autre que static pour que vous puissiez avoir absolute articles à l'intérieur d'autres absolute , relative o fixed articles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X