¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view |
| | | class="u-scroll-list" |
| | | ref="u-scroll-list" |
| | | > |
| | | <!-- #ifdef APP-NVUE --> |
| | | <!-- nvue使ç¨bindingXå®ç°ï¼ä»¥å¾å°æ´å¥½çæ§è½ --> |
| | | <scroller |
| | | class="u-scroll-list__scroll-view" |
| | | ref="u-scroll-list__scroll-view" |
| | | scroll-direction="horizontal" |
| | | :show-scrollbar="false" |
| | | :offset-accuracy="1" |
| | | @scroll="nvueScrollHandler" |
| | | > |
| | | <view class="u-scroll-list__scroll-view__content"> |
| | | <slot /> |
| | | </view> |
| | | </scroller> |
| | | <!-- #endif --> |
| | | <!-- #ifndef APP-NVUE --> |
| | | <!-- #ifdef MP-WEIXIN || APP-VUE || H5 || MP-QQ --> |
| | | <!-- 以ä¸å¹³å°ï¼æ¯æwxs --> |
| | | <scroll-view |
| | | class="u-scroll-list__scroll-view" |
| | | scroll-x |
| | | @scroll="wxs.scroll" |
| | | @scrolltoupper="wxs.scrolltoupper" |
| | | @scrolltolower="wxs.scrolltolower" |
| | | :data-scrollWidth="scrollWidth" |
| | | :data-barWidth="$u.getPx(indicatorBarWidth)" |
| | | :data-indicatorWidth="$u.getPx(indicatorWidth)" |
| | | :show-scrollbar="false" |
| | | :upper-threshold="0" |
| | | :lower-threshold="0" |
| | | > |
| | | <!-- #endif --> |
| | | <!-- #ifndef APP-NVUE || MP-WEIXIN || H5 || APP-VUE || MP-QQ --> |
| | | <!-- é以ä¸å¹³å°ï¼åªè½ä½¿ç¨æ®éjså®ç° --> |
| | | <scroll-view |
| | | class="u-scroll-list__scroll-view" |
| | | scroll-x |
| | | @scroll="scrollHandler" |
| | | @scrolltoupper="scrolltoupperHandler" |
| | | @scrolltolower="scrolltolowerHandler" |
| | | :show-scrollbar="false" |
| | | :upper-threshold="0" |
| | | :lower-threshold="0" |
| | | > |
| | | <!-- #endif --> |
| | | <view class="u-scroll-list__scroll-view__content"> |
| | | <slot /> |
| | | </view> |
| | | </scroll-view> |
| | | <!-- #endif --> |
| | | <view |
| | | class="u-scroll-list__indicator" |
| | | v-if="indicator" |
| | | :style="[$u.addStyle(indicatorStyle)]" |
| | | > |
| | | <view |
| | | class="u-scroll-list__indicator__line" |
| | | :style="[lineStyle]" |
| | | > |
| | | <view |
| | | class="u-scroll-list__indicator__line__bar" |
| | | :style="[barStyle]" |
| | | ref="u-scroll-list__indicator__line__bar" |
| | | ></view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script |
| | | src="./scrollWxs.wxs" |
| | | module="wxs" |
| | | lang="wxs" |
| | | ></script> |
| | | |
| | | <script> |
| | | /** |
| | | * scrollList æ¨ªåæ»å¨å表 |
| | | * @description 该ç»ä»¶ä¸è¬ç¨äºåæ¶å±ç¤ºå¤ä¸ªååãåç±»çåºæ¯ï¼ä¹å¯ä»¥å®æå·¦å³æ»å¨çå表ã |
| | | * @tutorial https://www.uviewui.com/components/scrollList.html |
| | | * @property {String | Number} indicatorWidth æç¤ºå¨çæ´ä½å®½åº¦ (é»è®¤ 50 ) |
| | | * @property {String | Number} indicatorBarWidth æ»åç宽度 (é»è®¤ 20 ) |
| | | * @property {Boolean} indicator æ¯å¦æ¾ç¤ºé¢æ¿æç¤ºå¨ (é»è®¤ true ) |
| | | * @property {String} indicatorColor æç¤ºå¨éæ¿æ´»é¢è² (é»è®¤ '#f2f2f2' ) |
| | | * @property {String} indicatorActiveColor æç¤ºå¨çæ¿æ´»é¢è² (é»è®¤ '#3c9cff' ) |
| | | * @property {String | Object} indicatorStyle æç¤ºå¨æ ·å¼ï¼å¯éè¿bottomï¼leftï¼rightè¿è¡å®ä½ |
| | | * @event {Function} left æ»å¨å°å·¦è¾¹æ¶è§¦å |
| | | * @event {Function} right æ»å¨å°å³è¾¹æ¶è§¦å |
| | | * @example |
| | | */ |
| | | // #ifdef APP-NVUE |
| | | const dom = uni.requireNativePlugin('dom') |
| | | import nvueMixin from "./nvue.js" |
| | | // #endif |
| | | import props from './props.js'; |
| | | export default { |
| | | name: 'u-scroll-list', |
| | | mixins: [uni.$u.mpMixin, uni.$u.mixin, props], |
| | | // #ifdef APP-NVUE |
| | | mixins: [uni.$u.mpMixin, uni.$u.mixin, nvueMixin, props], |
| | | // #endif |
| | | data() { |
| | | return { |
| | | scrollInfo: { |
| | | scrollLeft: 0, |
| | | scrollWidth: 0 |
| | | }, |
| | | scrollWidth: 0 |
| | | } |
| | | }, |
| | | computed: { |
| | | // æç¤ºå¨ä¸ºçº¿åçæ ·å¼ |
| | | barStyle() { |
| | | const style = {} |
| | | // #ifndef APP-NVUE || MP-WEIXIN || H5 || APP-VUE || MP-QQ |
| | | // æ¤ä¸ºæ®éjsæ¹æ¡ï¼åªæå¨énvueå䏿¯æwxsæ¹æ¡ç端æä½¿ç¨ã |
| | | // æ¤å¤ç计ç®çç±ä¸ºï¼scroll-viewçæ»å¨è·ç¦»ä¸ç®æ æ»å¨è·ç¦»(scroll-viewçå®é
宽度åå»å
裹å
ç´ ç宽度)乿¯ï¼çäºæ»åå½åç§»å¨è·ç¦»ä¸æ»é |
| | | // æ»å¨è·ç¦»(æç¤ºå¨çæ»å®½åº¦å廿»å宽度)çæ¯å¼ |
| | | const scrollLeft = this.scrollInfo.scrollLeft, |
| | | scrollWidth = this.scrollInfo.scrollWidth, |
| | | barAllMoveWidth = this.indicatorWidth - this.indicatorBarWidth |
| | | const x = scrollLeft / (scrollWidth - this.scrollWidth) * barAllMoveWidth |
| | | style.transform = `translateX(${ x }px)` |
| | | // #endif |
| | | // 设置æ»åç宽度åèæ¯è²ï¼æ¯æ¯ä¸ªå¹³å°é½éè¦ç |
| | | style.width = uni.$u.addUnit(this.indicatorBarWidth) |
| | | style.backgroundColor = this.indicatorActiveColor |
| | | return style |
| | | }, |
| | | lineStyle() { |
| | | const style = {} |
| | | // æç¤ºå¨æ´ä½çæ ·å¼ï¼éè¦è®¾ç½®å
¶å®½åº¦åèæ¯è² |
| | | style.width = uni.$u.addUnit(this.indicatorWidth) |
| | | style.backgroundColor = this.indicatorColor |
| | | return style |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.init() |
| | | }, |
| | | methods: { |
| | | init() { |
| | | this.getComponentWidth() |
| | | }, |
| | | // #ifndef APP-NVUE || MP-WEIXIN || H5 || APP-VUE || MP-QQ |
| | | // scroll-viewè§¦åæ»å¨äºä»¶ |
| | | scrollHandler(e) { |
| | | this.scrollInfo = e.detail |
| | | }, |
| | | scrolltoupperHandler() { |
| | | this.scrollEvent('left') |
| | | this.scrollInfo.scrollLeft = 0 |
| | | }, |
| | | scrolltolowerHandler() { |
| | | this.scrollEvent('right') |
| | | // 卿®éjsæ¹æ¡ä¸ï¼æ»å¨å°å³è¾¹æ¶ï¼éè¿è®¾ç½®this.scrollInfoï¼æ¨¡æåºæ»å¨å°å³è¾¹çæ
åµ |
| | | // å ä¸ºä¸æ¹æ¯ç¨è¿computed计ç®çï¼è®¾ç½®åï¼ä¼èªå¨è°æ´æ»åçä½ç½® |
| | | this.scrollInfo.scrollLeft = uni.$u.getPx(this.indicatorWidth) - uni.$u.getPx(this.indicatorBarWidth) |
| | | }, |
| | | // #endif |
| | | // |
| | | scrollEvent(status) { |
| | | this.$emit(status) |
| | | }, |
| | | // è·åç»ä»¶ç宽度 |
| | | async getComponentWidth() { |
| | | // å»¶æ¶ä¸å®æ¶é´ï¼ä»¥è·ådom尺寸 |
| | | await uni.$u.sleep(30) |
| | | // #ifndef APP-NVUE |
| | | this.$uGetRect('.u-scroll-list').then(size => { |
| | | this.scrollWidth = size.width |
| | | }) |
| | | // #endif |
| | | |
| | | // #ifdef APP-NVUE |
| | | const ref = this.$refs['u-scroll-list'] |
| | | ref && dom.getComponentRect(ref, (res) => { |
| | | this.scrollWidth = res.size.width |
| | | }) |
| | | // #endif |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | @import "../../libs/css/components.scss"; |
| | | |
| | | .u-scroll-list { |
| | | padding-bottom: 10px; |
| | | |
| | | &__scroll-view { |
| | | @include flex; |
| | | |
| | | &__content { |
| | | @include flex; |
| | | } |
| | | } |
| | | |
| | | &__indicator { |
| | | @include flex; |
| | | justify-content: center; |
| | | margin-top: 15px; |
| | | |
| | | &__line { |
| | | width: 60px; |
| | | height: 4px; |
| | | border-radius: 100px; |
| | | overflow: hidden; |
| | | |
| | | &__bar { |
| | | width: 20px; |
| | | height: 4px; |
| | | border-radius: 100px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |