Bulle avec une flèche
J'ai un projet où j'ai besoin d'insérer bulles /boîtes de message. La forme générale je suis en train de réaliser est celui-ci :
CSS:
.bubble {
height: 100px;
width: 200px;
border: 3px solid gray;
background: lightgray;
position: relative;
cursor:pointer;
}
.triangle {
width: 0;
border-top: 20px solid black;
border-left: 20px solid transparent;
border-right: 20px solid transparent;
cursor:pointer;
}
HTML:
<div class="bubble">Speech bubble
</div>
<div class="triangle">
</div>
Actuellement, cela ne passe pas un hit-test de la bordure transparente est également cliquables.
Objectifs
-
La hit box (cliquable /hoverable zones) doit coller à la forme des limites (les bordures transparentes d'ici sont aussi hoverable, d'invalider cette).
-
J'ai besoin d'afficher la forme plus divers contenus (images, gradents, texte...),
Questions
Les principales questions que je vais avoir lors de la manipulation de cette forme sont:
- Ont la capacité de déplacer le triangle autour de la bulle de la parole en fonction de la position de l'élément qu'il désigne (haut/gauche/droite/bas gauche /droite)
- l'ajout d'une bordure ou d'une zone d'ombre autour d'elle lorsque l'accent est nécessaire
Est-il de toute façon de répondre à ces questions?
- c'est une double question
- Bravo pour votre commentaire, cependant, j'ai été autour de cette balise pour un certain temps maintenant et ont encore à trouver une question à poser des questions sur les points indiqués. Si vous rencontrez une telle question, sentez-vous svp libre pour le lien et je vais passer ma réponse.
Vous devez vous connecter pour publier un commentaire.
Pour ce faire, vous devriez envisager de modifier votre balisage afin de rendre votre code plus efficace. Ceci peut être réalisé à l'aide d'un pseudo-élément. Je vais répondre à chaque point individuellement, et les mettre tous ensemble à la fin de ma réponse.
Tout d'abord,
Utiliser des pseudo-éléments pour éviter d'éléments supplémentaires
Vous pouvez utiliser un pseudo-élément pour supprimer les
.triangle
div. Cela réduit non seulement votre div numéros, mais aide aussi avec le positionnement que vous pouvez utiliser letop:
left:
right:
etbottom:
propriétés css pour positionner selon votre élément principal. Cela peut être vu ci-dessous:CSS:
HTML:
Frappé tests
Afin de créer votre "coup d'essai", vous pouvez utiliser une rotation de l'élément au lieu d'une frontière hack.
Quelque chose comme:
CSS:
HTML:
ou utiliser un biaisée pseudo élément:
CSS:
HTML:
qui va montrer le pointeur seulement lorsque le carré ou l'élément principal est planait.
Mais attendez, ce qui bousille le positionnement? comment pouvez-vous gérer cela?
Il existe quelques solutions pour que. L'une est d'utiliser le
calc
propriété CSS.CSS:
HTML:
Ajout d'une bordure
Vous pouvez ajouter une bordure assez facilement, simplement en l'ajout d'une déclaration sur la frontière de l'élément principal, et le réglage de la
border-bottom
etborder-right
de la pseudo-élémentinherit
Frontière
CSS:
HTML:
Zone D'Ombre:
Afin d'avoir une zone d'ombre, j'ai utilisé le
:after
pseudo élément afin de masquer la zone d'ombre sur l'autre pseudo, faisant de l'élément paraître comme un seul élément.CSS:
HTML:
Mettre tous ensemble
Vous pouvez également ajouter une bordure de rayon à votre boîte de message ou de la bulle de la parole une fois de plus, à l'aide de la border-radius de la propriété:
CSS:
HTML:
Cela vous permet même de créer non seulement un triangle, mais que diriez-vous d'un cercle à la place?
CSS:
HTML:
Si vous rencontrez des problèmes avec le contenu de déborder et être "caché" derrière ce pseudo-élément, et vous n'êtes pas préoccuper d'avoir une frontière, vous pouvez utiliser un z-index négative qui permettra de résoudre ce problème.
N'aime pas utiliser "magic numbers"?
Si vous n'aimez pas l'idée de l'aide d'un calcul de valeur, dans lequel le positionnement dans ma réponse est en train d'utiliser (tout en travaillant), vous pouvez utiliser
transform:translate(50%)
Ce serait une bien meilleure approche, car:
CSS:
HTML:
Vous souhaitez le déplacer? Vous pouvez!
CSS:
HTML:
Voulez il un droit?
CSS:
HTML:
Voulez qu'il soit d'une autre forme de triangle?
CSS:
HTML:
transform:translate(50%)
au lieu de cela, il fonctionne pour toutes les tailles...pas de nombre magique nécessaire?SVG
Cela peut être fait en utilisant le pointeur de-événements en svg.
pointer-events:visibleFill;
Permettra de sélectionner uniquement la partie où il y a de la peinture.Cet exemple utilise filter_box-ombre et n'est pas pris en charge par IE.
Utilise également deux formes.
CSS:
HTML:
Cet exemple utilise un chemin d'accès
Devraient être pleinement pris en charge par IE.
CSS:
HTML:
J'ai trouvé ce merveilleux service à rendre personnalisable CSS flèches.
Tout simplement de générer et de l'utiliser avec n'importe quel bloc.
http://www.cssarrowplease.com/