Vue实现音乐播放器(七):轮播图组件(二)

轮播图组件

<template>
    <div class="slider" ref="slider">
        <div class="slider-group" ref="sliderGroup">
    //这里的<slot></slot>插槽表示里面的内容可以由引用这个轮播图组件的推荐组件来插入  只需要在<slider></slider>标签里面插入内容就可以把slot标签替换掉
            <slot></slot>
        </div>
        <div class="dots">

        </div>
    </div>
</template>

推荐页面组件

<template>
    <div class="recommend">
        <div class="recommend-content">
            <!-- 因为我们的recommend是通过异步拿到的 可能会有延时 但是如果不加上v-if的话 我们可能在没有拿到数据的情况下就
                把插槽插入进去了 那么slider.vue里面的mounted()也就执行了
            -->
            <div class="slider-wrapper" v-if="recommend.length">
                <slider>
                    <!-- 填写插槽 -->
                    <div v-for="(item,index) in recommend" :key="index">
                        <a :href="item.linkUrl">
                            <img :src="item.picUrl">
                        </a>
                    </div>
                </slider>
            </div>
            <div class="recommend-list">
                <h1 class="list-title">热门歌单推荐</h1>
                <ul></ul>
            </div>
        </div>
    </div>
</template>
<script>

    import Slider from ‘../../base/slider/slider.vue‘
    import {getRecommend} from ‘../../api/recommend.js‘
    import { ERR_OK } from ‘../../api/config.js‘

export default {
    data(){//为了将实例里面的轮播图数据与dom相关  要有一个data()方法
        return {
            recommend:[]
        }

    },
    created(){//一般在这个生命钩子里面加载数据
        this._getRecommend()
    },
    methods:{
        _getRecommend(){
            getRecommend().then((res)=>{//这个res就是我们抓取到的数据对象 因为getRecommend()方法返回的是一个promise对象  如果promise对象里面执行resolve()成功了 那么就会执行then里面的方法
                if(res.code===ERR_OK){
                    // console.log(res.data.slider)
                    this.recommend=res.data.slider
                }
            })

            }
        },
    components:{
     //注册轮播图组件
        Slider
    }
}
</script>

轮播图组件

<script>

//引入better-scroll插件
import BScroll from ‘better-scroll‘

//引入的这个方法是判断元素有没有传入该方法的类名  如果有的话就直接返回 如果没有的话就加上该类名 在轮播图组件中  添加的类名是.slider-item 这个类名的作用是让轮播图浮动 在一行显示
import {addClass} from ‘../../common/js/dom.js‘

export default {
    data(){
        return {
           dots:[],//页面上的小点  将实例里面的dots数据与dom相关 需要有data方法  

            //定义当前是第几页
            currentPageIndex:0
        }
    },
    props:{
        loop:{
            type:Boolean,
            default:true
        },
        autoPlsy:{
            type:Boolean,
            default:true
        },
        interval:{//设置轮播时间间隔
            type:Number,
            default:4000
        }
    },

    //什么时候初始化better-scroll呢?
    //如果better-scroll插件有问题可能是渲染时间(如数据还没加载完页面就渲染了)或者页面高度和宽度不对
    //所以我们要在mouted()中调用获取轮播图

    mounted(){

        //知识点:通常我们要保证dom成功渲染的时候可以加个延时
        //可以用this.nextstick()
        //也可以用setTineout()

        setTimeout(()=>{//可以延迟20ms 因为一般浏览器加载需要17ms
            this._setSliderWidth(); //设置轮播图的宽高等数据

            // 这里要在前面渲染好  不然后面获取到的小圆点的数量就是已经经过better-scroll插件复制过的数目

            this._initDots();
            this._initSlider();

        },20)

        //因为上面有个插槽slot在recommend.vue中插入数据 能够在slider.vue组件中渲染出来
        //因为我们mouted()里面的方法是异步的 所以可能在操作dom的时候还没有渲染出来  浏览器就操作了
        //所以我们在这里加个延时 就可避免此问题

        //我们还要思考一个问题:就是我们mounted()的时候 slot里面的元素有没有 在推荐组件里面判断一下v-if="recommend.length"即可

},
    methods:{
        _setSliderWidth(){

        //获取页面的dom元素的方法  this.$refs.名字

            this.children=this.$refs.sliderGroup.children
            let width=0
            let sliderWidth=this.$refs.slider.clientWidth
            console.log(‘sliderWidth‘,sliderWidth);//375
            for(let i=0;i<this.children.length;i++){
                let child=this.children[i];
                //给每一个dom元素添加类名为slider-item
                addClass(child,‘slider-item‘)

                //设置每一个child的宽度  每个child的宽度就等于总容器的宽度
                child.style.width=sliderWidth+‘px‘

                //总的图片的宽度 这里后面一定不能加上‘px‘了  否则就是字符串的相加了
                //就拿不到正确的数值了
                width+=sliderWidth

                // console.log(‘width‘,width)

            }

            if(this.loop){//如果要做到无缝滚动的话 其实是在两侧加上了两张图片的宽度
                        //所以总的宽度就等于width+=2*sliderWidth  因为这里是用
                        //let 声明的child  考虑到作用域问题  所以在{}用2倍的sliderWidth比较合适
                        //sliderWidth就等于每张图片的宽度

                width+=2*sliderWidth;

            }

            this.$refs.sliderGroup.style.width=width+‘px‘
            // console.log(this.$refs.sliderGroup)
            console.log(‘width....‘,width)

        },
        //初始化轮播图
        _initSlider(){
            this.slider=new BScroll(this.$refs.slider,{
               scrollX:true,
               scrollY:false,
               momentum:false,
               snap: {
                    loop: this.loop,
                    threshold: 0.3,
                    speed: 400
               }
            })
        },

        //初始化dots
        _initDots(){
            this.dots=new Array(this.$refs.sliderGroup.children.length)
        }
    }
}
</script>

原文地址:https://www.cnblogs.com/catbrother/p/9180870.html

时间: 2024-11-05 16:11:37

Vue实现音乐播放器(七):轮播图组件(二)的相关文章

js原生选项(自动播放无缝滚动轮播图)二

今天分享一下自动播放轮播图,自动播放轮播图是在昨天分享的轮播图的基础上添加了定时器,用定时器控制图片的自动切换,函数中首先封装一个方向的自动播放工能的小函数,这个函数中添加定时器,定时器中可以放向右走的代码,也可以放向左走的代码,然后在js加载的时候先执行一次,保证页面加载的时候轮播图是自动播放的,当然在鼠标悬停在遮罩层的时候我们需要清除这个定时器,让自动播放功能关闭,然后在鼠标再次移出遮罩层的时候再次开启定时器,这样就实现了自动播放的功能.然后今天的轮播图中我添加了开关的功能,这个开关是为了避

vue移动音乐app开发学习(三):轮播图组件的开发

本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 完成后的页面状态以及项目结构如下: 一:创建轮播图组件slider.vue 1:在src/base下新建base文件夹,然后创建silder.vue: <template> <div class="slider" ref="slider"> <div class="sl

原生JS面向对象思想封装轮播图组件

原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能实现都分别分为不同的模块.目前我封装的这个版本还不适配移动端,只适配PC端. 主要的功能有:自动轮播,点击某一张图片对应的小圆点就跳转到指定图片,有前后切换按钮.使用的时候只需要传入图片的路径以及每张图片分别所对应的跳转路径还有目标盒子ID就可以了,还可以自定义每张图轮播的延时,不过延时参数不是必须

轮播图组件及vue-awesome-swiper的引入

?记在前面 你有多自律,就有多美好. 一.新建home.vue 1.上一篇为了方便展示,把头部my-header组件放在了App.vue,现在我们删掉App.vue里的头部组件,然后在view文件里面新建一个home.vue页面,之后把头部组件和今天要讲的轮播图组件都放在home.vue页面 2.在router->index.js中配置路由,将home.vue组件映射到根路由 / 上: OK,以上对上篇的修改完成 二.新建轮播图组件 1.我们命名为carousel,初始样子: 2.然后去home

3. vue中导入animate.css动画库、Swiper轮播图组件

1. vue中导入animate.css动画库 2. vue中使用Swiper轮播图插件 注意:swiper常用设置 原文地址:https://www.cnblogs.com/qfshini/p/12120612.html

小程序--swiper轮播图组件

效果图展示: 先了解下swiper组件参数配置 轮播实现的具体步骤如下: 第一步:添加图片素材,我这边是放到images下,文件以及图片名字自定义即可. 第二步:在wxml中进行页面布局 在这里呢,用到了列表渲染.swiper组件,三元运算符(注:由于小程序不能操作dom,三元运算符还有一个常用的使用场景是控件class样式输出,达到jQuery.addClass()的效果) <view class="swiper-container"> <swiper autopl

Android开发本地及网络Mp3音乐播放器(七)循环模式与专辑倒影

实现功能: 顺序播放 随机播放 单曲循环 PlayActivity(独立音乐播放界面)的专辑封面图片的倒影效果 截止到目前的源码下载: http://download.csdn.net/detail/iwanghang/9502218 欢迎移动开发爱好者交流:我的微信是iwanghang 另外,我打算开始找工作,如果沈阳或周边城市公司有意,也请与我联系. 实现效果如图: 实现代码如下: PlayService如下: package com.iwanghang.drmplayer; import

js实现轮播图(二)

在上一篇的基础上,增加了左右箭头的响应事件,实现了点击左右箭头也可以让图片滚动: js代码如下: window.onload = function(){ //轮播初始化   var lunbo  = document.getElementById('content');   var imgs = lunbo.getElementsByTagName('img');     var uls = lunbo.getElementsByTagName('ul');           var lis 

01.轮播图之二 :tableView 轮播

在做这个tablevew轮播的时候,重要的就是修改frame 和view 的翻转了:::: 也是不难的,概要的设计和scroll 轮播是一致的: 首先是 .h 的文件 @interface TableViewShuffling : UIView @property (nonatomic,strong)NSArray *array; @end 重要的点在.m 文件中加载了详细的注释 @interface TableViewShuffling ()<UITableViewDelegate,UITab