angular九宫格ui

ops/2025/3/20 13:09:35/

说明:angular九宫格ui
效果图:
在这里插入图片描述

step1:
C:\Users\wangrusheng\WebstormProjects\untitled4\src\app\order\order.component.ts

javascript">import { Component } from '@angular/core';
import {NgForOf} from '@angular/common';interface Order {title: string;price: string;requirementType: string;referenceUrl: string;options: string[];status: string;publishDate: string;paymentMode: string;
}@Component({selector: 'app-order',imports: [NgForOf],templateUrl: './order.component.html',styleUrl: './order.component.css'
})
export class OrderComponent {orders: Order[] = [];constructor() {// 生成测试数据for(let i = 1; i <= 8; i++) {this.orders.push({title: `网站定制开发项目 ${i}`,price: `${1200 + i * 100}`,requirementType: '网站定制开发',referenceUrl: 'https://papermk.com/案例' + i,options: ['整站开发', '响应式', '后台管理', '多语言'],status: i % 2 === 0 ? '进行中' : '已结案',publishDate: `2024-03-${i.toString().padStart(2, '0')}发布`,paymentMode: i % 3 === 0 ? '项目付费' : '招标付费'});}}selectedOption: { [key: number]: string } = {};selectOption(orderIndex: number, option: string) {this.selectedOption[orderIndex] = option;}
}

step2:
C:\Users\wangrusheng\WebstormProjects\untitled4\src\app\order\order.component.html

<div class="grid-container"><div *ngFor="let order of orders; let i = index" class="card"><!-- Header Section --><div class="header-section"><h1 class="title">{{ order.title }}</h1><p class="price">{{ order.price }}</p></div><!-- Reference Section --><div class="reference-section"><p class="section-label">需求类型</p><p class="reference-text">{{ order.requirementType }}</p><a class="reference-link" href="{{ order.referenceUrl }}" target="_blank">参考链接</a></div><!-- Options Section --><div class="options-section"><button *ngFor="let option of order.options"class="option-button"[class.selected]="selectedOption[i] === option"(click)="selectOption(i, option)">{{ option }}</button></div><!-- Status Section --><div class="status-section"><div class="status-group"><span class="status-badge">{{ order.status }}</span><span class="publish-date">{{ order.publishDate }}</span><span class="payment-mode">{{ order.paymentMode }}</span></div></div></div>
</div>

step3:
C:\Users\wangrusheng\WebstormProjects\untitled4\src\app\order\order.component.css

/* Grid布局 */
.grid-container {display: grid;grid-template-columns: repeat(3, 1fr);gap: 20px;max-width: 1200px;margin: 20px auto;padding: 0 20px;
}/* Card样式 */
.card {background: #ffffff;border-radius: 12px;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.08);padding: 20px;transition: transform 0.2s, box-shadow 0.2s;break-inside: avoid;
}.card:hover {transform: translateY(-2px);box-shadow: 0 6px 12px rgba(0, 0, 0, 0.12);
}/* Header Section */
.header-section {display: flex;justify-content: space-between;align-items: center;margin-bottom: 16px;padding-bottom: 12px;border-bottom: 1px solid #f0f0f0;
}.title {font-size: 16px;line-height: 1.3;margin: 0;color: #2d3748;font-weight: 600;
}.price {font-size: 14px;color: #38a169;margin: 0;font-weight: 500;
}/* Reference Section */
.reference-section {margin-bottom: 16px;
}.section-label {font-size: 12px;color: #718096;margin: 0 0 4px 0;
}.reference-text {font-size: 14px;color: #2d3748;margin: 6px 0;
}.reference-link {color: #4299e1;font-size: 12px;text-decoration: none;display: block;margin-top: 8px;transition: color 0.2s;
}.reference-link:hover {color: #3182ce;
}/* Options Section */
.options-section {display: grid;grid-template-columns: repeat(2, 1fr);gap: 8px;margin-bottom: 16px;
}.option-button {padding: 8px 12px;border: none;border-radius: 8px;background: #f8f9fa;color: #2d3748;font-size: 12px;cursor: pointer;transition: all 0.2s;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);font-weight: 500;
}.option-button:hover {background: #e9ecef;box-shadow: 0 3px 6px rgba(0, 0, 0, 0.1);
}.option-button.selected {background: #2d3748;color: white;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}/* Status Section */
.status-section {padding-top: 16px;border-top: 1px solid #f0f0f0;
}.status-group {display: flex;justify-content: space-between;align-items: center;gap: 8px;
}.status-badge,
.publish-date,
.payment-mode {font-size: 12px;padding: 6px 12px;border-radius: 16px;background: #f8f9fa;color: #4a5568;white-space: nowrap;display: inline-flex;align-items: center;
}.status-badge {background: #e9f5eb;color: #38a169;
}/* 响应式布局 */
@media (max-width: 992px) {.grid-container {grid-template-columns: repeat(2, 1fr);}
}@media (max-width: 768px) {.grid-container {grid-template-columns: 1fr;}.status-group {flex-wrap: wrap;}.options-section {grid-template-columns: 1fr;}
}@media (max-width: 480px) {.card {padding: 16px;}.status-badge,.publish-date,.payment-mode {font-size: 11px;padding: 4px 8px;}
}

end

文章来源:https://blog.csdn.net/cf8833/article/details/146274734
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/ops/166879.html

相关文章

Unity 从零开始的框架搭建1-6 读Excel配置表自动生成json和数据结构类

本人水平有限 如有不足还请斧正,本文仅作学习交流使用不做任何商业用途 目录 效果 Excel结构 需要插件 读表算法 代码 效果 Unity Excel一键读表转json和数据结构类 Excel结构 需要插件 Epplus的dll即可 可以网上搜索 或者用Vs工具下载 另外我已上传资源 读表算法 看…

深度学习有哪些算法?

深度学习包含多种算法和模型&#xff0c;广泛应用于图像处理、自然语言处理、语音识别等领域。以下是主要分类及代表性算法&#xff1a; 一、基础神经网络 多层感知机&#xff08;MLP&#xff09; 最简单的深度学习模型&#xff0c;由多个全连接层组成&#xff0c;用于分类和回…

印刷店常用的PDF批量页码统计软件

参考原文&#xff1a;印刷店常用的PDF批量页码统计软件 支持在不打开文件的情况下批量统计出PDF文档的页码数&#xff0c;还可以协助计算出打印费。 针对统计出错的文档&#xff0c;还可以筛选出来。 需要支持的使用环境&#xff01; 支持Windows10以上环境可以直接运行&…

DeepSeek大模型在政务服务领域的应用

DeepSeek大模型作为国产人工智能技术的代表&#xff0c;近年来在政务服务领域的应用呈现多点开花的态势。通过多地实践&#xff0c;该技术不仅显著提升了政务服务的效率与智能化水平&#xff0c;还推动了政府治理模式的创新。以下从技术应用场景、典型案例及发展趋势三个维度进…

QAI AppBuilder 快速上手(7):目标检测应用实例

YOLOv8_det是YOLO 系列目标检测模型&#xff0c;专为高效、准确地检测图像中的物体而设计。该模型通过引入新的功能和改进点&#xff0c;如因式分解卷积&#xff08;factorized convolutions&#xff09;和批量归一化&#xff08;batch normalization&#xff09;&#xff0c;在…

python爬虫笔记(一)

文章目录 html基础标签和下划线无序列表和有序列表表格加边框 html的属性a标签&#xff08;网站&#xff09;target属性换行线和水平分割线 图片设置宽高width&#xff0c;height html区块——块元素与行内元素块元素与行内元素块元素举例行内元素举例 表单from标签type属性pla…

ImGui 学习笔记(五) —— 字体文件加载问题

ImGui 加载字体文件的函数似乎存在编码问题&#xff0c;这一点可能跟源文件的编码也有关系&#xff0c;我目前源文件编码是 UTF-16。 当参数中包含中文字符时&#xff0c;ImGui 内部将字符转换为宽字符字符集时候&#xff0c;采用的 MultiByteToWideChar API 参数不太对&#…

Java 的 CopyOnWriteArrayList 和 Collections.synchronizedList 有什么区别?分别有什么优缺点?

CopyOnWriteArrayList 问题:什么是 CopyOnWriteArrayList? 解答: CopyOnWriteArrayList 是 Java 并发包 (java.util.concurrent) 提供的一种 线程安全 的 List 实现,它的核心特性是 写时复制(Copy-On-Write)。即,每当执行修改操作(如 add()、set()、remove())时,都…