File size: 9,743 Bytes
e5d8d3a 033070f e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a 744d003 e5d8d3a 9245486 e5d8d3a 9245486 40400a1 e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a 9245486 e5d8d3a b4c1b2f e5d8d3a b4c1b2f e5d8d3a b4c1b2f e5d8d3a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 |
// 响应式样式模块
// 依赖统一的断点配置(见 _breakpoints.scss)
@use "breakpoints" as *;
// ==================== Mixins ====================
// 公共容器样式:100%宽度,border-box,可见溢出
@mixin full-width-container {
width: 100%;
box-sizing: border-box;
}
// 移动端滚动容器:使用 body 滚动条,禁止横向滚动
@mixin mobile-scroll-container {
overflow: visible; // 确保不使用自己的滚动条
overflow-x: hidden; // 禁止横向滚动
overflow-y: visible; // 允许垂直滚动,使用body的滚动条
}
// 全宽自适应容器:100%宽度,不超过父容器
@mixin full-width-adaptive {
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
// 平板及以上(≥768px)- 桌面端样式
@media (min-width: $breakpoint-tablet) {
// 桌面端:html 和 body 使用固定高度
html {
height: 100%; // 确保html高度为100%
}
body {
height: 100vh; // 使用100vh确保填满视口,消除底部空白
min-height: 100vh; // 同时设置min-height作为备用
}
.main_frame {
position: fixed;
top: 0px;
left: 0;
width: 100%;
height: 100%; // 使用100%而不是100vh,基于body的高度,消除底部空白
min-height: 100vh; // 确保至少填满视口
display: flex; // 保持flex布局用于左右面板
overflow: hidden;
}
// 左侧内容区域
.left_panel {
flex: 0 0 1200px; // 设置一个合理的默认值,会被JS动态覆盖
min-width: 10vw; // 最小宽度为屏幕宽度的10%
max-width: 90vw; // 最大宽度为屏幕宽度的90%
padding: 20px;
overflow-y: auto;
overflow-x: hidden; // 防止水平滚动,确保内容不会被遮挡
border-right: 1px solid var(--border-color);
background-color: var(--bg-color);
box-sizing: border-box; // 确保padding包含在宽度计算中
transition: background-color 0.3s ease, border-color 0.3s ease;
// 确保所有直接子元素都能正确适配
> * {
max-width: 100%; // 确保子元素不超过容器宽度
box-sizing: border-box; // 确保宽度计算正确
}
}
// 分割线样式
.resizer {
width: 8px;
background: var(--resizer-bg);
cursor: col-resize;
position: relative;
flex-shrink: 0;
transition: background-color 0.3s ease;
}
.resizer::before {
content: '';
position: absolute;
left: 50%;
top: 0;
bottom: 0;
width: 2px;
background: var(--border-color);
transform: translateX(-50%);
transition: background-color 0.3s ease;
}
.resizer:hover::before {
background: var(--resizer-hover);
}
// 右侧可视化结果区域
.right_panel {
flex: 1; // 占据剩余空间
padding: 0; // 移除 padding,让 LMF 层填充整个区域
overflow-y: auto;
overflow-x: hidden; // 禁止横向滚动,但允许内容溢出以显示发光效果
background: var(--panel-bg);
transition: background-color 0.3s ease;
position: relative; // 为绝对定位的子元素提供定位上下文
}
// 确保 #results 容器不裁剪发光效果,并填充整个 right_panel
#results {
@include full-width-container;
overflow: visible; // 确保发光效果不被裁剪
position: relative; // 相对定位,让内容自然扩展
min-height: 100%; // 至少填充整个 right_panel
margin: 0; // 移除 margin-top
}
// GLTR 文本容器桌面端布局样式
.LMF {
@include full-width-container;
min-height: 100%; // 至少填充整个 #results 容器
// 添加 padding 为发光效果留出空间(drop-shadow 最大约 16px)
padding: 20px; // 为发光效果留出足够空间,略大于最大阴影范围
// 桌面端:容器高度通常超过350px,不需要额外的底部padding
// 只在容器高度不足时,min-height会生效保证至少350px(在基础样式中定义)
overflow: visible; // 确保发光效果不被裁剪,不使用自己的滚动条
}
.floating_content {
@include full-width-adaptive;
}
}
// 移动端响应式样式(≤767px)
@media (max-width: $breakpoint-mobile) {
// 重置 html 和 body,避免默认 margin/padding 和高度问题
html {
margin: 0;
padding: 0;
height: auto; // 不使用固定高度,避免100vh问题
overflow-x: hidden;
width: 100%;
max-width: 100vw;
touch-action: pan-y;
}
body {
margin: 0;
padding: 0;
overflow-y: auto; // 允许垂直滚动
overflow-x: hidden;
width: 100%;
max-width: 100vw;
height: auto; // 不使用100vh,让高度自适应内容
min-height: 0; // 移除最小高度限制
touch-action: pan-y; // 允许垂直触摸滑动
-webkit-overflow-scrolling: touch; // iOS平滑滚动
}
// 主框架移动端样式
.main_frame {
position: relative; // 覆盖桌面端的固定定位
height: auto; // 覆盖桌面端的100vh,避免移动浏览器UI高度不一致
min-height: 0; // 移除最小高度限制
flex-direction: column;
overflow-x: hidden; // 禁止横向滚动
overflow-y: visible; // 允许内容溢出,由body滚动
overflow: visible; // 确保完全不阻止滚动
width: 100%;
max-width: 100vw;
box-sizing: border-box;
touch-action: pan-y; // 允许垂直触摸滑动
}
// 左侧面板:全宽显示,不使用自己的滚动条,使用顶层滚动条
.left_panel {
flex: 0 0 auto; // 不固定高度,根据内容自适应
@include full-width-adaptive;
min-width: 100%; // 覆盖桌面端的 min-width: 10vw
padding: 15px; // 减小内边距以适应小屏幕
border-right: none; // 移除右边框
border-bottom: 1px solid var(--border-color); // 添加底部分隔线
@include mobile-scroll-container;
// 移动端:限制触摸滑动只能垂直方向
touch-action: pan-y; // 只允许垂直方向的触摸滑动
}
// 隐藏分割线(移动端不需要)
.resizer {
display: none;
}
// 右侧面板,确保不使用固定高度
.right_panel {
flex: 1 1 auto;
@include full-width-adaptive;
padding: 0;
overflow-x: hidden;
overflow-y: hidden; // 窄屏模式下禁用滚动条,使用body滚动
overflow: hidden; // 彻底禁用滚动条,防止出现多余的滚动条
background: var(--panel-bg);
min-height: 0; // 移除最小高度,让内容自然展开
height: auto; // 高度自适应内容
position: relative;
touch-action: pan-y;
}
// 右侧面板的结果容器,移除强制高度,不使用自己的滚动条
#results {
padding: 0;
margin: 0;
position: relative;
@include full-width-container;
@include mobile-scroll-container;
min-height: 0; // 移除100%高度限制,让内容自然展开
height: auto; // 高度自适应内容
}
// 文本可视化容器,移除强制高度,不使用自己的滚动条,使用顶层滚动条
.LMF {
position: relative;
@include full-width-container;
@include mobile-scroll-container;
min-height: 350px; // 确保至少350px高度以容纳tooltip(内容不足时生效)
height: auto; // 高度自适应内容
padding: 15px 12px; // 基础padding
// 移除固定的大padding-bottom,min-height已保证最小高度
font-size: 12pt; // 比body的9pt大,使文本更易读
word-wrap: break-word;
overflow-wrap: break-word;
// 启用 minimap 时,右侧增加 minimap 宽度
&.minimap-enabled {
padding-right: calc(12px + var(--minimap-width));
}
}
// 加载遮罩层,移除强制高度
.text-loading-overlay {
min-height: 0; // 移除100%高度限制
height: auto; // 由于使用绝对定位和top/bottom:0,会自动填充,但确保不强制最小高度
}
// 容器在移动端调整padding
.container {
padding: 10px; // 减小padding以适应小屏幕
box-sizing: border-box; // 复用 border-box,但不需要 full-width-container(可能有特定宽度需求)
}
// 调整浮动内容宽度,不使用自己的滚动条
.floating_content {
@include full-width-adaptive;
@include mobile-scroll-container;
}
// 调整统计图容器
#stats {
order: 2;
padding: 0 5px; // 增加左右padding,避免直方图被遮挡
@include full-width-adaptive;
svg {
@include full-width-adaptive;
height: auto;
// 确保SVG可以按比例缩小
display: block;
}
}
// 确保直方图容器不会超出,不使用自己的滚动条
#all_result {
@include full-width-container;
@include mobile-scroll-container;
padding: 0;
}
// 调整结果区域顺序
#res {
order: 1;
}
// 移动端:调整首页标题栏的 negative margin,保留顶部间距避免被遮挡
.dark-mode-toggle-wrapper {
margin: 0 -15px 10px -15px; // 移动端的 left_panel padding 是 15px,顶部不使用负margin
// 添加安全区域支持(iOS刘海屏等)
padding-top: max(10px, env(safe-area-inset-top));
}
// 调整按钮大小
button {
padding: 8px 12px;
font-size: 11pt;
}
// 调整表单控件字体,防止 iOS 自动缩放
textarea {
min-height: 80px;
font-size: 16px; // 设置为至少 16px,防止 iOS 自动缩放
}
input[type="text"],
input[type="url"],
input[type="search"],
input[type="email"],
input[type="number"],
input[type="tel"],
input[type="password"],
select {
font-size: 16px; // 所有文本类输入控件在移动端统一使用 16px
}
}
|