Skip to content

Commit 6040dbb

Browse files
committed
novo exercicios sobre api dom, tarefa sobre eventos do mouse over e out e leave e enter
1 parent 300f358 commit 6040dbb

File tree

1 file changed

+135
-0
lines changed

1 file changed

+135
-0
lines changed
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
<!DOCTYPE HTML>
2+
<html lang="en-us">
3+
<head>
4+
<meta charset="utf-8"/>
5+
<style>
6+
body {
7+
height: 2000px;
8+
/* a dica de ferramenta deve funcionar após a rolagem da página também */
9+
}
10+
.tooltip {
11+
position: fixed;
12+
z-index: 100;
13+
padding: 10px 20px;
14+
border: 1px solid #b3c9ce;
15+
border-radius: 4px;
16+
text-align: center;
17+
font: italic 14px/1.3 sans-serif;
18+
color: #333;
19+
background: #fff;
20+
box-shadow: 3px 3px 3px rgba(0, 0, 0, .3);
21+
}
22+
#house {
23+
margin-top: 50px;
24+
width: 400px;
25+
border: 1px solid brown;
26+
}
27+
#roof {
28+
width: 0;
29+
height: 0;
30+
border-left: 200px solid transparent;
31+
border-right: 200px solid transparent;
32+
border-bottom: 20px solid brown;
33+
margin-top: -20px;
34+
}
35+
p {
36+
text-align: justify;
37+
margin: 10px 3px;
38+
}
39+
</style>
40+
</head>
41+
<body>
42+
43+
<div data-tooltip="Here is the house interior" id="house">
44+
<div data-tooltip="Here is the roof" id="roof"></div>
45+
<p>Once upon a time there was a mother pig who had three little pigs.</p>
46+
<p>The three little pigs grew so big that their mother said to them, "You are too big to live here any longer. You must go and build houses for yourselves. But take care that the wolf does not catch you."</p>
47+
<p>The three little pigs set off. "We will take care that the wolf does not catch us," they said.</p>
48+
<p>Soon they met a man.
49+
<a href="https://en.wikipedia.org/wiki/The_Three_Little_Pigs" data-tooltip="Read on…">Hover over me</a>
50+
</p>
51+
52+
</div>
53+
54+
<script type="text/javascript">
55+
/**
56+
* Escreva JavaScript que mostre uma dica de ferramenta sobre um elemento com o atributo data-tooltip. O valor desse atributo deve se tornar o texto da dica de ferramenta.
57+
*
58+
* É como o comportamento da dica de ferramenta da tarefa , mas aqui os elementos anotados podem ser aninhados. A dica de ferramenta mais profundamente aninhada é mostrada.
59+
*
60+
* Apenas uma dica de ferramenta pode aparecer ao mesmo tempo.
61+
*
62+
* Por exemplo:
63+
*/
64+
65+
let house = document.querySelector("#house");
66+
67+
function center(elem, tooltip) {
68+
let dif = 0, deslo = 0;
69+
//verifica coordenadas de deslocamento para centralizar
70+
//centralizar tooltip em relação a elem
71+
if(elem.offsetWidth > tooltip.offsetWidth) {
72+
dif = elem.offsetWidth - tooltip.offsetWidth;
73+
deslo = dif / 2;
74+
tooltip.style.left = deslo + "px";
75+
}else{
76+
//centraliza tooltip em relação a elem mesmo elem sendo menor
77+
dif = tooltip.offsetWidth - elem.offsetWidth;
78+
deslo = dif / 2;
79+
tooltip.style.left = tooltip.style.left - deslo > 0 + "px";
80+
}
81+
82+
}
83+
84+
function addTooltip(elem, textTooltip) {
85+
let desloY = 0;
86+
let tooltip = document.createElement("span");
87+
tooltip.innerHTML = textTooltip;
88+
tooltip.classList.add("tooltip");
89+
tooltip.style.visibility = "hidden";
90+
document.body.prepend(tooltip);
91+
let coordsElem = elem.getBoundingClientRect();
92+
//posso mostrar tooltip acima?
93+
if(coordsElem.y > tooltip.offsetHeight) {
94+
desloY = (coordsElem.y - tooltip.offsetHeight) - 5;
95+
tooltip.style.top = desloY > 0 ? desloY + "px" : 0 + "px";
96+
tooltip.style.left = coordsElem.x + "px";
97+
center(elem, tooltip);
98+
tooltip.style.visibility = "visible";
99+
}else{
100+
//mostra abaixo de elem
101+
desloY = (coordsElem.y + elem.offsetHeight) + 5;
102+
tooltip.style.top = desloY + "px";
103+
tooltip.style.left = coordsElem.x + "px";
104+
center(elem, tooltip);
105+
tooltip.style.visibility = "visible";
106+
}
107+
}
108+
109+
function removeTooltip() {
110+
let tooltip = document.querySelector(".tooltip");
111+
if(tooltip) {
112+
tooltip.remove();
113+
}
114+
}
115+
116+
house.addEventListener("mouseover", (event) => {
117+
if(event.target.dataset.tooltip) {
118+
addTooltip(event.target, event.target.dataset.tooltip);
119+
}
120+
});
121+
122+
house.addEventListener("mouseout", (event) => {
123+
if(event.target.dataset.tooltip && event.relatedTarget.dataset.tooltip) {
124+
removeTooltip();
125+
return;
126+
}else if(house.contains(event.relatedTarget)) {
127+
if(event.relatedTarget.dataset.tooltip) {
128+
removeTooltip();
129+
}
130+
}else{
131+
removeTooltip();
132+
}
133+
});
134+
</script>
135+
</body>

0 commit comments

Comments
 (0)