#javascript #html #css
Вопрос:
Скоро я выпущу альбом, поэтому решил сделать для него промо-сайт. Веб-сайт будет очень простым: в основном список кнопок, каждая из которых содержит название песни и кнопку воспроизведения для предварительного просмотра этой песни. Кроме того, при нажатии на любую кнопку я хочу, чтобы открывалось всплывающее окно. Я довольно неопытен, но мне удалось добиться всего этого. Единственная проблема, с которой я сталкиваюсь, заключается в том, что, когда я нажимаю на название любой песни в кнопке, которая находится внутри тега P, всплывающее окно не открывается. Кажется, это работает только в том случае, если я нажимаю на фон кнопки, а я этого не хочу.
Кроме того, нечто подобное происходит, когда открывается всплывающее окно: я запрограммировал всплывающее окно на закрытие, если пользователь нажимает за пределами всплывающего окна. И это работает! Но он также закрывается, если я нажимаю на текст внутри всплывающего окна.
Я не уверен, почему это происходит (возможно, из-за того, как я использовал прослушиватели событий в своем JS), но я был бы очень признателен, если бы кто-нибудь мог сказать мне, как заставить текст в кнопке действовать как часть кнопки и как избежать того, чтобы нажатие любого текста во всплывающем окне закрывало его.
Я оставлю здесь фрагмент со всем своим кодом.
var song1 = document.getElementById("SoloYoPreview");
var playbutton1 = document.getElementById("playbutton1");
var button1 = document.getElementById("button1");
var toggle1 = 0;
var song2 = document.getElementById("LaNocheEnteraPreview");
var playbutton2 = document.getElementById("playbutton2");
var button2 = document.getElementById("button2");
var toggle2 = 0;
var song3 = document.getElementById("QueTalSiVamosPreview");
var playbutton3 = document.getElementById("playbutton3");
var button3 = document.getElementById("button3");
var toggle3 = 0;
var song4 = document.getElementById("EsUnRegaloPreview");
var playbutton4 = document.getElementById("playbutton4");
var button4 = document.getElementById("button4");
var toggle4 = 0;
var song5 = document.getElementById("NoMeQuieroMentirPreview");
var playbutton5 = document.getElementById("playbutton5");
var button5 = document.getElementById("button5");
var toggle5 = 0;
function ctrl_song(number, command = "") {
var thissong = window["song" number];
var thisplaybutton = window["playbutton" number];
var thisbutton = window["button" number];
var thistoggle = window["toggle" number];
if (command == "stop") {
window["toggle" number] = 2;
thisbutton.style.animationPlayState = "paused";
thisplaybutton.src = "../../Icons/replay_circle_filled_black_48dp.svg";
/*
console.log("stopping");
*/
} else if (command == "pause" || thistoggle == 1 ) {
window["toggle" number] = 0;
thisbutton.style.animationPlayState = "paused";
thissong.pause();
thisplaybutton.src = "../../Icons/play_circle_filled_black_48dp.svg";
/*
console.log("pausing");
*/
} else if (command == "restart" || thistoggle == 2) {
window["toggle" number] = 1;
thisbutton.style.animationPlayState = "running";
thissong.currentTime = 0;
thissong.play();
thisplaybutton.src = "../../Icons/pause_circle_filled_black_48dp.svg";
/*
console.log("restarting");
*/
} else if (command == "play" || thistoggle == 0) {
for (var i = 1;; i ) {
try {
window["toggle" i] = 0;
var fbutton = window["button" i];
fbutton.style.animationPlayState = "paused";
var fsong = window["song" i];
fsong.pause();
var fplaybutton = window["playbutton" i];
fplaybutton.src = "../../Icons/play_circle_filled_black_48dp.svg";
} catch (e) {
break;
}
}
window["toggle" number] = 1;
thisbutton.style.animationPlayState = "running";
thissong.play();
thisplaybutton.src = "../../Icons/pause_circle_filled_black_48dp.svg";
/*
console.log("playing");
*/
}
}
document.addEventListener("click", function(e){
var sindex = e.target.dataset.sindex;
ctrl_song(sindex);
});
document.addEventListener("animationiteration", function(e) {
var sindexb = e.target.dataset.sindexb;
ctrl_song(sindexb, "stop");
});
var popup = document.getElementById("popupid");
var popupshadow = document.getElementById("popupshadow");
function togglePopup(songtitle = "") {
document.querySelector("#popuptitle").innerHTML = songtitle;
popup.classList.toggle("show");
popupshadow.classList.toggle("show");
}
window.onclick = function(event) {
if (popup.className == "popup show" amp;amp; event.target !== popup amp;amp; event.target.className !== "songbuttons") {
togglePopup();
}
}
@import url('https://fonts.googleapis.com/css2?family=Montserratamp;display=swap');
/* width */
::-webkit-scrollbar {
width: 10px;
}
/* Track */
::-webkit-scrollbar-track {
background: #f1f1f1;
}
/* Handle */
::-webkit-scrollbar-thumb {
background: #888;
}
/* Handle on hover */
::-webkit-scrollbar-thumb:hover {
background: #555;
}
body {
margin: 0px;
background-color: #f1f1f1;
font-family: 'Montserrat', sans-serif;
font-size: 25px;
position: relative;
}
#blurredbanner {
width: auto;
background-image: url("InflamaArtworkBlur.jpg");
background-size: 100%;
background-position: center;
}
#albumcover {
width: 350px;
display: block;
margin-left: auto;
margin-right: auto;
padding-top: 50px;
padding-bottom: 50px;
}
p {
margin-block-start: 0.67em;
color: #111111;
}
h1 {
margin-block-start: 0.67em;
margin-bottom: 0px;
letter-spacing: 15px;
color: #111111;
}
#title {
text-align: center;
}
#links {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
button {
text-decoration: none;
cursor: pointer;
display: flex;
align-items: center;
text-align: center;
position: relative;
border: 1px solid #111111;
background-repeat: no-repeat;
color: #111111;
border-radius: 50px;
font-size: 0.67em;
margin-block-start: 45px;
height: 60px;
width: 50%;
transition: 0.4s;
background-image: linear-gradient( rgba(200,200,200,0.75), rgba(174,174,174,0.75) );
-webkit-animation: progressbar 30s linear;
animation: progressbar 30s linear infinite;
}
button:hover {
transform: translate(0px, -8px);
}
@keyframes progressbar {
0% {
background-size: 0%;
}
100% {
background-size: 100%;
}
}
#button1 {
animation-play-state: paused;
}
#button2 {
animation-play-state: paused;
}
#button3 {
animation-play-state: paused;
}
#button4 {
animation-play-state: paused;
}
#button5 {
animation-play-state: paused;
}
.songtitle {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
margin-block-start: 0px;
}
.popup {
position: fixed;
z-index: 2;
visibility: hidden;
top: 150%;
left: 50%;
transform: translate(-50%, -50%);
background-color: #ffffffaf;
border-radius: 10px;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
width: 25%;
height: 50%;
text-align: center;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
transition: 0.4s;
}
.popup h1 {
}
.popup.show {
visibility: visible;
top: 50%;
width: 75%;
}
.popupshadow {
background-color: #1111118f;
position: fixed;
width: 100%;
height: 100%;
z-index: 1;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
visibility: hidden;
opacity: 0;
transition: 0.6s;
}
.popupshadow.show {
opacity: 1;
visibility: visible;
}
<!DOCTYPE html>
<HEAD>
<TITLE>Inflama by Dherrera</TITLE>
<LINK rel="stylesheet" href="genericpromo.css">
</HEAD>
<BODY>
<DIV class="popupshadow" id="popupshadow"></DIV>
<DIV id="blurredbanner">
<IMG id="albumcover" src="InflamaArtwork.jpg">
</DIV>
<DIV id="title">
<H1>Inflama</H1>
<P>by Dherrera</P>
</DIV>
<DIV class="popup" id="popupid">
<H1 id="popuptitle"></H1>
<P>by Dherrera</P>
</DIV>
<DIV id="links">
<button class="songbuttons" id="button1" data-sindexb="1" onclick="togglePopup('Solo Yo')">
<audio id="SoloYoPreview">
<source src="audio/SoloYoPreview.mp3" type="audio/mpeg">
</audio>
<img id="playbutton1" data-sindex="1" src="../../Icons/play_circle_filled_black_48dp.svg" >
<P class="songtitle">Solo Yo</P>
</button>
<button class="songbuttons" id="button2" data-sindexb="2" onclick="togglePopup('La Noche Entera')">
<audio id="LaNocheEnteraPreview">
<source src="audio/LaNocheEnteraPreview.mp3" type="audio/mpeg">
</audio>
<img id="playbutton2" data-sindex="2" src="../../Icons/play_circle_filled_black_48dp.svg">
<P class="songtitle">La Noche Entera</P>
</button>
<button class="songbuttons" id="button3" data-sindexb="3" onclick="togglePopup('Que Tal Si Vamos')">
<audio id="QueTalSiVamosPreview">
<source src="audio/QueTalSiVamosPreview.mp3" type="audio/mpeg">
</audio>
<img class="playbtns" id="playbutton3" data-sindex="3" src="../../Icons/play_circle_filled_black_48dp.svg">
<P class="songtitle">Que Tal Si Vamos</P>
</button>
<button class="songbuttons" id="button4" data-sindexb="4" onclick="togglePopup('Es Un Regalo')">
<audio id="EsUnRegaloPreview">
<source src="audio/EsUnRegaloPreview.mp3" type="audio/mpeg">
</audio>
<img id="playbutton4" data-sindex="4" src="../../Icons/play_circle_filled_black_48dp.svg">
<P class="songtitle">Es Un Regalo</P>
</button>
<button class="songbuttons" id="button5" data-sindexb="5" onclick="togglePopup('No Me Quiero Mentir')">
<audio id="NoMeQuieroMentirPreview">
<source src="audio/NoMeQuieroMentirPreview.mp3" type="audio/mpeg">
</audio>
<img id="playbutton5" data-sindex="5" src="../../Icons/play_circle_filled_black_48dp.svg">
<P class="songtitle">No Me Quiero Mentir</P>
</button>
</DIV>
<!--SCRIPT-->
<SCRIPT src="genericpromov2.js"></SCRIPT>
</BODY>
</html>
Заранее спасибо!
Комментарии:
1. Элементы «P» не имеют
data-sindex
. Обработчики щелчков (только) работают здесь, когда целью является » IMG » или «КНОПКА», например,e.target
с ожидаемым набором данных.
Ответ №1:
Единственная проблема, с которой я сталкиваюсь, заключается в том, что, когда я нажимаю на название любой песни в кнопке, которая находится внутри
<p>
тега, всплывающее окно не открывается
Вам нужно добавить этот стиль в свой CSS:
.songtitle {
pointer-events: none;
}
Это означает , что если кто-то нажмет на <p>
внутреннюю <button>
часть, то это будет тот <button>
, который зарегистрирует щелчок, а не тот <p>
.
Дальнейшее Чтение:
Комментарии:
1. То же самое следует добавить для
h1
иp
внутри всплывающего окна, чтобы оно не закрывалось при нажатии на текст внутри него.2. Вау, большое спасибо! Как глупо с моей стороны, это была довольно серьезная проблема. Но я действительно ценю ваше терпение по отношению ко мне!
3. Не беспокойтесь, @DiegoHernandezHerrera — мы все здесь, чтобы учиться.
pointer-events
это действительно полезное свойство CSS, но есть много веб-разработчиков (часто тех, кто больше внимания уделяет интерфейсным фреймворкам javascript), которые с ним не сталкивались.