“VUE 综合应用 播放动画”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
(建立内容为“https://www.bilibili.com/video/BV12J411m7MG/?p=35”的新页面)
 
 
(未显示同一用户的3个中间版本)
第1行: 第1行:
 
https://www.bilibili.com/video/BV12J411m7MG/?p=35
 
https://www.bilibili.com/video/BV12J411m7MG/?p=35
 +
 +
=== 功能分析 ===
 +
 +
# 监听音乐播放(<u>v-on</u> <u>play</u>)
 +
# 监听音乐暂停(<u>v-on</u> <u>pause</u>)
 +
# 操纵类名(<u>v-bind</u> <u>对象</u>)
 +
 +
=== 代码 ===
 +
<syntaxhighlight lang="html">
 +
<html>
 +
    <head>
 +
        <meta charset="UTF-8">
 +
        <meta name="viewport" content="width=device-width,initial-scale=1.0">
 +
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
 +
        <title>悦听player</title>
 +
        <style>
 +
            .disc {
 +
                position: absolute;
 +
                left: 73px;
 +
                top: 60px;
 +
                z-index: 9;
 +
            }
 +
            .cover {
 +
                position: absolute;
 +
                left: 125px;
 +
                top: 112px;
 +
                width: 150px;
 +
                height: 150px;
 +
                border-radius: 75px;
 +
                z-index: 8;
 +
            }
 +
 +
            /* 旋转的动画 */
 +
            @keyframes Rotate {
 +
            from {
 +
                transform: rotateZ(0);
 +
            }
 +
            to {
 +
                transform: rotateZ(360deg);
 +
            }
 +
            }
 +
            /* 旋转的类名 */
 +
            .autoRotate {
 +
                animation-name: Rotate;
 +
                animation-iteration-count: infinite;
 +
                animation-play-state: paused;
 +
                animation-timing-function: linear;
 +
                animation-duration: 5s;
 +
            }
 +
 +
            .comment_wrapper {
 +
                width: 180px;
 +
                height: 435px;
 +
                list-style: none;
 +
                position: absolute;
 +
                left: 600px;
 +
                top: 0px;
 +
                padding: 25px 10px;
 +
            }
 +
 +
            .comment_wrapper .title {
 +
                position: absolute;
 +
                top: 0;
 +
                margin-top: 10px;
 +
            }
 +
 +
            .comment_wrapper .comment_list {
 +
                overflow: auto;
 +
                height: 410px;
 +
            }
 +
 +
            .comment_wrapper .comment_list::-webkit-scrollbar {
 +
                display: none;
 +
            }
 +
 +
            .comment_wrapper dl {
 +
                padding-top: 10px;
 +
                padding-left: 55px;
 +
                position: relative;
 +
                margin-bottom: 20px;
 +
            }
 +
 +
            .comment_wrapper dt {
 +
                position: absolute;
 +
                left: 4px;
 +
                top: 10px;
 +
            }
 +
 +
            .comment_wrapper dt img {
 +
                width: 40px;
 +
                height: 40px;
 +
                border-radius: 20px;
 +
            }
 +
 +
            .comment_wrapper dd {
 +
                font-size: 12px;
 +
            }
 +
 +
            .comment_wrapper .name {
 +
                font-weight: bold;
 +
                color: #333;
 +
                padding-top: 5px;
 +
            }
 +
 +
            .comment_wrapper .detail {
 +
                color: #666;
 +
                margin-top: 5px;
 +
                line-height: 18px;
 +
            }
 +
 +
            /* 是否正在播放 */
 +
            .player_con.playing .disc,
 +
            .player_con.playing .cover {
 +
                animation-play-state: running;
 +
            }
 +
 +
            /* 播放杆 转回去 */
 +
            .player_con.playing .play_bar {
 +
                transform: rotate(0);
 +
            }
 +
        </style>
 +
    </head>
 +
    <body>
 +
       
 +
        <div class="wrap">
 +
 +
            <!--播放器主体区域-->
 +
            <div class="play_wrap" id="player">
 +
 +
                <div class="search_bar">
 +
                    <img src="images/player_title.png" alt=""/>
 +
                    <!--搜索歌曲-->
 +
                    <input type="text" autocomplete="off" v-model="query" @keyup.enter="searchMusic"/>
 +
 +
                    <div class="center_con">
 +
                        <!--搜索歌曲列表-->
 +
                        <div class="song_wrapper">
 +
                            <ul class="song_list">
 +
 +
                                <li v-for="item in musicList">
 +
                                    <!-- <a href="javascript:;" @click="playMusic(x.id)">{{ item.id }}点击播放</a> -->
 +
                                    <a href="javascript:;" @click="playMusic(item.id)">点击播放</a>
 +
                                    <b>{{ item.name }}</b>
 +
                                    <span><i></i></span>
 +
                                </li>
 +
 +
                            </ul>
 +
                            <img src="images/line.png" class="switch_btn" alt="">
 +
                        </div>
 +
 +
                        <!--歌曲信息容器-->
 +
                        <div class="player_con" :class="{playing:isPlaying}">
 +
                            <img src="images/player_bar.png" class="play_bar"/>
 +
                            <!--黑胶碟片-->
 +
                            <img src="images/disc.png" class="disc autoRotate">
 +
                            <img :src="musicCover" class="cover autoRotate">
 +
                        </div>
 +
 +
                        <!--评论容器-->
 +
                        <div class="comment_wrapper">
 +
                            <h5 class="title">热门留言</h5>
 +
                            <div class="comment_list">
 +
                                <dl v-for="item in hotComments">
 +
                                    <dt><img :src="item.user.avatarUrl" alt=""></dt>
 +
                                    <dd class="name">{{ item.nickname }}</dd>
 +
                                    <dd class="detail">
 +
                                        {{ item.content }}
 +
                                    </dd>
 +
                                </dl>
 +
                            </div>
 +
                        </div>
 +
                        <img src="images/line.png" class="right_line">
 +
 +
                    </div>
 +
 +
                    <div class="audio_on">
 +
                        <audio ref="audio" @play="play" @pause="pause" :src="musicUrl" controls autoplay loop class="myaudio"></audio>
 +
                    </div>
 +
 +
                    <video class="video_con" style="display:none;">
 +
                        <video src="" controls="controls"></video>
 +
                        <div class="mask"></div>
 +
                    </video>
 +
 +
                </div>
 +
 +
            </div>
 +
 +
        </div>
 +
 +
        <!-- 开发环境版本,包含了有帮助的命令行警告 -->
 +
        <script src="vue.js"></script>
 +
        <script src="axios.min.js"></script>
 +
       
 +
        <script>
 +
            /*
 +
          1.歌曲搜索接口
 +
            请求地址:https://autumnfish.cn/search
 +
            请求方法:get
 +
            请求参数:keywords(查询关键字)
 +
            响应内容:歌曲搜索结果
 +
 +
          2.歌曲url获取接口
 +
            请求地址:https://autumnfish.cn/song/url
 +
            请求方法:get
 +
            请求参数:id(查询关键字)
 +
            响应内容:歌曲url地址
 +
 +
          3.歌曲详情获取
 +
            请求地址:https://autumnfish.cn/song/detail
 +
            请求方法:get
 +
            请求参数:ids(歌曲id)
 +
            响应内容:歌曲推荐(包括封面信息)
 +
 +
            4.热门评论获取
 +
            请求地址:https://autumnfish.cn/comment/hot?type=0
 +
            请求方法:get
 +
            请求参数:id(歌曲id,地址中的type固定为0)
 +
            响应内容:歌曲的热门评论
 +
            */
 +
            var app = new Vue({
 +
                el:"#player",
 +
                data: {
 +
                    //查询关键字
 +
                    query:"",
 +
                    //歌曲数组
 +
                    musicList:[],
 +
                    //歌曲地址
 +
                    musicUrl:"",
 +
                    //歌曲封面
 +
                    musicCover:"",
 +
                    //歌曲评论
 +
                    hotComments:[],
 +
                    //动画播放状态
 +
                    isPlaying:false
 +
                },
 +
                methods :{
 +
                    searchMusic: function () {
 +
                        var that = this;
 +
                        axios.get("https://autumnfish.cn/search?keywords="+this.query)
 +
                        .then(function(response){
 +
                            // console.log(response);
 +
                            that.musicList = response.data.result.songs;
 +
                            // console.log(response.data.result.songs);
 +
                        },function(err){
 +
 +
                        })
 +
                    },
 +
                    playMusic: function(musicId) {
 +
                        // console.log(musicId);
 +
                        var that = this;
 +
                        // 获取歌曲地址
 +
                        axios.get("https://autumnfish.cn/song/url?id=" + musicId)
 +
                        .then(function(response){
 +
                            console.log(response);
 +
                            // console.log
 +
                            console.log(response.data.data[0].url);
 +
                            that.musicUrl = response.data.data[0].url;
 +
                        }, function(err){})
 +
 +
                        // 歌曲详情获取
 +
                        axios.get("https://autumnfish.cn/song/detail?ids="+musicId)
 +
                        .then(function(response){
 +
                            console.log(response);
 +
                            console.log(response.data.songs[0].al.picUrl);
 +
                            that.musicCover = response.data.songs[0].al.picUrl;
 +
                        }, function(err){})
 +
 +
                        //歌曲评论获取
 +
                        axios.get("https://autumnfish.cn/comment/hot?type=0&id=" + musicId)
 +
                        .then(function(response){
 +
                            console.log("歌曲评论获取");
 +
                            console.log(response)
 +
                            console.log(response.data.hotComments);
 +
                            that.hotComments = response.data.hotComments;
 +
                        },function(err){
 +
 +
                        })
 +
                    },
 +
                    play:function(){
 +
                        // console.log("play");
 +
                        this.isPlaying = true;
 +
                    },
 +
                    pause:function(){
 +
                        // console.log("pause");
 +
                        this.isPlaying = false;
 +
                    }
 +
                }
 +
            })
 +
        </script>
 +
 +
    </body>
 +
</html>
 +
</syntaxhighlight>
 +
 +
=== 总结和注意 ===
 +
 +
* <u>audio</u> 标签的 <u>play</u> 事件会在音频播放的时候触发
 +
* <u>audio</u> 标签的 <u>pause</u> 事件会在音频暂停的时候触发
 +
* 通过 <u>对象</u> 的方式设置类名,类名生效与否取决于后面值的 <u>真假</u>

2023年8月11日 (五) 09:54的最新版本

https://www.bilibili.com/video/BV12J411m7MG/?p=35

功能分析

  1. 监听音乐播放(v-on play
  2. 监听音乐暂停(v-on pause
  3. 操纵类名(v-bind 对象

代码

<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>悦听player</title>
        <style>
            .disc {
                position: absolute;
                left: 73px;
                top: 60px;
                z-index: 9;
            }
            .cover {
                position: absolute;
                left: 125px;
                top: 112px;
                width: 150px;
                height: 150px;
                border-radius: 75px;
                z-index: 8;
            }

            /* 旋转的动画 */
            @keyframes Rotate {
            from {
                transform: rotateZ(0);
            }
            to {
                transform: rotateZ(360deg);
            }
            }
            /* 旋转的类名 */
            .autoRotate {
                animation-name: Rotate;
                animation-iteration-count: infinite;
                animation-play-state: paused;
                animation-timing-function: linear;
                animation-duration: 5s;
            }

            .comment_wrapper {
                width: 180px;
                height: 435px;
                list-style: none;
                position: absolute;
                left: 600px;
                top: 0px;
                padding: 25px 10px;
            }

            .comment_wrapper .title {
                position: absolute;
                top: 0;
                margin-top: 10px;
            }

            .comment_wrapper .comment_list {
                overflow: auto;
                height: 410px;
            }

            .comment_wrapper .comment_list::-webkit-scrollbar {
                display: none;
            }

            .comment_wrapper dl {
                padding-top: 10px;
                padding-left: 55px;
                position: relative;
                margin-bottom: 20px;
            }

            .comment_wrapper dt {
                position: absolute;
                left: 4px;
                top: 10px;
            }

            .comment_wrapper dt img {
                width: 40px;
                height: 40px;
                border-radius: 20px;
            }

            .comment_wrapper dd {
                font-size: 12px;
            }

            .comment_wrapper .name {
                font-weight: bold;
                color: #333;
                padding-top: 5px;
            }

            .comment_wrapper .detail {
                color: #666;
                margin-top: 5px;
                line-height: 18px;
            }

            /* 是否正在播放 */
            .player_con.playing .disc,
            .player_con.playing .cover {
                animation-play-state: running;
            }

            /* 播放杆 转回去 */
            .player_con.playing .play_bar {
                transform: rotate(0);
            }
        </style>
    </head>
    <body>
        
        <div class="wrap">

            <!--播放器主体区域-->
            <div class="play_wrap" id="player">

                <div class="search_bar">
                    <img src="images/player_title.png" alt=""/>
                    <!--搜索歌曲-->
                    <input type="text" autocomplete="off" v-model="query" @keyup.enter="searchMusic"/>

                    <div class="center_con">
                        <!--搜索歌曲列表-->
                        <div class="song_wrapper">
                            <ul class="song_list">

                                <li v-for="item in musicList">
                                    <!-- <a href="javascript:;" @click="playMusic(x.id)">{{ item.id }}点击播放</a> -->
                                    <a href="javascript:;" @click="playMusic(item.id)">点击播放</a>
                                    <b>{{ item.name }}</b>
                                    <span><i></i></span>
                                </li>

                            </ul>
                            <img src="images/line.png" class="switch_btn" alt="">
                        </div>

                        <!--歌曲信息容器-->
                        <div class="player_con" :class="{playing:isPlaying}">
                            <img src="images/player_bar.png" class="play_bar"/>
                            <!--黑胶碟片-->
                            <img src="images/disc.png" class="disc autoRotate">
                            <img :src="musicCover" class="cover autoRotate">
                        </div>

                        <!--评论容器-->
                        <div class="comment_wrapper">
                            <h5 class="title">热门留言</h5>
                            <div class="comment_list">
                                <dl v-for="item in hotComments">
                                    <dt><img :src="item.user.avatarUrl" alt=""></dt>
                                    <dd class="name">{{ item.nickname }}</dd>
                                    <dd class="detail">
                                        {{ item.content }}
                                    </dd>
                                </dl>
                            </div>
                        </div>
                        <img src="images/line.png" class="right_line">

                    </div>

                    <div class="audio_on">
                        <audio ref="audio" @play="play" @pause="pause" :src="musicUrl" controls autoplay loop class="myaudio"></audio>
                    </div>

                    <video class="video_con" style="display:none;">
                        <video src="" controls="controls"></video>
                        <div class="mask"></div>
                    </video>

                </div>

            </div>

        </div>

        <!-- 开发环境版本,包含了有帮助的命令行警告 -->
        <script src="vue.js"></script>
        <script src="axios.min.js"></script>
        
        <script>
            /*
           1.歌曲搜索接口
            请求地址:https://autumnfish.cn/search
            请求方法:get
            请求参数:keywords(查询关键字)
            响应内容:歌曲搜索结果

           2.歌曲url获取接口
            请求地址:https://autumnfish.cn/song/url
            请求方法:get
            请求参数:id(查询关键字)
            响应内容:歌曲url地址

           3.歌曲详情获取
            请求地址:https://autumnfish.cn/song/detail
            请求方法:get
            请求参数:ids(歌曲id)
            响应内容:歌曲推荐(包括封面信息)

            4.热门评论获取
            请求地址:https://autumnfish.cn/comment/hot?type=0
            请求方法:get
            请求参数:id(歌曲id,地址中的type固定为0)
            响应内容:歌曲的热门评论
            */
            var app = new Vue({
                el:"#player",
                data: {
                    //查询关键字
                    query:"",
                    //歌曲数组
                    musicList:[],
                    //歌曲地址
                    musicUrl:"",
                    //歌曲封面
                    musicCover:"",
                    //歌曲评论
                    hotComments:[],
                    //动画播放状态
                    isPlaying:false
                },
                methods :{
                    searchMusic: function () {
                        var that = this;
                        axios.get("https://autumnfish.cn/search?keywords="+this.query)
                        .then(function(response){
                            // console.log(response);
                            that.musicList = response.data.result.songs;
                            // console.log(response.data.result.songs);
                        },function(err){

                        })
                    },
                    playMusic: function(musicId) {
                        // console.log(musicId);
                        var that = this;
                        // 获取歌曲地址
                        axios.get("https://autumnfish.cn/song/url?id=" + musicId)
                        .then(function(response){
                            console.log(response);
                            // console.log
                            console.log(response.data.data[0].url);
                            that.musicUrl = response.data.data[0].url;
                        }, function(err){})

                        // 歌曲详情获取
                        axios.get("https://autumnfish.cn/song/detail?ids="+musicId)
                        .then(function(response){
                            console.log(response);
                            console.log(response.data.songs[0].al.picUrl);
                            that.musicCover = response.data.songs[0].al.picUrl;
                        }, function(err){})

                        //歌曲评论获取
                        axios.get("https://autumnfish.cn/comment/hot?type=0&id=" + musicId)
                        .then(function(response){
                            console.log("歌曲评论获取");
                            console.log(response)
                            console.log(response.data.hotComments);
                            that.hotComments = response.data.hotComments;
                        },function(err){

                        })
                    },
                    play:function(){
                        // console.log("play");
                        this.isPlaying = true;
                    },
                    pause:function(){
                        // console.log("pause");
                        this.isPlaying = false;
                    }
                }
            })
        </script>

    </body>
</html>

总结和注意

  • audio 标签的 play 事件会在音频播放的时候触发
  • audio 标签的 pause 事件会在音频暂停的时候触发
  • 通过 对象 的方式设置类名,类名生效与否取决于后面值的 真假