Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 137 additions & 0 deletions packages/tiny-swiper/demo/pagination_slidesPerView_breakpoint.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
<!DOCTYPE html>
<html lang="en">
<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>Demo</title>
<style>
:root {
--theme-color: rgb(205, 138, 50);
}
body {
font-family: Arial, Helvetica, sans-serif;
}
html,
body,
.swiper-wrapper {
padding: 0;
margin: 0;
width: 100%;
height: 100%;
}
.a {
background: yellowgreen;
}
.b {
background: lightblue;
}
.a,
.b {
display: flex;
align-items: center;
justify-content: center;
color: aliceblue;
font-size: 4rem;
}
.swiper-slide {
position: relative;
flex-shrink: 0;
width: 100%;
height: 100%;
}

.swiper-container {
overflow: hidden;
flex-shrink: 0;
height: 100%;
}
.t-ScrollBar {
display: block;
position: fixed;
top: 50%;
right: 2.2rem;
width: 0.5rem;
transform: translateY(-50%);
}
.t-ScrollBar__item {
display: block;
margin: 100% 0;
width: 100%;
padding-top: 100%;
height: 0;
box-shadow: 0 0 0 0.1rem #22216D inset;
box-shadow: 0 0 0 0.1rem var(--theme-color) inset;
border-radius: 50% !important;
border: none;
background: #FFF;
transition: background ease 0.2s;
cursor: pointer;
}
.t-ScrollBar__item.is-active {
background: #22216D;
background: var(--theme-color);
}
</style>
</head>
<body>
<script src="../lib/index.js"></script>
<script src="../lib/modules/Breakpoints.js"></script>
<script src="../lib/modules/pagination.js"></script>


<!-- Slider main container -->
<div class="swiper-container" id="swiper1">
<!-- Additional required wrapper -->
<div class="swiper-wrapper">
<!-- Slides -->
<div class="a swiper-slide">1</div>
<div class="b swiper-slide">2</div>
<div class="a swiper-slide">3</div>
<div class="b swiper-slide">4</div>
</div>
<!-- If we need pagination -->
<div class="t-ScrollBar"></div>
</div>

<script>
Swiper.use([ SwiperPluginPagination, SwiperPluginBreakpoints ])

var mySwiper = new Swiper('#swiper1', {
speed: 300,
direction: 'horizontal',
spaceBetween: 100,
mousewheel: true,
resistance: true,
resistanceRatio: 0.85,
breakpoints: {
320: {
slidesPerView: 1,
spaceBetween: 20,
},
640: {
slidesPerView: 2,
spaceBetween: 30,
},
1112: {
slidesPerView: 3,
spaceBetween: 30,
},
1536: {
slidesPerView: 4,
spaceBetween: 0,
}
},
pagination: {
el: '.t-ScrollBar',
bulletClass: 't-ScrollBar__item',
bulletActiveClass: 'is-active',
clickable: true,
clickableClass: 'is-clickable',
renderBullet: function (index, className) {
return '<span class="' + className + '">' + (index + 1) + '</span>';
}
}
});
</script>
</body>
115 changes: 65 additions & 50 deletions packages/tiny-swiper/src/modules/pagination.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,68 @@ export type SwiperPluginPaginationInstance = {
$pagination: HTMLElement | null
}

function updatePagination (
instance : SwiperInstance,
paginationOptions : SwiperPluginPaginationOptions,
paginationInstance : SwiperPluginPaginationInstance,
options : Options){

const {
bulletClass,
bulletActiveClass,
clickableClass,
renderBullet
} = <SwiperPluginPaginationOptions>paginationOptions
const {
element
} = instance.env
const {
$list
} = element

const $pagination = (typeof paginationOptions.el === 'string'
? document.body.querySelector(paginationOptions.el)
: paginationOptions.el) as HTMLElement
const $pageList: Array<HTMLElement> = []
const $group = document.createDocumentFragment()
const dotCount = $list.length - Math.ceil(options.slidesPerView) + 1

options.excludeElements.push($pagination as HTMLElement)

paginationInstance.$pagination = $pagination
paginationInstance.$pageList = $pageList
paginationInstance.$pagination!.innerHTML = ''
paginationInstance.$pageList = []
paginationInstance.$pagination = null

for (let index = 0; index < dotCount; index++) {
const $page = renderBullet ? stringToElement(renderBullet(index, bulletClass)) : document.createElement('div')

addClass(
$page,
index === instance.state.index ? [bulletClass, bulletActiveClass] : bulletClass
)
$pageList.push($page)
$group.appendChild($page)
}

$pagination.appendChild($group)

if (paginationOptions.clickable) {
addClass($pagination, clickableClass)

$pagination.addEventListener('click', (e: Event) => {
const target = e.target as HTMLElement
if (!target) return
e.preventDefault()
const bulletElement = target.closest(`.${bulletClass}`)
instance.slideTo($pageList.indexOf(bulletElement as HTMLElement))
e.stopPropagation()
})
}
return paginationInstance
}

export default <SwiperPlugin>function SwiperPluginPagination (
instance: SwiperInstance & {
pagination?: SwiperPluginPaginationInstance
Expand All @@ -45,56 +107,8 @@ export default <SwiperPlugin>function SwiperPluginPagination (
if (!isEnable) return

instance.on('after-init', () => {
const {
bulletClass,
bulletActiveClass,
clickableClass,
renderBullet
} = <SwiperPluginPaginationOptions>paginationOptions
const {
element
} = instance.env
const {
$list
} = element

const $pagination = (typeof paginationOptions.el === 'string'
? document.body.querySelector(paginationOptions.el)
: paginationOptions.el) as HTMLElement
const $pageList: Array<HTMLElement> = []
const $group = document.createDocumentFragment()
const dotCount = $list.length - Math.ceil(options.slidesPerView) + 1

options.excludeElements.push($pagination as HTMLElement)

paginationInstance.$pagination = $pagination
paginationInstance.$pageList = $pageList

for (let index = 0; index < dotCount; index++) {
const $page = renderBullet ? stringToElement(renderBullet(index, bulletClass)) : document.createElement('div')

addClass(
$page,
index === instance.state.index ? [bulletClass, bulletActiveClass] : bulletClass
)
$pageList.push($page)
$group.appendChild($page)
}

$pagination.appendChild($group)

if (paginationOptions.clickable) {
addClass($pagination, clickableClass)

$pagination.addEventListener('click', (e: Event) => {
const target = e.target as HTMLElement
if (!target) return
e.preventDefault()
const bulletElement = target.closest(`.${bulletClass}`)
instance.slideTo($pageList.indexOf(bulletElement as HTMLElement))
e.stopPropagation()
})
}

updatePagination(instance, paginationOptions, paginationInstance, options)
})

instance.on('after-destroy', () => {
Expand All @@ -108,6 +122,7 @@ export default <SwiperPlugin>function SwiperPluginPagination (
instance.on('after-slide', (
currentIndex: number
) => {
updatePagination(instance, paginationOptions, paginationInstance, options)
const { bulletActiveClass } = paginationOptions

paginationInstance.$pageList && paginationInstance.$pageList.forEach(($page, index) => {
Expand Down
7 changes: 0 additions & 7 deletions packages/website/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10028,13 +10028,6 @@ tiny-invariant@^1.0.2:
resolved "https://registry.npm.taobao.org/tiny-invariant/download/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875"
integrity sha1-Y0xfjv3CdxS384bDXmdgmR0jCHU=

tiny-swiper@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/tiny-swiper/-/tiny-swiper-2.1.2.tgz#2b759300733579611f0955620026a025693bd810"
integrity sha512-omzIg0tZdkemoDpXwBQwlGg7UfAhGi49oxsdCQtjFwDdhDc3dvUlvGIoABhNoNuLjkQdKS/fK6l0CVhnx5bk6A==
dependencies:
typescript "^4.1.3"

tiny-warning@^1.0.0, tiny-warning@^1.0.3:
version "1.0.3"
resolved "https://registry.npm.taobao.org/tiny-warning/download/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
Expand Down
Loading