2017-08-13 97 views
-1

我的问题如下:jQuery - 多个音频元素和音量控制

我有四个元素。每个元素都包含自动播放和循环打开的音频文件。我想实现的是:类

  1. 切换之间4(的.o-1,即.o-2,即.o-3,即.o-4)刚刚点击元素,所以不透明度将在每个增加点击并达到.o-4时,它会返回.o-1
  2. 音频的音量应该相同:第一个值/起点为0,第一次点击后达到0.333,第二个值为0.666,第三个为1.之后最后的值/第四次点击音频应该再次静音。

* { 
 
    box-sizing: border-box; 
 
} 
 

 
body { 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 

 
.player { 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
    position: relative; 
 
    margin: auto; 
 
    top: 50vh; 
 
    transform: translateY(-50%); 
 
    width: 256px; 
 
    height: 256px; 
 
    background-color: hsla(0, 0%, 80%, 1); 
 
} 
 

 
.element { 
 
    padding: 8px; 
 
    width: 128px; 
 
    height: 128px; 
 
    background-color: hsla(0, 0%, 60%, 1); 
 
} 
 

 
.o-1 {opacity: 0.2;} 
 
.o-2 {opacity: 0.4;} 
 
.o-3 {opacity: 0.6;} 
 
.o-4 {opacity: 0.8;}
<div class="player"> 
 
    <div class="element"> 
 
     <audio autoplay loop> 
 
      <source src="blabla-1.mp3" type="audio/mpeg"> 
 
     </audio> 
 
    </div> 
 
    <div class="element"> 
 
     <audio autoplay loop> 
 
      <source src="blabla-2.mp3" type="audio/mpeg"> 
 
     </audio> 
 
    </div> 
 
    <div class="element"> 
 
     <audio autoplay loop> 
 
      <source src="blabla-3.mp3" type="audio/mpeg"> 
 
     </audio> 
 
    </div> 
 
    <div class="element"> 
 
     <audio autoplay loop> 
 
      <source src="blabla-4.mp3" type="audio/mpeg"> 
 
     </audio> 
 
    </div> 
 
</div>

这里是一个demo

在此先感谢!

+0

你的JS在哪里?你应该点击哪个单独更改不透明度?所以点击块1会增加块1的不透明度? – Gezzasa

+0

是的,每个人单独。点击元素1将增加元素1的不透明度和音量。 –

+0

你有没有尝试过任何Javascript?你想实现的是相当简单的。音量可以改变VIA(选择器).volume = 0.2; – Gezzasa

回答

1

这是一个脚本,可以一次更改opacity和音量,而不使用任何类别。

相反,它使用一些data属性来存储每个元素的实际“级别”值。

我没有碰你的HTML或你的CSS。 你现在有一个很好的初学者脚本来玩。

// Set a level to each data attribute elements (to start with). 
 
$(".element").each(function(){ 
 
    $(this).data("opacityLevel","0.8"); 
 
    $(this).data("volumeLevel","1"); 
 
}); 
 

 
// On click, check the level. 
 
$(".element").on("click", function(){ 
 
    
 
    var opacityLevel = parseFloat($(this).data("opacityLevel")); 
 
    console.log("Opacity before: "+opacityLevel); 
 
    
 
    var volumeLevel = parseFloat($(this).data("volumeLevel")); 
 
    console.log("Volume before: "+volumeLevel); 
 
    
 
    // Increment it and ensure to stay between 0.2 and 0.8 
 
    opacityLevel += 0.2; 
 
    if(opacityLevel == 1){ 
 
    opacityLevel = 0.2; 
 
    } 
 
    
 
    if(opacityLevel >= 0.4){ 
 
    volumeLevel +=0.3333 
 
    }else{ 
 
    volumeLevel = 0 
 
    } 
 
    
 
    // Store new levels 
 
    $(this).data("opacityLevel",opacityLevel); 
 
    $(this).data("volumeLevel",volumeLevel); 
 
    
 
    console.log("Opacity after: "+opacityLevel); 
 
    console.log("Volume after: "+volumeLevel); 
 
    
 
    // Apply the new level to opacity and audio volume. 
 
    $(this).css("opacity",opacityLevel); 
 
    $(this).find("audio")[0].volume = volumeLevel; 
 
    
 
});
* { 
 
    box-sizing: border-box; 
 
} 
 

 
body { 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 

 
.player { 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
    position: relative; 
 
    margin: auto; 
 
    top: 50vh; 
 
    transform: translateY(-50%); 
 
    width: 256px; 
 
    height: 256px; 
 
    background-color: hsla(0, 0%, 80%, 1); 
 
} 
 

 
.element { 
 
    padding: 8px; 
 
    width: 128px; 
 
    height: 128px; 
 
    background-color: hsla(0, 0%, 60%, 1); 
 
} 
 

 
.o-1 {opacity: 0.2;} 
 
.o-2 {opacity: 0.4;} 
 
.o-3 {opacity: 0.6;} 
 
.o-4 {opacity: 0.8;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div class="player"> 
 
    <div class="element"> 
 
    <audio autoplay loop> 
 
     <source src="blabla-1.mp3" type="audio/mpeg"> 
 
    </audio> 
 
    </div> 
 
    <div class="element"> 
 
    <audio autoplay loop> 
 
     <source src="blabla-2.mp3" type="audio/mpeg"> 
 
    </audio> 
 
    </div> 
 
    <div class="element"> 
 
    <audio autoplay loop> 
 
     <source src="blabla-3.mp3" type="audio/mpeg"> 
 
    </audio> 
 
    </div> 
 
    <div class="element"> 
 
    <audio autoplay loop> 
 
     <source src="blabla-4.mp3" type="audio/mpeg"> 
 
    </audio> 
 
    </div> 
 
</div>

编辑(有关更改音量更顺畅奖金问题)

因此,这部分将会改变:

if(opacityLevel >= 0.4){ 
    volumeLevel +=0.3333 
}else{ 
    volumeLevel = 0 
} 

要这样:

var volumeChangeDelay; 
if(opacityLevel >= 0.4){ 
    volumeLevel +=0.3333 
    volumeChangeDelay = 2000; // Slow increase 
}else{ 
    volumeLevel = 0; 
    volumeChangeDelay = 500; // Faster decrease 
} 

而且 “应用卷” 将是:

// Apply the new level to opacity and audio volume. 
$(this).css("opacity",opacityLevel); 
$(this).find("audio").animate({"volume":volumeLevel},volumeChangeDelay); 

我曾它CodePen

+0

很酷,感谢您的回答!但是这会将音量设置为与不透明度相同的水平吗?所以如果不透明度是0.2,那么音量值也是0.2?因为当不透明度为0.2时,体积应为0.当不透明度为0.4时,体积应为0.333等等。 –

+0

对....等一下。 –

+0

这里有两个不同的层次。 –

1

请在回答问题前下次尝试使用JS。这不是最好的方式,但花费最少的时间。

https://jsfiddle.net/Ljpb8wk3/2/

所有你需要的是改变点击的东西。再次,了解这一点。

$(targetDiv).removeClass('o-1').addClass('o-2'); 
var audioFile = $(targetDiv).find('audio'); 
audioFile[0].volume=0.4; 

使用正确的音频标签选择方法工作小提琴。 https://jsfiddle.net/Ljpb8wk3/4/

+0

感谢您的回答!我尝试了演示,但是您的解决方案不会更改任何音频文件的音量。声音正在播放,但是当我点击声音的按钮时,它不会改变音量,只是不透明度。任何建议@Gezzasa? –

+0

@ 22_4 Louys Patrice Bessette的答案是否适合您?如果不是,我会再看一次。 – Gezzasa

+0

是的,他的回答不仅仅是一个可行的解决方案,但我希望看到不同的方法。在此先感谢@Gezzasa! –