国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

vue3 + Element Plus自定義音頻audio樣式及控件

這篇具有很好參考價值的文章主要介紹了vue3 + Element Plus自定義音頻audio樣式及控件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、原生的audio控件寫法及效果圖:

element 音頻,音視頻,vue.js,前端element 音頻,音視頻,vue.js,前端

由于audio標(biāo)簽原生樣式不能修改UI樣式,所以需要隱藏原生audio標(biāo)簽,重新寫一個控件進(jìn)行操作audio

2、自定義寫法及效果圖:

代碼實現(xiàn):

先封裝一個組件audioPlayer.vue。注意:需提前安裝了Element Plus

<template>
  <div>
    <audio
      @timeupdate="updateProgress"
      controls
      ref="audioRef"
      style="display: none"
    >
      <source :src="audioUrl" type="audio/mpeg" />
      您的瀏覽器不支持音頻播放
    </audio>
    <div class="audio_right">
      <img
        v-if="!audioIsPlay"
        @click="playAudio"
        class="audio_icon"
        src="../../../assets/img/play.png"
        alt="播放"
      />
      <img
        v-if="audioIsPlay"
        @click="playAudio"
        class="audio_icon"
        src="../../../assets/img/pause.png"
        alt="暫停"
      />
      <el-slider
        class="slider_box"
        v-model="currentProgress"
        :show-tooltip="false"
        @input="handleProgressChange"
      />
      <div class="audio_time">
        <span class="audio_current">{{ audioStart }}</span>
        &nbsp;/&nbsp;
        <span class="audio_total">{{ durationTime }}</span>
      </div>
      <div class="volume">
        <div class="volume_progress" v-show="audioHuds">
          <el-slider
            vertical
            height="100px"
            class="volume_bar"
            v-model="audioVolume"
            :show-tooltip="false"
            @change="handleAudioVolume"
          />
        </div>
        <img
          class="volume_icon"
          v-if="audioVolume <= 0"
          @click.stop="audioHuds = !audioHuds"
          src="../../../assets/img/audio_mute.png"
          alt=""
        />
        <img
          class="volume_icon"
          v-if="audioVolume > 0"
          @click.stop="audioHuds = !audioHuds"
          src="../../../assets/img/audio_high.png"
          alt=""
        />
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted, watch } from "vue";
const props = defineProps({
  audioUrl: String,        //試聽的鏈接
  isPauseTtsAudio: Boolean     //是否暫停播放試聽
});
const audioIsPlay = ref(true); //音頻是否在播放
const audioStart = ref("0:00");
const durationTime = ref("0:00"); //音頻的總時長,顯示的時間格式
const duration = ref(0); //音頻的總時長
const audioVolume = ref(80); //音量的默認(rèn)值是0.8
const audioHuds = ref(false); //是否顯示音量slider
const audioRef = ref(null);
const currentProgress = ref(0);


watch(() => props.isPauseTtsAudio, (newVal, oldVal) => {
  if (newVal) {
    // 如果 isPauseTtsAudio 為 true,試聽暫停
    handleCloseMusic();
  }
});
function handleCloseMusic() {
  audioRef.value.pause();
  audioIsPlay.value = true;
}
onMounted(() => {
  calculateDuration();
});
// 獲取音頻時長
function calculateDuration() {
  var myVid = audioRef.value;
  myVid.loop = false;
  myVid.src = props.audioUrl;
  // 監(jiān)聽音頻播放完畢
  myVid.addEventListener(
    "ended",
    function () {
      audioIsPlay.value = true;
      currentProgress.value = 0;
    },
    false
  );
  if (myVid != null) {
    myVid.oncanplay = function () {
      duration.value = myVid.duration; // 計算音頻時長
      durationTime.value = transTime(myVid.duration); //換算成時間格式
    };
    myVid.volume = 0.8; // 設(shè)置默認(rèn)音量50%
    // 進(jìn)入頁面默認(rèn)開始播放
    audioRef.value.play();
    audioIsPlay.value = false;
  }
}
// 音頻播放時間換算
function transTime(duration) {
  const minutes = Math.floor(duration / 60);
  const seconds = Math.floor(duration % 60);
  const formattedMinutes = String(minutes).padStart(2, "0"); //padStart(2,"0") 使用0填充使字符串長度達(dá)到2
  const formattedSeconds = String(seconds).padStart(2, "0");
  return `${formattedMinutes}:${formattedSeconds}`;
}
// 播放暫??刂?/span>
function playAudio() {
  if (audioRef.value.paused) {
    audioRef.value.play();
    audioIsPlay.value = false;
  } else {
    audioRef.value.pause();
    audioIsPlay.value = true;
  }
}
// 根據(jù)當(dāng)前播放時間,實時更新進(jìn)度條
function updateProgress(e) {
  var value = e.target.currentTime / e.target.duration;
  if (audioRef.value.play) {
    currentProgress.value = value * 100;
    audioStart.value = transTime(audioRef.value.currentTime);
  }
}
//調(diào)整播放進(jìn)度
const handleProgressChange = (val) => {
  console.log(val);
  if (!val) {
    return;
  }
  let currentTime = duration.value * (val / 100);
  // 更新音頻的當(dāng)前播放時間
  audioRef.value.currentTime = currentTime;
};
//調(diào)整音量
const handleAudioVolume = (val) => {
  audioRef.value.volume = val / 100;
};
</script>

<style lang="scss" scoped>
.audio_right {
  width: 230px;
  height: 40px;
  display: flex;
  align-items: center;
  background: linear-gradient(to left, #2e7bff 0%, #8ee7ff 100%);
  border-radius: 4px;
  padding: 0 10px;
  box-sizing: border-box;
  position: relative;
  .slider_box {
    width: 160px;
    height: 4px;
    border-radius: 5px;
    background-color: #f1f1f1;
    flex: 1;
    margin: 0 8px 4px;
  }
  .audio_icon {
    width: 20px;
    height: 20px;
    margin-bottom: 4px;
    cursor: pointer;
  }
  .audio_time {
    color: #f1f1f1;
    overflow: hidden;
    font-size: 12px;
    position: absolute;
    bottom: 3px;
    left: 80px;
    .audio_total {
      float: right;
    }
    .audio_current {
      float: left;
    }
  }
}
.volume {
  position: relative;
  .volume_progress {
    width: 32px;
    height: 140px;
    position: absolute;
    top: -142px;
    right: -4px;
  }
  .volume_bar {
    background: #fff;
    border-radius: 4px;
  }
  .volume_icon {
    width: 24px;
    height: 24px;
    cursor: pointer;
  }
}
</style>
<style lang="scss">
.el-slider__button-wrapper {
  display: flex;
  justify-content: center;
  align-items: center;
}
.slider_box,
.volume_bar {
  .el-slider__button {
    width: 8px;
    height: 8px;
    border: none;
  }
  .el-slider__bar {
    background: #00db15;
  }
}
.slider_box {
  .el-slider__button-wrapper {
    width: 8px;
  }
}
.volume_bar {
  .el-slider__runway {
    margin: 0 14px !important;
  }
}
</style>

在父組件內(nèi)引用自定義組件audioPlayer.vue

<template>
  <AudioPlayer :audioUrl="ttsAudioUrl" :isPauseTtsAudio="isPauseTtsAudio"></AudioPlayer>
</template>
<script setup>
import AudioPlayer from "../components/audioPlayer.vue";
</script>

效果圖:
element 音頻,音視頻,vue.js,前端文章來源地址http://www.zghlxwxcb.cn/news/detail-734900.html

到了這里,關(guān)于vue3 + Element Plus自定義音頻audio樣式及控件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • vue3+element Plus+ts 自定義主題色,以及生成主題色各種透明度

    vue3+element Plus+ts 自定義主題色,以及生成主題色各種透明度

    目錄 思路? 安裝css-color-function【接收一個顏色值,生成不同的透明度】 獲取后臺配置的主題色或者使用ColorPicker修改主題色 ?最終結(jié)果如下 本篇文章的主體思路是從element Plus官網(wǎng)引申而來。結(jié)合了我以前用vue2+element-ui配置主題色生成透明度(light-1至linght-9)的方法。 utils/

    2024年02月21日
    瀏覽(17)
  • element-plus 表格-自定義樣式實現(xiàn)

    element-plus 表格-自定義樣式實現(xiàn)

    效果如下 代碼如下

    2024年02月09日
    瀏覽(37)
  • Vue中使用element-plus中的el-dialog定義彈窗-內(nèi)部樣式修改-v-model實現(xiàn)-demo

    Vue中使用element-plus中的el-dialog定義彈窗-內(nèi)部樣式修改-v-model實現(xiàn)-demo

    .el-dialog.no-code-dialog 添加自己定義的類名用于區(qū)分其他組件

    2024年02月11日
    瀏覽(35)
  • vue3和element plus踩坑

    vue3和element plus踩坑

    1.有說vue版本有兩個,但檢查之后發(fā)現(xiàn)只有一個,且為vue3的版本 2.也有說是因為命名的問題,組件名和頁面名一致 最后發(fā)現(xiàn)是因為 在main.js里面引入element plus 使用這種use方式會報錯,雖然也不知道為什么 改為以下這種寫法之后就沒有報錯了 但改為這種寫法卻引入失敗 使用組

    2024年02月11日
    瀏覽(19)
  • VUE3 修改element ui 的樣式

    VUE3 修改element ui 的樣式

    之前修改antd組件庫的樣式,可以用global修改 但是在修改element ui的樣式,用global竟然不生效誒。 如何修改element ui 的樣式? 答:用樣式穿透 CSS 樣式穿透的三種方式 1. 2./deep/ 3.::v-deep 我參與的項目中用的是scss 示例:修改element ui table表的樣式 使 element ui的表格變成這樣子 注意

    2024年02月09日
    瀏覽(20)
  • vue3使用element-plus

    vue3使用element-plus

    element-ui 是配合 vue2 使用,element-plus 是配置 vue3 使用的 1. 包管理器的方式 如果是使用?webpack 或者 vite 打包工具新建的項目 2. 瀏覽器直接導(dǎo)入 直接通過瀏覽器的 HTML 標(biāo)簽導(dǎo)入 Element Plus,然后就可以使用全局變量 ElementPlus 1. 導(dǎo)入全部組件且注冊所有的圖標(biāo) 聲明使用 ElementPl

    2024年02月08日
    瀏覽(35)
  • 【vue3項目初始化配置】vue3 + element plus

    【vue3項目初始化配置】vue3 + element plus

    項目初始化是開發(fā)過程中很重要的一個環(huán)節(jié),本篇博客帶大家從零開始創(chuàng)建并初始化一個vue3項目,文章詳細(xì)介紹了每個步驟,希望能幫助剛接觸開發(fā)的小伙伴。 目錄 一.創(chuàng)建項目 二.安裝插件 ??編輯 ?編輯三.安裝依賴 ?編輯??編輯四.配置項目 配置vu.config.js文件 ?配置

    2024年01月18日
    瀏覽(23)
  • Vue3導(dǎo)入Element-plus方法

    Vue3導(dǎo)入Element-plus方法

    先引入依賴 main.js中要引入兩個依賴 然后 這個東西 我們最好還是掛載vue上 所以 還是 然后 我們可以在組件上試一下用一個ElementUi的表格組件 參考代碼如下 運行結(jié)果如下 也是沒有任何問題

    2024年02月06日
    瀏覽(97)
  • vue3 Element Plus 基于webstorm練習(xí)

    vue3 Element Plus 基于webstorm練習(xí)

    vue是前端框架,Elemen是組件庫。前端框架和組件庫的區(qū)別與聯(lián)系 腳本語言需要一個解析器才能運行,JavaScript是腳本語言,在不同的位置有不一樣的解析器,如寫入html的js語言, 瀏覽器是它的解析器角色。而對于需要獨立運行的js,nodejs就是一個解析器。 npm 是 Node Package Man

    2024年02月19日
    瀏覽(16)
  • vue3+element Plus實現(xiàn)表格前端分頁

    vue3+element Plus實現(xiàn)表格前端分頁

    每一處都寫了注釋,還是很容易看懂的 ?

    2024年02月11日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包