Jak zakotwiczyć dymek z tekstem do innego elementu na stronie, aby:
1. Automatycznie ustawiał się z góry, dołu, po lewej, po prawej stronie elementu
2. Nie przekraczał krawędzi ekranu ani nie zachodził na/pod element
3. Nie dziedziczył szerokości ani wysokości po elemencie
Dymek ma ustawioną szerokość maksymalną. Rozmiar powinien dostosować się do wolnej przestrzeni i ilości tekstu. Czy w czystym CSS jest to wykonalne?
Oto przykład:
<!DOCTYPE html>
* {
box-sizing: border-box
}
.sklep {
position: absolute;
}
.hint {
position: absolute;
left: 0;
top: 0;
background-color: black;
color: white;
padding: 6px;
max-width: 500px
}
.hint.z_lewej {
top: 50%;
transform: translate(-100%,-50%);
left: -10px;
}
.hint.z_prawej {
top: 50%;
/*left: 100%;*/
margin-left: 100%;
margin-right: -100%;
transform: translate(10px,-50%)
}
.hint.z_dolu {
top: 100%;
left: 50%;
right: -50%;
transform: translate(-50%,0)
}
<div class="sklep" style="left: 200px; top: 100px"> <img src="obraz.jpg" width="200" height="220" alt="Crapp"> <div class="hint z_prawej">Ten tekst jest bardzo długi. Szerokość hintu dopasowuje się do szerokości obrazka. To efekt niepożądany. Czy istnieją inne rozwiązania problemu poza ustaleniem szerokości hintu na sztywno? Hint nie powinien także wyjeżdżać poza obszar ekranu.
</div> <div class="sklep" style="left: 400px; top: 400px"> <img src="obraz.jpg" width="500" height="300" alt="Horse"> <div class="hint z_lewej">Krótki tekst
</div> <div class="sklep" style="left: 300px; top: 800px"> <img src="obraz.JPG" width="200" height="250" alt="Old Balance"> <div class="hint z_dolu">Ten hint wyświetli się pod spodem. Nie ma nic przeciwko, aby przekroczył szerokość obrazka, ale stało się inaczej. Po usunięciu right:-50% efekt jeszcze ciekawszy ;)
</div> <div class="sklep" style="left: 400px; top: 1300px"> <img src="obraz.pg" width="500" height="300" alt="Horse"> <div class="hint z_lewej">Czasami teksty są bardzo długie. Zobaczmy, czy ten hint wyskoczy poza ekran. Jeśli tak się stanie, jak temu zapobiec?
</div>
Działający przykład do edycji:
https://jsfiddle.net/mdhpLa7m/Działający przykład na pełnym ekranie:
https://jsfiddle.net/mdhpLa7m/embedded/result/