Как заставить изображения меняться немного быстрее?

Мой код работает нормально, но по какой-то причине, когда вы нажимаете кнопку воспроизведения, требуется немного больше времени, чтобы переключиться на знак паузы, а иногда требуется немного больше времени, чтобы кнопка паузы перешла к кнопке воспроизведения. У меня также есть еще один вопрос, когда вы нажимаете на значок дождя и пляжа, появляется синяя квадратная рамка, которую я не помню, как ее убрать? Спасибо, 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>

Если вы не используете сброс CSS, «синее поле», вероятно, является стилем браузера по умолчанию с контуром активного элемента.

Roddy of the Frozen Peas 11.04.2019 01:04

Вы бы знали, как это исправить?

Love2Code 11.04.2019 01:08

На первый взгляд кажется, что вам, вероятно, следует искать какой-то асинхронный загрузчик (также известный как AJAX) для обработки загрузки ваших медиафайлов. Это поможет свести к минимуму влияние медиафайлов на пользовательский интерфейс. Кроме того, если вы стратегически использовали некоторые задержки или буферизацию, это может помочь сгладить работу... т. е. сразу изменить состояние кнопки и показать какой-то счетчик (сообщение пользователю о том, что что-то происходит), пока операции выполняются на носителе. файл (локальный или загружаемый). Начинайте воспроизведение мультимедиа только тогда, когда все будет готово, и постепенно добавляйте его.

MarsAndBack 11.04.2019 01:20

Кажется, когда вы нажимаете кнопку, браузер загружает источник изображения, и до того, как он загрузится, изображение паузы не появится. Чтобы решить эту проблему, вы должны предварительно загрузить изображения. Для достижения такого результата вы можете либо добавить изображения в HTML и скрыть, либо использовать конструкцию New Image() для предварительной загрузки с помощью Javascript, а затем привязать событие onLoad, а затем передать функцию обратного вызова для выполнения дальнейшей работы.

n1md7 11.04.2019 01:40

Вот подчищенная версия вашего кода с фиксированным изменением значка воспроизведения: jsfiddle.net/jvfz5Lst/15. Не исправляя все, что не так в исходном коде. Другие респонденты правы, говоря, что динамическая загрузка ресурсов из DropBox увеличивает накладные расходы, с которыми вы сталкиваетесь здесь.

John Doe 11.04.2019 01:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
5
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку ваши 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 для еще более быстрой загрузки пользовательского интерфейса.

MarsAndBack 11.04.2019 01:22

Ага, так даже лучше

MichaelvE 11.04.2019 01:23

Другие вопросы по теме