Мой код работает нормально, но по какой-то причине, когда вы нажимаете кнопку воспроизведения, требуется немного больше времени, чтобы переключиться на знак паузы, а иногда требуется немного больше времени, чтобы кнопка паузы перешла к кнопке воспроизведения. У меня также есть еще один вопрос, когда вы нажимаете на значок дождя и пляжа, появляется синяя квадратная рамка, которую я не помню, как ее убрать? Спасибо, Love2code
<!DOCTYPE html>
<html>
<head>
<title>Meditation App</title>
<link rel = "stylesheet" href = "https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity = "sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin = "anonymous">
<style>
*{
margin:0;
padding:0;
box-sizing:border-box;
}
.app{
height:100vh;
display:flex;
justify-content:space-evenly;
align-items:center;
}
.time-select,.sound-picker,.player-container{
height:80%;
flex:1;
display:flex;
flex-direction:column;
justify-content:space-evenly;
align-items:center;
}
.player-container{
position:relative;
}
.player-container svg{
position:absolute;
height:50%;
top:50%;
left:50%;
transform:translate(-50%,-50%);
pointer-events:none;
}
.time-display{
position:absolute;
bottom:10%;
color:white;
font-size:50px;
}
video{
position:fixed;
top:0%;
left:0%;
width:100%;
z-index:-10;
}
.time-select button,
.sound-picker button{
color:white;
width:30%;
height:10%;
background:none;
border:2px solid white;
cursor:pointer;
border-radius:5px;
font-size:20px;
transition:all 0.5s ease;
}
.time-select button:hover{
color:black;
background:white;
}
.sound-picker button{
border:none;
height:120px;
width:120px;
border-radius:50%;
}
.sound-picker button:nth-child(1){
background:#4972a1;
}
.sound-picker button:nth-child(2){
background:#a14f49;
}
.sound-picker:focus{
outline: none;
}
</style>
</head>
<body>
<div class = "app">
<div class = "vid-container">
<video Loop>
<source src = "https://www.dropbox.com/s/wkdu9elom9o4r5g/rain%20%281%29.mp4?raw=1"/>
</video>
</div>
<div class = "time-select">
<button data-time = "120">2 Minutes</button>
<button data-time = "300">5 Minutes</button>
<button data-time = "600">10 Minutes</button>
</div>
<div class = "player-container">
<audio class = "song">
<source src = "https://www.dropbox.com/s/jawlfpyyz83w2td/rain.mp3?raw=1"></source>
</audio>
<img src = "https://www.dropbox.com/s/8unx3knosmefedk/download%20%281%29.svg?raw=1" class = "play-container" alt = "">
<svg class = "track-outline"
width = "453" height = "453" viewBox = "0 0 453 453" fill = "none" xmlns = "http://www.w3.org/2000/svg">
<circle cx = "226.5" cy = "226.5" r = "216.5" stroke = "white" stroke-width = "20"/>
</svg>
<svg class = "moving-outline"
width = "453" height = "453" viewBox = "0 0 453 453" fill = "none" xmlns = "http://www.w3.org/2000/svg">
<circle cx = "226.5" cy = "226.5" r = "216.5" stroke = "#018EBA" stroke-width = "20"/>
</svg>
<h3 class = "time-display">0:00</h3>
</div>
<div class = "sound-picker">
<button data-sound = "https://www.dropbox.com/s/jawlfpyyz83w2td/rain.mp3?raw=1" data-video = "https://www.dropbox.com/s/wkdu9elom9o4r5g/rain%20%281%29.mp4?raw=1"><img src = "https://i.ibb.co/8BspYTV/rain-1.png"></button>
<button data-sound = "https://www.dropbox.com/s/6k9nauf2ffyvfuu/beach.mp3?raw=1"
data-video = "https://www.dropbox.com/s/tsdd86bxmax32jp/beach.mp4?raw=1"><img src = "https://i.ibb.co/T0xw4k7/sun-umbrella.png"></button>
</div>
</body>
<script>
const app = () => {
const song = document.querySelector(".song");
const play = document.querySelector(".play-container");
const outline = document.querySelector(".moving-outline circle");
const video = document.querySelector(".vid-container video");
//Sounds
const sounds = document.querySelectorAll(".sound-picker button");
//Time Display
const timeDisplay = document.querySelector(".time-display");
//Get length of the outside
const outlineLength = outline.getTotalLength();
//Duration
let fakeDuration = 600;
outline.style.strokeDasharray = outlineLength;
outline.style.strokeDashoffset = outlineLength;
//play sounds
play.addEventListener("click", () => {
checkPlaying(song);
});
//stop and play the sounds
const checkPlaying = song =>{
if (song.paused){
song.play();
video.play();
play.src = 'https://www.dropbox.com/s/3zvnjkebwt1sjgq/download%20%283%29.svg?raw=1';
}else{
song.pause();
video.pause();
play.src = 'https://www.dropbox.com/s/8unx3knosmefedk/download%20%281%29.svg?raw=1';
}
}
};
app();
</script>
</html>Вы бы знали, как это исправить?
На первый взгляд кажется, что вам, вероятно, следует искать какой-то асинхронный загрузчик (также известный как AJAX) для обработки загрузки ваших медиафайлов. Это поможет свести к минимуму влияние медиафайлов на пользовательский интерфейс. Кроме того, если вы стратегически использовали некоторые задержки или буферизацию, это может помочь сгладить работу... т. е. сразу изменить состояние кнопки и показать какой-то счетчик (сообщение пользователю о том, что что-то происходит), пока операции выполняются на носителе. файл (локальный или загружаемый). Начинайте воспроизведение мультимедиа только тогда, когда все будет готово, и постепенно добавляйте его.
Кажется, когда вы нажимаете кнопку, браузер загружает источник изображения, и до того, как он загрузится, изображение паузы не появится. Чтобы решить эту проблему, вы должны предварительно загрузить изображения. Для достижения такого результата вы можете либо добавить изображения в HTML и скрыть, либо использовать конструкцию New Image() для предварительной загрузки с помощью Javascript, а затем привязать событие onLoad, а затем передать функцию обратного вызова для выполнения дальнейшей работы.
Вот подчищенная версия вашего кода с фиксированным изменением значка воспроизведения: jsfiddle.net/jvfz5Lst/15. Не исправляя все, что не так в исходном коде. Другие респонденты правы, говоря, что динамическая загрузка ресурсов из DropBox увеличивает накладные расходы, с которыми вы сталкиваетесь здесь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку ваши SVG получены удаленно, их загрузка занимает некоторое время. Я создал два скрытых изображения с удаленными источниками. Это загрузит их и подготовит в ваших деньгах, когда они вам понадобятся. Я также изменил последовательность переключения исходного пути перед воспроизведением видео. Я установил, что все элементы не имеют контура, чтобы убрать синюю рамку при нажатии на изображение.
const app = () => {
const song = document.querySelector(".song");
const play = document.querySelector(".play-container");
const outline = document.querySelector(".moving-outline circle");
const video = document.querySelector(".vid-container video");
//Sounds
const sounds = document.querySelectorAll(".sound-picker button");
//Time Display
const timeDisplay = document.querySelector(".time-display");
//Get length of the outside
const outlineLength = outline.getTotalLength();
//Duration
let fakeDuration = 600;
outline.style.strokeDasharray = outlineLength;
outline.style.strokeDashoffset = outlineLength;
//play sounds
play.addEventListener("click", () => {
checkPlaying(song);
});
//stop and play the sounds
const checkPlaying = song => {
if (song.paused) {
play.src = 'https://www.dropbox.com/s/3zvnjkebwt1sjgq/download%20%283%29.svg?raw=1';
song.play();
video.play();
} else {
play.src = 'https://www.dropbox.com/s/8unx3knosmefedk/download%20%281%29.svg?raw=1';
song.pause();
video.pause();
}
}
};
app();* {
margin: 0;
padding: 0;
box-sizing: border-box;
outline: none;
}
.app {
height: 100vh;
display: flex;
justify-content: space-evenly;
align-items: center;
}
.time-select,
.sound-picker,
.player-container {
height: 80%;
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-evenly;
align-items: center;
}
.player-container {
position: relative;
}
.player-container svg {
position: absolute;
height: 50%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
pointer-events: none;
}
.time-display {
position: absolute;
bottom: 10%;
color: white;
font-size: 50px;
}
video {
position: fixed;
top: 0%;
left: 0%;
width: 100%;
z-index: -10;
}
.time-select button,
.sound-picker button {
color: white;
width: 30%;
height: 10%;
background: none;
border: 2px solid white;
cursor: pointer;
border-radius: 5px;
font-size: 20px;
transition: all 0.5s ease;
}
.time-select button:hover {
color: black;
background: white;
}
.sound-picker button {
border: none;
height: 120px;
width: 120px;
border-radius: 50%;
}
.sound-picker button:nth-child(1) {
background: #4972a1;
}
.sound-picker button:nth-child(2) {
background: #a14f49;
}
.sound-picker:focus {
outline: none;
}<img src = "https://www.dropbox.com/s/3zvnjkebwt1sjgq/download%20%283%29.svg?raw=1" style = "display:none;">
<img src = "https://www.dropbox.com/s/8unx3knosmefedk/download%20%281%29.svg?raw=1" style = "display:none;">
<div class = "app">
<div class = "vid-container">
<video Loop>
<source src = "https://www.dropbox.com/s/wkdu9elom9o4r5g/rain%20%281%29.mp4?raw=1"/>
</video>
</div>
<div class = "time-select">
<button data-time = "120">2 Minutes</button>
<button data-time = "300">5 Minutes</button>
<button data-time = "600">10 Minutes</button>
</div>
<div class = "player-container">
<audio class = "song">
<source src = "https://www.dropbox.com/s/jawlfpyyz83w2td/rain.mp3?raw=1"></source>
</audio>
<img src = "https://www.dropbox.com/s/8unx3knosmefedk/download%20%281%29.svg?raw=1" class = "play-container" alt = "">
<svg class = "track-outline" width = "453" height = "453" viewBox = "0 0 453 453" fill = "none" xmlns = "http://www.w3.org/2000/svg">
<circle cx = "226.5" cy = "226.5" r = "216.5" stroke = "white" stroke-width = "20"/>
</svg>
<svg class = "moving-outline" width = "453" height = "453" viewBox = "0 0 453 453" fill = "none" xmlns = "http://www.w3.org/2000/svg">
<circle cx = "226.5" cy = "226.5" r = "216.5" stroke = "#018EBA" stroke-width = "20"/>
</svg>
<h3 class = "time-display">0:00</h3>
</div>
<div class = "sound-picker">
<button data-sound = "https://www.dropbox.com/s/jawlfpyyz83w2td/rain.mp3?raw=1" data-video = "https://www.dropbox.com/s/wkdu9elom9o4r5g/rain%20%281%29.mp4?raw=1"><img src = "https://i.ibb.co/8BspYTV/rain-1.png"></button>
<button data-sound = "https://www.dropbox.com/s/6k9nauf2ffyvfuu/beach.mp3?raw=1" data-video = "https://www.dropbox.com/s/tsdd86bxmax32jp/beach.mp4?raw=1"><img src = "https://i.ibb.co/T0xw4k7/sun-umbrella.png"></button>
</div>И, в качестве альтернативы, можно поместить содержимое SVG непосредственно в HTML для еще более быстрой загрузки пользовательского интерфейса.
Ага, так даже лучше
Если вы не используете сброс CSS, «синее поле», вероятно, является стилем браузера по умолчанию с контуром активного элемента.