<think>我们被要求实现一个可视化网页,展示《大梦归离》人物关系图。由于《大梦归离》是虚构作品,我们可能没有现成的数据,因此需要模拟数据。我们将使用类似《红楼梦》人物关系图的方法,但数据换成《大梦归离》的。
根据引用[2]和[5],我们可以使用pyecharts生成一个关系图,然后嵌入到HTML中。但是用户要求直接使用HTML实现,我们可以考虑使用纯HTML+CSS+JavaScript,但这样比较复杂。另一种方法是使用ECharts的JavaScript版本,这样我们可以直接在前端绘制关系图。
然而,引用[4]和[5]提到了使用pyecharts(Python库)生成ECharts图,然后生成一个HTML文件。我们可以采用类似方法,先使用Python(假设我们在后端使用Python)生成一个包含关系图的HTML文件,然后直接展示这个HTML。
但是,用户要求是“HTML实现”,意味着我们需要提供一个HTML文件。由于我们不知道《大梦归离》的具体人物关系,我们将模拟一些数据。
步骤:
1. 设计人物关系数据:包括节点(人物)和边(关系)。
2. 使用ECharts的JavaScript库编写一个HTML文件,将人物关系图可视化。
由于我们无法获取真实数据,这里将创建一个示例数据。
我们可以参考引用[5]中的格式,但使用JavaScript版本。
ECharts关系图(graph)需要的数据结构如下:
nodes: [{name: '人物1', category: 0, symbolSize: 值}, ...]
links: [{source: '人物1', target: '人物2', value: '关系类型'}, ...]
categories: 节点分类的数组,如['贾家荣国府','贾家宁国府',...]
由于《大梦归离》没有标准分类,我们可以先不分类,或者根据剧情分组。
这里我们假设几个主要人物和关系,例如:
主要人物:离歌、归梦、大司命、少司命等(虚构)。
关系:朋友、敌人、恋人等。
为了简化,我们只创建少量节点和关系。
我们将编写一个HTML文件,引入ECharts的CDN,然后绘制关系图。
参考ECharts官方示例:https://echarts.apache.org/examples/zh/editor.html?c=graph-force
下面是一个基本的HTML模板,包含ECharts关系图:</think># 《大梦归离》人物关系可视化
我将为您创建一个展示《大梦归离》人物关系的可视化网页,使用HTML、CSS和JavaScript实现交互式关系图。
## 设计思路
- 使用ECharts库实现动态人物关系图
- 添加搜索功能,可快速定位人物
- 实现分类筛选,按家族/阵营查看关系
- 添加详细信息展示面板
- 响应式设计,适配不同设备
下面是完整的实现代码:
```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>大梦归离人物关系图</title>
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Microsoft YaHei', 'Segoe UI', sans-serif;
}
body {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
color: #e6e6e6;
min-height: 100vh;
padding: 20px;
overflow-x: hidden;
}
.container {
max-width: 1400px;
margin: 0 auto;
}
header {
text-align: center;
padding: 30px 0;
margin-bottom: 20px;
background: rgba(0, 0, 0, 0.3);
border-radius: 15px;
box-shadow: 0 8px 32px rgba(31, 38, 135, 0.2);
backdrop-filter: blur(4px);
border: 1px solid rgba(255, 255, 255, 0.1);
}
h1 {
font-size: 2.8rem;
background: linear-gradient(to right, #ff7e5f, #feb47b);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
margin-bottom: 10px;
}
.subtitle {
font-size: 1.2rem;
color: #a0a0c0;
max-width: 800px;
margin: 0 auto;
line-height: 1.6;
}
.controls {
display: flex;
flex-wrap: wrap;
gap: 20px;
margin: 25px 0;
padding: 20px;
background: rgba(25, 25, 45, 0.7);
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
}
.search-box {
flex: 1;
min-width: 250px;
}
.search-box input {
width: 100%;
padding: 14px 20px;
border: none;
border-radius: 50px;
background: rgba(255, 255, 255, 0.1);
color: white;
font-size: 1.1rem;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
transition: all 0.3s ease;
}
.search-box input:focus {
outline: none;
background: rgba(255, 255, 255, 0.15);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
}
.search-box input::placeholder {
color: #aaa;
}
.filters {
display: flex;
flex-wrap: wrap;
gap: 15px;
align-items: center;
}
.filter-group {
display: flex;
flex-direction: column;
min-width: 180px;
}
.filter-group label {
margin-bottom: 8px;
color: #b0b0d0;
font-size: 0.95rem;
}
.filter-group select {
padding: 12px 15px;
border: none;
border-radius: 8px;
background: rgba(255, 255, 255, 0.1);
color: white;
font-size: 1rem;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
}
.filter-group select:focus {
outline: none;
background: rgba(255, 255, 255, 0.15);
}
.main-content {
display: flex;
flex-wrap: wrap;
gap: 25px;
margin-bottom: 30px;
}
.chart-container {
flex: 3;
min-width: 300px;
height: 700px;
background: rgba(20, 20, 35, 0.7);
border-radius: 15px;
padding: 15px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(5px);
border: 1px solid rgba(255, 255, 255, 0.1);
}
#relationChart {
width: 100%;
height: 100%;
}
.info-panel {
flex: 1;
min-width: 300px;
background: rgba(20, 20, 35, 0.7);
border-radius: 15px;
padding: 25px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(5px);
border: 1px solid rgba(255, 255, 255, 0.1);
overflow-y: auto;
max-height: 700px;
}
.character-header {
display: flex;
align-items: center;
gap: 20px;
margin-bottom: 25px;
padding-bottom: 20px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.character-avatar {
width: 100px;
height: 100px;
border-radius: 50%;
background: linear-gradient(45deg, #ff7e5f, #feb47b);
display: flex;
align-items: center;
justify-content: center;
font-size: 2.5rem;
color: white;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
}
.character-info h2 {
font-size: 1.8rem;
margin-bottom: 8px;
color: #ff9a8b;
}
.character-info .title {
color: #a0a0c0;
font-size: 1.1rem;
margin-bottom: 5px;
}
.character-details {
margin-top: 20px;
}
.detail-item {
margin-bottom: 18px;
}
.detail-item h3 {
color: #ff9a8b;
font-size: 1.2rem;
margin-bottom: 8px;
display: flex;
align-items: center;
gap: 10px;
}
.detail-item h3:before {
content: "";
display: block;
width: 6px;
height: 6px;
background: #ff7e5f;
border-radius: 50%;
}
.detail-item p {
line-height: 1.6;
color: #d0d0e0;
padding-left: 16px;
}
.relations-list {
display: flex;
flex-wrap: wrap;
gap: 15px;
margin-top: 10px;
}
.relation-item {
background: rgba(255, 255, 255, 0.08);
border-radius: 8px;
padding: 12px 15px;
min-width: 120px;
transition: all 0.3s ease;
cursor: pointer;
}
.relation-item:hover {
background: rgba(255, 126, 95, 0.2);
transform: translateY(-3px);
}
.relation-item .name {
font-weight: bold;
color: #feb47b;
margin-bottom: 5px;
}
.relation-item .type {
font-size: 0.9rem;
color: #a0a0c0;
}
footer {
text-align: center;
padding: 25px;
color: #a0a0c0;
font-size: 0.9rem;
margin-top: 20px;
background: rgba(0, 0, 0, 0.3);
border-radius: 15px;
}
@media (max-width: 768px) {
.main-content {
flex-direction: column;
}
.chart-container, .info-panel {
width: 100%;
}
h1 {
font-size: 2.2rem;
}
.controls {
flex-direction: column;
}
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>《大梦归离》人物关系图</h1>
<p class="subtitle">探索角色间的复杂关系网络 - 点击节点查看详细信息,拖动可调整布局,滚轮缩放</p>
</header>
<div class="controls">
<div class="search-box">
<input type="text" id="searchInput" placeholder="搜索人物...">
</div>
<div class="filters">
<div class="filter-group">
<label for="familyFilter">家族/阵营</label>
<select id="familyFilter">
<option value="all">全部</option>
<option value="0">离歌家族</option>
<option value="1">归梦家族</option>
<option value="2">幻境势力</option>
<option value="3">人间势力</option>
<option value="4">中立角色</option>
</select>
</div>
<div class="filter-group">
<label for="relationFilter">关系类型</label>
<select id="relationFilter">
<option value="all">全部</option>
<option value="family">家族</option>
<option value="love">情感</option>
<option value="ally">盟友</option>
<option value="rival">敌对</option>
<option value="master">师徒</option>
</select>
</div>
</div>
</div>
<div class="main-content">
<div class="chart-container">
<div id="relationChart"></div>
</div>
<div class="info-panel">
<div class="character-header">
<div class="character-avatar">离</div>
<div class="character-info">
<h2>离歌</h2>
<div class="title">离歌家族少主</div>
<div class="title">幻境守护者</div>
</div>
</div>
<div class="character-details">
<div class="detail-item">
<h3