BrandCenter.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <template>
  2. <div class="mobile-brand-center">
  3. <div class="mobile-brand-wrap">
  4. <div class="mobile-brand-header">
  5. <img src="/images/mobile/@2x/brand/brandWall.png" alt="" v-show="!isScrolled">
  6. <div class="mobile-brand-index" :class="{'scrolled': isScrolled}">
  7. <p>索引:</p>
  8. <nuxt-link :to="'/mobile/brand/brandCenter/' + item"
  9. :class="{'active': item == activeIndex}"
  10. :key="key" v-for="(item, key) in initArr">{{item}}</nuxt-link>
  11. </div>
  12. </div>
  13. <div class="mobile-brand-list">
  14. <div v-for="(brands, initial) in brandList">
  15. <div class="brand-initial">
  16. <p v-text="initial"></p>
  17. <span>
  18. {{initial}}开头共<span>{{brands.length || 0}}</span>个品牌
  19. </span>
  20. </div>
  21. <div class="brand-items">
  22. <nuxt-link :to="`/mobile/brand/${brand.uuid}/`" :key="key" v-for="(brand, key) in brands">
  23. <div>{{brand.nameEn}}</div>
  24. </nuxt-link>
  25. </div>
  26. </div>
  27. </div>
  28. </div>
  29. </div>
  30. </template>
  31. <script>
  32. function sortList (letter) {
  33. return function (a, b) {
  34. var value1 = a[letter]
  35. var value2 = b[letter]
  36. if (value1 > value2) {
  37. return 1
  38. } else if (value1 < value2) {
  39. return -1
  40. } else {
  41. return 0
  42. }
  43. }
  44. }
  45. export default {
  46. name: 'brandList',
  47. data () {
  48. return {
  49. initArr: [
  50. 'ABCD', 'EFGH', 'IJKL', 'MNOP', 'QRST', 'UVWX', 'YZ', '0~9'
  51. ],
  52. activeIndex: this.$route.params.initial,
  53. isScrolled: false
  54. }
  55. },
  56. mounted: function () {
  57. this.$nextTick(function () {
  58. window.addEventListener('scroll', this.onScroll)
  59. })
  60. },
  61. computed: {
  62. brandList () {
  63. let brandsList = this.$store.state.product.brand.brandList.data
  64. if (brandsList) {
  65. for (let i in brandsList) {
  66. brandsList[i] = brandsList[i].sort(sortList('nameEn'))
  67. }
  68. }
  69. let temp = {}
  70. let keys = []
  71. for (let key in brandsList) {
  72. keys.push(key)
  73. }
  74. keys = keys.sort()
  75. for (let i = 0; i < keys.length; i++) {
  76. temp[keys[i]] = brandsList[keys[i]]
  77. }
  78. return temp
  79. }
  80. },
  81. methods: {
  82. onScroll () {
  83. if (this.$route.path.startsWith('/mobile/brand/brandCenter')) {
  84. let scrolled = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
  85. this.isScrolled = scrolled > 0
  86. }
  87. }
  88. }
  89. }
  90. </script>
  91. <style lang="scss" scoped>
  92. .mobile-brand-center {
  93. width: 100%;
  94. background: #f7f7f7;
  95. padding-top: .24rem;
  96. .mobile-brand-wrap {
  97. width: 6.96rem;
  98. background: #fff;
  99. margin: 0 auto;
  100. padding: 0 .21rem;
  101. .mobile-brand-header {
  102. text-align: center;
  103. >img {
  104. margin: .24rem auto .19rem;
  105. width: 6.09rem;
  106. height: .66rem;
  107. }
  108. .mobile-brand-index {
  109. font-size: .3rem;
  110. line-height: .62rem;
  111. background: #f4fafd;
  112. margin: .19rem 0 .25rem 0;
  113. padding: 0 .07rem;
  114. text-align: left;
  115. p {
  116. float: left;
  117. }
  118. a {
  119. color: #666;
  120. width: 1.1rem;
  121. display: inline-block;
  122. text-align: center;
  123. &.active {
  124. color: #418bf6;
  125. }
  126. }
  127. &.scrolled {
  128. position: fixed;
  129. top: 0;
  130. width: 100%;
  131. background: #fff;
  132. box-shadow: 1px 1px 1px #ccc;
  133. left: 0;
  134. padding-left: .58rem;
  135. margin-top: 0;
  136. }
  137. }
  138. }
  139. .mobile-brand-list {
  140. font-size: .3rem;
  141. .brand-initial {
  142. border-bottom: .02rem solid #418bf6;
  143. p {
  144. width: .64rem;
  145. height: .43rem;
  146. margin: 0;
  147. background: #418bf6;
  148. color: #fff;
  149. font-size: .32rem;
  150. text-align: center;
  151. display: inline-block;
  152. border-top-left-radius: .05rem;
  153. border-top-right-radius: .05rem;
  154. }
  155. >span {
  156. font-size: .22rem;
  157. color: #999;
  158. >span {
  159. color: #418bf6;
  160. }
  161. }
  162. }
  163. .brand-items {
  164. flex-wrap: wrap;
  165. display: flex;
  166. overflow: hidden;
  167. margin-bottom: .2rem;
  168. a {
  169. overflow: hidden;
  170. display: inline-block;
  171. color: #333;
  172. border-radius: .05rem;
  173. background: #fff;
  174. margin: .19rem .42rem 0 0;
  175. &:nth-child(3n) {
  176. margin-right: 0;
  177. }
  178. div {
  179. width: 1.9rem;
  180. height: .59rem;
  181. line-height: .59rem;
  182. text-align: left;
  183. text-overflow: ellipsis;
  184. white-space: nowrap;
  185. overflow: hidden;
  186. }
  187. }
  188. }
  189. }
  190. }
  191. }
  192. </style>