BrandCenter.vue 5.4 KB

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