123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- <template>
- <view class="alphabet">
- <view class="alphabet-item"
- v-for="(item, key) of phones"
- :key="key"
- :data-key="key"
- :class="activeClass == key ? 'active' : ''"
- @touchstart="handleTouchStart"
- @touchmove = "handleTouchMove"
- @touchend="handleTouchEnd"
- @touchcancel="handleTouchCancel"
- >
- {{key}}
- </view>
- <view class="alphabet-alert" v-if="touchmove">
- {{activeClass}}
- </view>
- </view>
- </template>
- <script>
- export default {
- name:"phone-alphabet",
- props:{
- phones:Object,
- phoneListIndex:String
- },
- data() {
- return {
- touchStatus:false,
- timer:null,
- activeClass:'A',
- phonesArr:[],
- touchmove:false
- };
- },
- mounted () {
- let phonesArr = Object.keys(this.phones)
- this.phonesArr = phonesArr
- },
- watch:{
- phoneListIndex (index) {
- this.activeClass = index
- }
- },
- methods:{
- handleTouchStart (e) {
- this.$emit('reset',false)
- let key = e.target.dataset.key
- this.activeClass = key
- this.$emit('change',e.target.dataset.key)
- this.touchStatus = true
- },
- handleTouchMove (e) {
- this.$emit('scrollAnimationOFF',false)
- if(this.touchStatus){
- this.touchmove = true
- if(this.timer){
- clearTimeout(this.timer)
- }
- this.timer = setTimeout(()=>{
- const touchY = e.touches[0].clientY - 54
- const index = Math.floor(touchY / 20)
- if(index >= 0 && index < this.phonesArr.length){
- this.activeClass = this.phonesArr[index]
- this.$emit('change',this.phonesArr[index])
- }
- },16)
- }
- },
- handleTouchEnd (e) {
- this.$emit('scrollAnimationOFF',true)
- this.touchStatus = false
- this.touchmove = false
- }
- }
- }
- </script>
- <style>
- .alphabet>.active,.hover{
- color: #fff;
- background-color: #0190a0;
- border-radius: 40upx;
- }
- .alphabet{
- display: flex;
- flex-direction: column;
- text-align: center;
- z-index: 10;
- padding: 10upx 10upx 0 10upx;
- }
- .alphabet-item{
- width: 40upx;
- font-size:24upx;
- height: 40upx;
- line-height: 40upx;
-
- }
- .alphabet-alert{
- position: absolute;
- z-index: 20;
- width: 160upx;
- height: 160upx;
- left: 50%;
- top: 50%;
- margin-left: -80upx;
- margin-top: -80upx;
- border-radius: 80upx;
- text-align: center;
- line-height: 160upx;
- font-size: 70upx;
- color: #fff;
- background-color: rgba(0, 0, 0, 0.5);
- }
- </style>
|