FamilyFeed.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <template>
  2. <view class="family-feed">
  3. <!-- 有动态:标题 + 小喇叭 + 单行滚动 -->
  4. <view class="feed-row" v-if="marqueeText">
  5. <view class="feed-header" v-if="showHeader">
  6. <text class="feed-title">动态</text>
  7. <text class="feed-icon">📢</text>
  8. </view>
  9. <view class="feed-marquee">
  10. <view class="feed-marquee-inner">
  11. <text class="feed-marquee-text">{{ marqueeText }}</text>
  12. <text class="feed-marquee-text">{{ marqueeText }}</text>
  13. </view>
  14. </view>
  15. </view>
  16. <!-- 空态 -->
  17. <view v-else class="feed-empty">
  18. <text class="feed-empty-text">暂无动态</text>
  19. </view>
  20. </view>
  21. </template>
  22. <script>
  23. export default {
  24. name: 'FamilyFeed',
  25. props: {
  26. items: {
  27. type: Array,
  28. default: function() { return [] }
  29. },
  30. notices: {
  31. type: Array,
  32. default: function() { return [] }
  33. },
  34. showHeader: {
  35. type: Boolean,
  36. default: true
  37. }
  38. },
  39. computed: {
  40. marqueeText: function() {
  41. var parts = []
  42. var i
  43. var notices = this.notices || []
  44. for (i = 0; i < notices.length; i++) {
  45. var n = notices[i]
  46. if (n && n.title) {
  47. parts.push(n.title)
  48. }
  49. }
  50. var items = this.items || []
  51. for (i = 0; i < items.length; i++) {
  52. var item = items[i]
  53. if (item && item.type !== 'notice' && item.text) {
  54. parts.push(item.text)
  55. }
  56. }
  57. return parts.join(' | ')
  58. }
  59. }
  60. }
  61. </script>
  62. <style>
  63. .family-feed {
  64. margin: 12rpx 30rpx 0;
  65. background: #fff;
  66. border-radius: 16rpx;
  67. padding: 10rpx 16rpx;
  68. box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
  69. overflow: hidden;
  70. }
  71. .feed-row {
  72. display: flex;
  73. flex-direction: row;
  74. align-items: center;
  75. height: 44rpx;
  76. line-height: 44rpx;
  77. overflow: hidden;
  78. }
  79. .feed-header {
  80. display: flex;
  81. flex-direction: row;
  82. align-items: center;
  83. gap: 4rpx;
  84. flex-shrink: 0;
  85. margin-right: 12rpx;
  86. }
  87. .feed-title {
  88. font-size: 24rpx;
  89. font-weight: bold;
  90. color: #333;
  91. }
  92. .feed-icon {
  93. font-size: 20rpx;
  94. }
  95. /* 单行跑马灯 */
  96. .feed-marquee {
  97. flex: 1;
  98. overflow: hidden;
  99. white-space: nowrap;
  100. height: 44rpx;
  101. line-height: 44rpx;
  102. }
  103. .feed-marquee-inner {
  104. display: inline-flex;
  105. flex-direction: row;
  106. white-space: nowrap;
  107. animation: feedMarquee 20s linear infinite;
  108. }
  109. .feed-marquee-text {
  110. font-size: 24rpx;
  111. color: #666;
  112. white-space: nowrap;
  113. padding-right: 40rpx;
  114. }
  115. @keyframes feedMarquee {
  116. 0% { transform: translateX(0); }
  117. 100% { transform: translateX(-50%); }
  118. }
  119. .feed-empty {
  120. height: 44rpx;
  121. line-height: 44rpx;
  122. text-align: center;
  123. }
  124. .feed-empty-text {
  125. font-size: 24rpx;
  126. color: #ccc;
  127. }
  128. </style>