review update

pull/1931/head
Leopoldthecoder 2016-12-23 11:57:17 +08:00
parent 533a14f066
commit d0619c7f8a
8 changed files with 117 additions and 61 deletions

View File

@ -61,10 +61,10 @@ Loop a series of images or texts in a limited space
Indicators can be displayed outside the carousel
::: demo The `indicator-position` attribute determines where the indicators are located. By default they are inside the carousel, and setting `indicator-position` to `out` moves them outside.
::: demo The `indicator-position` attribute determines where the indicators are located. By default they are inside the carousel, and setting `indicator-position` to `outside` moves them outside.
```html
<template>
<el-carousel indicator-position="out">
<el-carousel indicator-position="outside">
<el-carousel-item v-for="item in 4">
<h3>{{ item }}</h3>
</el-carousel-item>
@ -95,10 +95,10 @@ Indicators can be displayed outside the carousel
You can define when arrows are displayed
::: demo The `show-arrow` attribute determines when arrows are displayed. By default they appear when mouse hovers over the carousel. Setting `show-arrow` to `always` or `never` shows/hides the arrows permanently.
::: demo The `arrow` attribute determines when arrows are displayed. By default they appear when mouse hovers over the carousel. Setting `arrow` to `always` or `never` shows/hides the arrows permanently.
```html
<template>
<el-carousel :interval="5000" show-arrow="always">
<el-carousel :interval="5000" arrow="always">
<el-carousel-item v-for="item in 4">
<h3>{{ item }}</h3>
</el-carousel-item>
@ -165,11 +165,11 @@ When a page is wide enough but has limited height, you can activate card mode fo
| height | height of the carousel | number | — | 300 |
| initial-index | index of the initially active slide (starting from 0) | number | — | 0 |
| trigger | how indicators are triggered | string | click | — |
| arrow-size | size of the arrows | number | — | 36 |
| interval | interval of the auto loop, in milliseconds. If less than or equal to 0, the carousel will not loop | number | — | 3000 |
| auto-play | whether automatically loop the slides | boolean | — | true |
| interval | interval of the auto loop, in milliseconds | number | — | 3000 |
| indicator-position | position of the indicators | string | out | — |
| show-indicator | whether indicators are shown | boolean | — | true |
| show-arrow | when arrows are shown | string | always/never | — |
| indicator | whether indicators are shown | boolean | — | true |
| arrow | when arrows are shown | string | always/never | — |
| card | whether card mode is activated | boolean | — | false |
### Events
@ -181,3 +181,5 @@ When a page is wide enough but has limited height, you can activate card mode fo
| Method | Description | Parameters |
|---------- |-------------- | - |
| setActiveIndex | manually switch slide | index of the slide to be switched to, starting from 0 |
| slideToPrev | switch to the previous slide | — |
| slideToNext | switch to the next slide | — |

View File

@ -68,11 +68,11 @@
适用广泛的基础用法
::: demo 结合使用`el-carousel`和`el-carousel-item`标签就得到了一个走马灯。幻灯片的内容是任意的,需要放在`el-carousel-item`标签中。默认情况下,在鼠标 hover 底部的切换条时就会触发切换。通过设置`trigger`属性为`click`,可以达到点击触发的效果。
::: demo 结合使用`el-carousel`和`el-carousel-item`标签就得到了一个走马灯。幻灯片的内容是任意的,需要放在`el-carousel-item`标签中。默认情况下,在鼠标 hover 底部的指示器时就会触发切换。通过设置`trigger`属性为`click`,可以达到点击触发的效果。
```html
<template>
<div class="block">
<span class="demonstration">默认 Hover 切换条触发</span>
<span class="demonstration">默认 Hover 指示器触发</span>
<el-carousel height="150px">
<el-carousel-item v-for="item in 4">
<h3>{{ item }}</h3>
@ -80,7 +80,7 @@
</el-carousel>
</div>
<div class="block">
<span class="demonstration">Click 切换条触发</span>
<span class="demonstration">Click 指示器触发</span>
<el-carousel trigger="click" height="150px">
<el-carousel-item v-for="item in 4">
<h3>{{ item }}</h3>
@ -109,14 +109,14 @@
```
:::
### 切换条
### 指示器
可以将切换条的显示位置设置在容器外部
可以将指示器的显示位置设置在容器外部
::: demo `indicator-position`属性定义了切换条的位置。默认情况下,它会显示在走马灯内部,设置为`out`则会显示在外部。
::: demo `indicator-position`属性定义了指示器的位置。默认情况下,它会显示在走马灯内部,设置为`outside`则会显示在外部。
```html
<template>
<el-carousel indicator-position="out">
<el-carousel indicator-position="outside">
<el-carousel-item v-for="item in 4">
<h3>{{ item }}</h3>
</el-carousel-item>
@ -146,10 +146,10 @@
### 切换箭头
可以设置切换箭头的显示时机
::: demo `show-arrow`属性定义了切换箭头的显示时机。默认情况下,切换箭头只有在鼠标 hover 到走马灯上时才会显示;若将`show-arrow`设置为`always`,则会一直显示;设置为`never`,则会一直隐藏。
::: demo `arrow`属性定义了切换箭头的显示时机。默认情况下,切换箭头只有在鼠标 hover 到走马灯上时才会显示;若将`arrow`设置为`always`,则会一直显示;设置为`never`,则会一直隐藏。
```html
<template>
<el-carousel :interval="5000" show-arrow="always">
<el-carousel :interval="5000" arrow="always">
<el-carousel-item v-for="item in 4">
<h3>{{ item }}</h3>
</el-carousel-item>
@ -214,12 +214,12 @@
|---------- |-------------- |---------- |-------------------------------- |-------- |
| height | 走马灯的高度 | number | — | 300 |
| initial-index | 初始状态激活的幻灯片的索引,从 0 开始 | number | — | 0 |
| trigger | 切换条的触发方式 | string | click | — |
| arrow-size | 切换箭头的大小 | number | — | 36 |
| interval | 自动切换的时间间隔,单位为毫秒。若小于等于 0则不会自动切换 | number | — | 3000 |
| indicator-position | 切换条的位置 | string | out | — |
| show-indicator | 是否显示切换条 | boolean | — | true |
| show-arrow | 切换箭头的显示时机 | string | always/never | — |
| trigger | 指示器的触发方式 | string | click | — |
| auto-play | 是否自动切换 | boolean | — | true |
| interval | 自动切换的时间间隔,单位为毫秒 | number | — | 3000 |
| indicator-position | 指示器的位置 | string | out | — |
| indicator | 是否显示指示器 | boolean | — | true |
| arrow | 切换箭头的显示时机 | string | always/never | — |
| card | 是否启用卡片模式 | boolean | — | false |
### Events
@ -231,3 +231,5 @@
| 方法名 | 说明 | 参数 |
|---------- |-------------- | - |
| setActiveIndex | 手动切换幻灯片 | 需要切换的幻灯片的索引,从 0 开始 |
| slideToPrev | 切换至上一张幻灯片 | — |
| slideToNext | 切换至下一张幻灯片 | — |

View File

@ -4,7 +4,7 @@
class="el-carousel__item"
:class="{
'is-active': active,
'is-card': $parent.card,
'el-carousel__item--card': $parent.card,
'is-in-stage': inStage
}"
@click="handleItemClick"

View File

@ -1,7 +1,7 @@
<template>
<div
class="el-carousel"
:class="{ 'is-card': card }"
:class="{ 'el-carousel--card': card }"
@mouseenter.stop="handleMouseEnter"
@mouseleave.stop="handleMouseLeave">
<div
@ -9,27 +9,19 @@
:style="{ height: height }">
<transition name="carousel-arrow-left">
<button
v-if="showArrow !== 'never'"
v-show="showArrow === 'always' || hover"
:style="{
height: `${ arrowSize }px`,
width: `${ arrowSize }px`
}"
v-if="arrow !== 'never'"
v-show="arrow === 'always' || hover"
@click.stop="throttledArrowClick(activeIndex - 1)"
class="el-carousel__arrow is-left">
class="el-carousel__arrow el-carousel__arrow--left">
<i class="el-icon-arrow-left"></i>
</button>
</transition>
<transition name="carousel-arrow-right">
<button
v-if="showArrow !== 'never'"
v-show="showArrow === 'always' || hover"
:style="{
height: `${ arrowSize }px`,
width: `${ arrowSize }px`
}"
v-if="arrow !== 'never'"
v-show="arrow === 'always' || hover"
@click.stop="throttledArrowClick(activeIndex + 1)"
class="el-carousel__arrow is-right">
class="el-carousel__arrow el-carousel__arrow--right">
<i class="el-icon-arrow-right"></i>
</button>
</transition>
@ -37,8 +29,8 @@
</div>
<ul
class="el-carousel__indicators"
v-if="showIndicator"
:class="{ 'is-out': indicatorPosition === 'out' || card }">
v-if="indicator"
:class="{ 'el-carousel__indicators--out': indicatorPosition === 'outside' || card }">
<li
v-for="(item, index) in items"
class="el-carousel__indicator"
@ -67,20 +59,20 @@ export default {
type: String,
default: 'hover'
},
arrowSize: {
type: Number,
default: 36
autoPlay: {
type: Boolean,
default: true
},
interval: {
type: Number,
default: 3000
},
indicatorPosition: String,
showIndicator: {
indicator: {
type: Boolean,
default: true
},
showArrow: String,
arrow: String,
card: Boolean
},
@ -130,7 +122,7 @@ export default {
});
},
autoPlay() {
playSlides() {
if (this.activeIndex < this.items.length - 1) {
this.activeIndex++;
} else {
@ -143,13 +135,16 @@ export default {
},
startTimer() {
if (this.interval <= 0) return;
this.timer = setInterval(this.autoPlay, this.interval);
if (this.interval <= 0 || !this.autoPlay) return;
this.timer = setInterval(this.playSlides, this.interval);
},
setActiveIndex(index) {
index = Number(index);
if (isNaN(index)) return;
if (isNaN(index) || index !== Math.floor(index)) {
console.warn('index must be an integer.');
return;
}
let length = this.items.length;
if (index < 0) {
this.activeIndex = length - 1;
@ -160,6 +155,14 @@ export default {
}
},
slideToPrev() {
this.setActiveIndex(this.activeIndex - 1);
},
slideToNext() {
this.setActiveIndex(this.activeIndex + 1);
},
handleIndicatorClick(index) {
this.activeIndex = index;
},

View File

@ -14,7 +14,7 @@
transition: .4s ease-in-out;
overflow: hidden;
@when card {
@modifier card {
width: 50%;
z-index: calc(var(--index-normal) - 1);
&.is-in-stage {

View File

@ -17,6 +17,7 @@
outline: none;
padding: 0;
margin: 0;
size: var(--carousel-arrow-size);
cursor: pointer;
transition: .3s;
border-radius: 50%;
@ -29,11 +30,11 @@
text-align: center;
font-size: var(--carousel-arrow-font-size);
@when left {
@modifier left {
left: 16px;
}
@when right {
@modifier right {
right: 16px;
}
@ -55,7 +56,7 @@
margin: 0;
padding: 0;
@when out {
@modifier out {
bottom: calc(var(--carousel-indicator-height) + var(--carousel-indicator-padding-vertical) * 2);
text-align: center;
position: static;

View File

@ -548,6 +548,7 @@
/* Carousel
--------------------------*/
--carousel-arrow-font-size: 12px;
--carousel-arrow-size: 36px;
--carousel-arrow-background: rgba(31, 45, 61, 0.11);
--carousel-arrow-hover-background: rgba(31, 45, 61, 0.23);
--carousel-indicator-width: 30px;

View File

@ -44,7 +44,7 @@ describe('Carousel', () => {
vm = createVue({
template: `
<div>
<el-carousel :interval="0" :initial-index="1">
<el-carousel :auto-play="false" :initial-index="1">
<el-carousel-item v-for="item in 3"></el-carousel-item>
</el-carousel>
</div>
@ -118,7 +118,7 @@ describe('Carousel', () => {
vm = createVue({
template: `
<div>
<el-carousel :interval="0">
<el-carousel :auto-play="false">
<el-carousel-item v-for="item in 3"></el-carousel-item>
</el-carousel>
</div>
@ -126,7 +126,7 @@ describe('Carousel', () => {
});
setTimeout(() => {
vm.$children[0].handleIndicatorHover(1);
vm.$children[0].throttledIndicatorHover(1);
setTimeout(() => {
expect(vm.$el.querySelectorAll('.el-carousel__item')[1].classList.contains('is-active')).to.true;
done();
@ -138,7 +138,7 @@ describe('Carousel', () => {
vm = createVue({
template: `
<div>
<el-carousel :interval="0" trigger="click">
<el-carousel :auto-play="false" trigger="click">
<el-carousel-item v-for="item in 3"></el-carousel-item>
</el-carousel>
</div>
@ -150,7 +150,54 @@ describe('Carousel', () => {
vm.$el.querySelectorAll('.el-carousel__indicator')[2].click();
setTimeout(() => {
expect(items[2].classList.contains('is-active')).to.true;
vm.$el.querySelector('.el-carousel__arrow.is-right').click();
vm.$el.querySelector('.el-carousel__arrow--right').click();
setTimeout(() => {
expect(items[0].classList.contains('is-active')).to.true;
done();
}, 10);
}, 10);
}, 10);
});
});
describe('methods', () => {
it('setActiveIndex', done => {
vm = createVue({
template: `
<div>
<el-carousel :auto-play="false">
<el-carousel-item v-for="item in 3"></el-carousel-item>
</el-carousel>
</div>
`
});
setTimeout(() => {
vm.$children[0].setActiveIndex(1);
setTimeout(() => {
expect(vm.$el.querySelectorAll('.el-carousel__item')[1].classList.contains('is-active')).to.true;
done();
}, 10);
}, 10);
});
it('slide', done => {
vm = createVue({
template: `
<div>
<el-carousel :auto-play="false">
<el-carousel-item v-for="item in 3"></el-carousel-item>
</el-carousel>
</div>
`
});
setTimeout(() => {
vm.$children[0].slideToPrev(1);
const items = vm.$el.querySelectorAll('.el-carousel__item');
setTimeout(() => {
expect(items[2].classList.contains('is-active')).to.true;
vm.$children[0].slideToNext(1);
setTimeout(() => {
expect(items[0].classList.contains('is-active')).to.true;
done();
@ -164,7 +211,7 @@ describe('Carousel', () => {
vm = createVue({
template: `
<div>
<el-carousel :interval="0" card>
<el-carousel :auto-play="false" card>
<el-carousel-item v-for="item in 7"></el-carousel-item>
</el-carousel>
</div>
@ -179,7 +226,7 @@ describe('Carousel', () => {
items[1].click();
setTimeout(() => {
expect(items[1].classList.contains('is-active')).to.true;
vm.$el.querySelector('.el-carousel__arrow.is-left').click();
vm.$el.querySelector('.el-carousel__arrow--left').click();
setTimeout(() => {
expect(items[0].classList.contains('is-active')).to.true;
items[6].click();