当前位置: 首页 > article >正文

基于css的Grid布局和vue实现点击左移右移轮播过渡动画效果

在这里插入图片描述

直接上代码,以下代码基于vue2,需要Vue3或者react可以使用国内直连GPT/Claude来帮你转换下

代码如下:

// ScrollCardsGrid.vue
<template>
  <div class="scroll-cards-container">
    <!-- 左箭头 -->
    <div v-show="showLeftArrow" class="scroll-arrow left-arrow" @click="handleScrollLeft">
      <i class="arrow-icon"></i>
    </div>

    <!-- 卡片容器 -->
    <div class="cards-container" ref="cardsContainer" @scroll="handleScroll">
      <div class="cards-grid">
        <div v-for="(card, index) in cards" :key="index" class="card">
          <div class="card-content">
            <img :src="card.icon" class="card-icon" :alt="card.title" />
            <div class="card-info">
              <h3 class="card-title">{{ card.title }}</h3>
              <p class="card-description">{{ card.description }}</p>
            </div>
          </div>
        </div>
      </div>
    </div>

    <!-- 右箭头 -->
    <div v-show="showRightArrow" class="scroll-arrow right-arrow" @click="handleScrollRight">
      <i class="arrow-icon"></i>
    </div>
  </div>
</template>

<script>
export default {
  name: 'ScrollCardsGrid',
  data() {
    return {
      showLeftArrow: false,
      showRightArrow: false,
      scrollStep: 300,
      cards: [
        {
          icon: '/path/to/llama.png',
          title: 'Llama-3.1-405B',
          description: '作为Meta的Llama 3.1系列的巅峰之作...'
        },
        {
          icon: '/path/to/claude.png',
          title: 'Claude-3.5-Hai',
          description: 'The latest generation of Anthropic\'s fastest...'
        },
        {
          icon: '/path/to/chatgpt.png',
          title: 'ChatGPT-4o-La',
          description: 'OpenAI的最强大的模型...'
        },
        {
          icon: '/path/to/gpt4.png',
          title: 'GPT-4o-Mini',
          description: 'OpenAI的最新模型...'
        },
        {
          icon: '/path/to/gemini.png',
          title: 'Gemini-1.5-Pro',
          description: 'Google的Gemini系列多模态模型...'
        },
        {
          icon: '/path/to/mistral.png',
          title: 'Mistral-Medium',
          description: 'Mistral AI的中等大小模型...'
        },
        {
          icon: '/path/to/gemini-flash.png',
          title: 'Gemini-1.5-Flash',
          description: 'Powered by gemini-1.5-flash-002...'
        },
        {
          icon: '/path/to/llama70b.png',
          title: 'Llama-3.1-70B',
          description: '作为Meta的Llama 3.1系列的中型成员...'
        }
      ]
    }
  },
  mounted() {
    this.checkArrows()
    window.addEventListener('resize', this.checkArrows)
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.checkArrows)
  },
  methods: {
    checkArrows() {
      const container = this.$refs.cardsContainer
      if (!container) return
      
      this.showLeftArrow = container.scrollLeft > 0
      this.showRightArrow = 
        container.scrollLeft < (container.scrollWidth - container.clientWidth)
    },
    handleScroll() {
      this.checkArrows()
    },
    handleScrollLeft() {
      const container = this.$refs.cardsContainer
      container.scrollBy({
        left: -this.scrollStep,
        behavior: 'smooth'
      })
    },
    handleScrollRight() {
      const container = this.$refs.cardsContainer
      container.scrollBy({
        left: this.scrollStep,
        behavior: 'smooth'
      })
    }
  }
}
</script>

<style scoped>
.scroll-cards-container {
  position: relative;
  width: 600px;
  margin: 0 auto;
  margin-top: 200px;
  display: flex;
  align-items: center;
}

.cards-container {
  width: 100%;
  overflow-x: auto;
  scroll-behavior: smooth;
  /* 隐藏滚动条但保持功能 */
  scrollbar-width: none;
  -ms-overflow-style: none;
  padding: 16px 0;
}

.cards-container::-webkit-scrollbar {
  display: none;
}

.cards-grid {
  display: grid;
  /* 固定两行 */
  grid-template-rows: repeat(2, 1fr);
  /* 自动填充列,每列最小宽度280px */
  grid-auto-flow: column;
  grid-auto-columns: 280px;
  gap: 16px;
  padding: 0 16px;
}

.card {
  background: #ffffff;
  border: 1px solid #e5e7eb;
  border-radius: 12px;
  padding: 16px;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
  /* 确保卡片高度一致 */
  height: 88px;
  box-sizing: border-box;
}

.card-content {
  display: flex;
  gap: 12px;
  height: 100%;
}

.card-icon {
  width: 48px;
  height: 48px;
  border-radius: 8px;
  object-fit: cover;
}

.card-info {
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.card-title {
  margin: 0 0 4px 0;
  font-size: 16px;
  font-weight: 600;
  line-height: 1.2;
}

.card-description {
  margin: 0;
  font-size: 14px;
  color: #6b7280;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  line-height: 1.3;
}

.scroll-arrow {
  position: absolute;
  width: 40px;
  height: 40px;
  background: rgba(255, 255, 255, 0.9);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  z-index: 1;
  transition: all 0.3s ease;
}

.scroll-arrow:hover {
  background: rgba(255, 255, 255, 1);
  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}

.left-arrow {
  left: -20px;
}

.right-arrow {
  right: -20px;
}

.arrow-icon {
  font-style: normal;
  color: #374151;
}

/* 适配移动端 */
@media (max-width: 640px) {
  .cards-grid {
    grid-template-rows: 1fr; /* 在移动端切换为单行 */
  }
  
  .scroll-arrow {
    display: none; /* 在移动端隐藏箭头 */
  }
}
</style>

http://www.kler.cn/a/400185.html

相关文章:

  • Android 使用Retrofit 以纯二进制文件流上传文件
  • 模电数电,融会贯通
  • Android Activity Manager Service (AMS) 深入详解及源码分析
  • 5个有效的华为(HUAWEI)手机数据恢复方法
  • Oracle 单机及 RAC 环境 归档模式及路径修改
  • 【Fargo】23:采集时间转rtp时间
  • 【Patroni官方文档】复制模式
  • STM32 使用 STM32CubeMX HAL库实现低功耗模式
  • PCL 三维重建 泊松曲面重建算法
  • AIGC(生成式AI)试用 18 -- AI Prompt
  • World Wide Walrus:下一代数据存储协议
  • 【C++学习(36)】C++20的co_await 的不同使用方式和特性
  • Cellebrite VS IOS18Rebooting
  • 建设项目全生命周期数智化归档与协同管理平台
  • 【第七课】Rust所有权系统(三)
  • React|bpmn.js|react-bpmn使用示例详解
  • STARTS:一种用于自动脑电/脑磁(E/MEG)源成像的自适应时空框架|文献速递-基于深度学习的病灶分割与数据超分辨率
  • 区块链中的wasm合约是什么?
  • 主界面获取个人信息测试服务端方
  • 第6章-详细设计 6.4归一化
  • Verilog HDL学习笔记
  • JDK、MAVEN与IDEA的安装与配置
  • pytorch的模型load
  • C语言练习.if.else语句
  • 全新UI H5购物商城系统存在前台任意文件上传漏洞
  • 每日一题3239.最少翻转次数使二进制矩阵回文;