前端实现响应式以及类似响应式的效果

本文介绍了如何使用CSS媒体查询、Flex布局以及ElementPlus库中的el-row和el-col组件来创建响应式活动卡片设计,展示了如何根据不同屏幕尺寸动态调整卡片数量和宽度,以实现类似小米官方的卡片效果。
摘要由CSDN通过智能技术生成

背景:

我需要说明一下,我说的响应式类似于小米官方的卡片效果,电脑端是4个,随着宽度的减小卡片的个数而变少。

这里是宽度大的情况:

这里是宽度小的情况:

1、使用css原生的@media

这个不用多说,直接使用@media媒体响应就行了需要自己设计,主要是设计一个最小的高和宽,不然的话容易出现样式消失。

2、使用flex布局

直接给代码,主要是看css布局。

.activity-list {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
}

.activity-card {
  flex: 1 0 300px;
  margin-bottom: 20px;
  border-radius: 15px;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}

.activity-info {
  padding: 20px;
}

.feedback-input {
  padding: 0 20px 20px;
}
  1. .activity-list:这个类用于包裹所有活动卡片的容器。设置了 display: flex; 使其成为一个 Flex 布局容器,flex-wrap: wrap; 则表示子元素超出容器宽度时会自动换行,gap: 20px; 定义了子元素之间的间距为 20px。

  2. .activity-card:这个类定义了每个活动卡片的样式。flex: 1 0 300px; 设置了弹性增长,占据剩余空间,并且最大宽度为 300px,这样可以使卡片在容器中自动调整宽度。margin-bottom: 20px; 添加了下外边距,使每个卡片之间有一定的间距。border-radius: 15px; 设置了圆角为 15px,box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); 添加了一个轻微的阴影效果。

  3. .activity-info:这个类定义了活动信息部分的样式,即学号、机构 ID、校园活动 ID、学生记录等。padding: 20px; 设置了内边距为 20px,增加了内容与边框之间的间距。

  4. .feedback-input:这个类定义了反馈输入框部分的样式。padding: 0 20px 20px; 设置了上边距为 0,左右内边距为 20px,下内边距为 20px,使反馈输入框与周围内容之间有一定的间距。

这里是使用gpt说的,

这里面主要是flex属性,看官方文档  flex - CSS:层叠样式表 | MDN (mozilla.org)

flex 设置了弹性项目如何增大或缩小以适应其弹性容器中可用的空间。

然后通过父组件的显示,可以展示出类似响应式的效果。

3、使用element-plus -- <el-row>

这里还可以使用<el-row>的响应式,但是如果是按照一个for循环遍历的情况下

代码如下: 

<template>
  <div class="activity-list">
    <el-row :gutter="20">
      <el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" v-for="activity in activities" :key="activity.id">
        <el-card class="activity-card">
          <div class="activity-info">
            <p><strong>学号:</strong>{{ activity.username }}</p>
            <p><strong>机构 ID:</strong>{{ activity.institution_id }}</p>
            <p><strong>校园活动 ID:</strong>{{ activity.campus_id }}</p>
            <p><strong>学生记录:</strong>{{ activity.content }}</p>
            <p><strong>学生反馈:</strong>{{ activity.feedback_stu }}</p>
            <p><strong>机构反馈:</strong>{{ activity.feedback_institution }}</p>
          </div>
          <div class="feedback-input">
            <el-input v-model="activity.institutionFeedback" placeholder="请输入机构反馈" />
            <el-button type="primary" @click="submitFeedback(activity)">提交反馈</el-button>
          </div>
        </el-card>
      </el-col>
    </el-row>
  </div>
</template>

直接放在卡片上作为父级元素。

完整代码:

<template>
  <div class="activity-list">
    <el-card v-for="activity in activities" :key="activity.id" class="activity-card">
      <div class="activity-info">
        <p><strong>学号:</strong>{{ activity.username }}</p>
        <p><strong>机构 ID:</strong>{{ activity.institution_id }}</p>
        <p><strong>校园活动 ID:</strong>{{ activity.campus_id }}</p>
        <p><strong>学生记录:</strong>{{ activity.content }}</p>
        <p><strong>学生反馈:</strong>{{ activity.feedback_stu }}</p>
        <p><strong>机构反馈:</strong>{{ activity.feedback_institution }}</p>
      </div>
      <div class="feedback-input">
        <el-input v-model="activity.institutionFeedback" placeholder="请输入机构反馈" />
        <el-button type="primary" @click="submitFeedback(activity)">提交反馈</el-button>
      </div>
    </el-card>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';

interface Activity {
  id: number;
  username: string;
  institution_id: string;
  campus_id: string;
  content: string;
  feedback_stu: string;
  feedback_institution: string;
  institutionFeedback: string; // 新增字段:机构反馈
}

const activities = ref<Activity[]>([
  {
    id: 1,
    username: 'user1',
    institution_id: 'inst1',
    campus_id: 'campus1',
    content: 'Some activity content',
    feedback_stu: 'Student feedback',
    feedback_institution: 'Institution feedback',
    institutionFeedback: '', // 新增字段:机构反馈
  },
  {
    id: 2,
    username: 'user2',
    institution_id: 'inst2',
    campus_id: 'campus2',
    content: 'Another activity content',
    feedback_stu: 'Another student feedback',
    feedback_institution: 'Another institution feedback',
    institutionFeedback: '', // 新增字段:机构反馈
  },
]);

function submitFeedback(activity: Activity) {
  console.log(`Submitting feedback for activity with id ${activity.id}`);
  console.log(`Institution feedback: ${activity.institutionFeedback}`);
  // 这里添加提交机构反馈的逻辑,比如发送请求到后端
}
</script>

<style scoped>
.activity-list {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
}

.activity-card {
  flex: 1 0 300px; /* 自适应宽度,最大宽度 300px */
  margin-bottom: 20px;
  border-radius: 15px;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}

.activity-info {
  padding: 20px;
}

.feedback-input {
  padding: 0 20px 20px;
}
</style>

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在前端使用uniapp实现仿网易云动态的响应布局,你可以按照以下步骤进行操作: 1. 创建动态列表页面的基本结构: ```vue <template> <view class="dynamic-list"> <view class="dynamic-item" v-for="(item, index) in dynamicList" :key="index"> <!-- 动态内容 --> <view class="dynamic-content">{{ item.content }}</view> <!-- 动态图片 --> <view class="dynamic-images"> <image class="dynamic-image" v-for="(image, imageIndex) in item.images" :key="imageIndex" :src="image"></image> </view> <!-- 其他动态信息 --> <!-- ... --> </view> </view> </template> <script> export default { data() { return { dynamicList: [ { content: '这是一条动态内容', images: ['path/to/image1.jpg', 'path/to/image2.jpg'] }, // 添加更多动态对象 ] } } } </script> <style> .dynamic-list { /* 添加列表样 */ } .dynamic-item { /* 添加动态项样 */ } .dynamic-content { /* 添加动态内容样 */ } .dynamic-images { /* 添加动态图片容器样 */ } .dynamic-image { /* 添加动态图片样 */ } </style> ``` 在上述代码中,首先创建了一个动态列表页面的基本结构。通过`v-for`指令遍历`dynamicList`数组,以动态项为单位进行渲染。 2. 根据网易云动态的布局样,对各个元素进行样调整。你可以根据需要在相应的样类中添加样,以实现与网易云动态相似的效果。 3. 使用`<image>`标签来显示动态中的图片,并使用`v-for`指令遍历每个动态项中的图片数组,将图片路径绑定到`:src`属性上。 4. 添加其他动态信息的展示,如用户名、点赞数、评论数等,根据需要进行相关的布局和样调整。 这样,你就可以在uniapp中实现一个类似网易云动态的响应布局了。记得根据实际需求进行样和布局的调整。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值