fix(抓取): 元素框跟着图片走(ResizeObserver)+ 界面放大 + 右侧层级/属性/颜色三页签
用户报的准确现象:**点某些元素会让画面变大,但框没跟着变大 → 错位**。
根因:预览图是 `max-width:100%` —— 窗口够宽时恒为原始尺寸(我这儿复现不出),
但窗口窄时图片被压小;此时任何**布局微动**都会改变预览列宽度 → 图片重新缩放,
而框是上一次算好的**像素坐标**,不会跟着变。触发布局微动的正是"点元素":
`.el-picker-item.active` 用 `border-left:3px`(占宽度)→ 列表变宽 → 预览变窄 →
图片变小 ✗。实测(视口压到 900):图片从 720 → 363,框仍停在 720 的位置。
修法:
1. **ResizeObserver 盯着图片**:显示尺寸一变就重算所有框 —— 窗口缩放、面板宽度
变化、滚动条出现…都会自动跟上,这是"完全不错位"的兜底保证。
2. 高亮一律改用 **outline / box-shadow**(不占布局)→ 选中元素不再引发任何重排。
3. 弹窗放大到 **98vw × 88vh**(用户要"整个界面大一点"),图片在宽窗口下 1:1。
4. 右侧改成和 uiauto.dev 一样的**三页签**:
- **层级**:元素树(原列表,缩进 + 搜索)
- **属性**:选中元素的全部属性(建议选择器/class/resource-id/text/desc/package/
clickable/bounds/深度)
- **颜色**:鼠标在图上移动实时取**像素色**;选中元素显示**元素中心色**
5. 交互对齐云检查器:**点层级条目 = 选中**(看属性/颜色/高亮,不关窗),
回填改由每行的「✓ 填入」按钮触发。
实测(视口 900 窄窗口):图片 720→363、框同步变 363 ✓;点元素不再错位 ✓;
三页签可用、属性/取色正确(选中元素中心 #f7f7f7)✓;无 JS 报错 ✓。
This commit is contained in:
@@ -298,16 +298,26 @@ body{background:var(--bg);font-family:var(--body);color:var(--text);font-size:14
|
||||
.el-shot-container img{max-width:100%;height:auto;border-radius:4px;display:block}
|
||||
.el-shot-container .el-shot-loading{color:#8a93a0;font-size:13px;padding:40px}
|
||||
.el-shot-overlay{position:absolute;border:1px solid rgba(103,232,249,.45);background:transparent;cursor:pointer;border-radius:2px;transition:all .1s}
|
||||
.el-shot-hover{position:absolute;border:2px solid rgba(248,113,113,.9);background:rgba(248,113,113,.15);pointer-events:none;border-radius:2px;z-index:5}
|
||||
.el-shot-hover{position:absolute;outline:2px solid rgba(248,113,113,.9);outline-offset:-1px;background:rgba(248,113,113,.15);pointer-events:none;border-radius:2px;z-index:5}
|
||||
.el-shot-warn{background:#fff3cd;border-bottom:1px solid #ffda6a;color:#7a5b00;font-size:12px;padding:6px 10px}
|
||||
.el-shot-overlay:hover{border-color:#67e8f9;background:rgba(103,232,249,.18)}
|
||||
.el-shot-overlay.active{border:2px solid #f87171;background:rgba(248,113,113,.22)}
|
||||
.el-list-wrap{flex:0 0 400px;display:flex;flex-direction:column;overflow:hidden;border-left:1px solid var(--border)}
|
||||
.el-shot-overlay.active{outline:2px solid #f87171;outline-offset:-1px;background:rgba(248,113,113,.22)}
|
||||
.el-list-wrap{flex:0 0 460px;display:flex;flex-direction:column;overflow:hidden;border-left:1px solid var(--border)}
|
||||
.el-tabs{display:flex;border-bottom:1px solid var(--border);background:var(--ink-2);flex:none}
|
||||
.el-tab{padding:7px 14px;font-size:12.5px;color:var(--text-light);cursor:pointer;border:none;background:none;border-bottom:2px solid transparent}
|
||||
.el-tab.active{color:var(--primary);border-bottom-color:var(--primary);font-weight:600}
|
||||
.el-pane{flex:1;overflow:auto;display:none}
|
||||
.el-pane.active{display:block}
|
||||
.el-attr{display:flex;gap:8px;padding:5px 12px;border-bottom:1px solid var(--border);font-size:12px}
|
||||
.el-attr b{color:var(--text-light);font-weight:500;flex:0 0 96px;font-family:var(--mono)}
|
||||
.el-attr span{color:var(--text);word-break:break-all;flex:1}
|
||||
.el-color-row{display:flex;align-items:center;gap:8px;padding:6px 12px;font-size:12px;border-bottom:1px solid var(--border)}
|
||||
.el-swatch{width:22px;height:22px;border-radius:4px;border:1px solid var(--border);flex:none}
|
||||
.el-picker-search{width:100%;padding:8px 12px;border:none;border-bottom:1px solid var(--border);font-size:13px;outline:none;font-family:var(--body)}
|
||||
.el-picker-list{flex:1;overflow-y:auto}
|
||||
.el-picker-item{padding:8px 12px;border-bottom:1px solid var(--border);cursor:pointer;font-size:12px;display:flex;gap:8px;align-items:flex-start}
|
||||
.el-picker-item:hover{background:var(--primary-soft)}
|
||||
.el-picker-item.active{background:var(--primary-soft);border-left:3px solid var(--primary)}
|
||||
.el-picker-item.active{background:var(--primary-soft);box-shadow:inset 3px 0 0 var(--primary)}
|
||||
.el-picker-item:last-child{border-bottom:none}
|
||||
.el-picker-item .ep-depth{color:var(--text-light);font-family:var(--mono);flex-shrink:0;width:28px}
|
||||
.el-picker-item .ep-info{flex:1;min-width:0}
|
||||
@@ -1044,12 +1054,12 @@ body{background:var(--bg);font-family:var(--body);color:var(--text);font-size:14
|
||||
|
||||
<!-- ========== 元素抓取模态框(独立第二层,不覆盖任务编辑窗口)========== -->
|
||||
<div id="el-picker-overlay" class="modal-overlay" style="z-index:1100" onclick="if(event.target===this)closeElPicker()">
|
||||
<div class="modal" id="el-picker-box" style="max-width:1280px;width:96vw">
|
||||
<div class="modal" id="el-picker-box" style="max-width:1800px;width:98vw">
|
||||
<div class="modal-header">
|
||||
<h3 id="el-picker-title">抓取元素</h3>
|
||||
<button class="close" onclick="closeElPicker()">×</button>
|
||||
</div>
|
||||
<div class="modal-body" id="el-picker-body" style="max-height:75vh;padding:0;overflow:hidden;display:flex;flex-direction:column"></div>
|
||||
<div class="modal-body" id="el-picker-body" style="height:88vh;padding:0;overflow:hidden;display:flex;flex-direction:column"></div>
|
||||
<div class="modal-footer" id="el-picker-footer"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user