垂直居中布局 Vertical-aligned 应用测试:兼容IE6/8/FF

本文介绍了一种兼容IE6/8/FF浏览器的垂直居中布局方法,通过设置一个关键的SPAN元素作为参照物,使后续的内联元素能够实现精确的垂直对齐。该方案灵活地支持不同高度的调整,并详细说明了各元素的对齐逻辑。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" >
<head><title>垂直居中布局 Vertical-aligned 应用测试:兼容IE6/8/FF</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />


<style type="text/css">

</style>
</head>

<body>

<H4>垂直居中布局 Vertical-aligned 应用测试:兼容IE6/8/FF</H4>


<div style="border:1px solid red; height:200px;">
<!--
设置一个空的SPAN,这个SPAN很重要,后面内联元素的位置齐将以它为参考。
display:inline-block的设置将触发IE6的LAYOUT,使之可设置高度,其它浏览器支持这个属性;
-->
<span id="s1" style="border:1px solid blue;width:10px; margin-left:-1px;vertical-align:middle; display:inline-block; height:100%;"></span>

<!--一系列的内联元素,有图片及其它的文本元素-->
<img id="s2" src="star.gif" alt="star" style="border:1px solid green;vertical-align: middle;" />
<span id="s3" style="border:1px solid green;">常口信息(2)条.</span>
<img id="s4" src="star.gif" alt="star" style="border:1px solid green;vertical-align: middle;" />
<span id="s5" style="border:1px solid green;vertical-align: middle;/*vertical-align: 80px;vertical-align: 80%;*/">ZXY测试居中</span>


</div>
<p>测试总结:

<ul>
<li>1)经测试,此种垂直居中方式的布局方式,兼容IE6+及FF浏览器</li>
<li>2)ID为S1的SPAN将是后面一系列内联元素的对齐的标杆(即位置参考相对坐标)</li>
<li>3)后面内联元素的相对位置只与S1有关,与它的相邻元素无关</li>
<li>4)调整后面内联元素的高度位置,比如S5,有多种方法:
<br>vertical-align: middle; --直接设置属性值
<br>vertical-align: 80px; --也可设置相对于S1的高度像素
<br>vertical-align: 100%; --也可设置对对于S1的高度百份比。注意这个100%是这个首先是这个文本是高度,假如这个文本的高度为20px,
那么这个100%=20PX;如果要设置到80px的高度,则为:vertical-align: 400%;
</li>
<li>5)除S1外的所有内联元素的相对位置都是基于‘S1=vertical-align:middle’这个基线位置而言的,即50%的高度,假如父DIV的高度为200px,则'middle基线'=100px;</li>
</ul>
<br>


</body>
</html>
# gui_main.py - 左上角标题版 (Top-Left Aligned | Light Gray Industrial UI) import sys from PyQt5.QtWidgets import ( QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit, QPushButton, QTextEdit, QMessageBox ) from PyQt5.QtCore import Qt, QThread, pyqtSignal from PyQt5.QtGui import QFont # 导入逻辑模块 from image_open import show_image_fullscreen from image_path import search_multiple_paths # 双路径配置 BASE_PATHS = [ r'\\172.30.6.203\backup\AOI_C\PASS_PIC', r'\\172.30.6.202\d\backup\AOI_C\PASS_PIC' ] # 全局字体 FONT_REGULAR = QFont("Consolas", 16) FONT_BOLD = QFont("Consolas", 18, QFont.Bold) class SearchWorker(QThread): """后台搜索线程""" finished_signal = pyqtSignal(str, str) # image_path, log error_signal = pyqtSignal(str) def __init__(self, line, by90, mo, base_paths): super().__init__() self.line = line self.by90 = by90 self.mo = mo self.base_paths = base_paths def run(self): import time start_time = time.time() try: result, detail = search_multiple_paths(self.line, self.by90, self.mo, self.base_paths) end_time = time.time() duration = end_time - start_time if result: self.finished_signal.emit( result, f"✅ 找到图片,耗时 <b>{duration:.2f}s</b><br><code>{result}</code>" ) else: self.error_signal.emit( f"❌ 未找到,耗时 <b>{duration:.2f}s</b><br>原因:<br><code>{detail}</code>" ) except Exception as e: duration = time.time() - start_time self.error_signal.emit(f"⚠️ 异常,耗时 <b>{duration:.2f}s</b><br>错误:<br><code>{str(e)}</code>") class AOIImageViewer(QWidget): def __init__(self): super().__init__() self.setWindowTitle("AOI 图片查看") self.resize(800, 600) self.setFont(FONT_REGULAR) self.setStyleSheet(self.get_style_sheet()) self.init_ui() def get_style_sheet(self): return """ QWidget { background-color: #f0f0f0; color: #222222; font-family: 'Consolas', 'Courier New', monospace; } QLabel { color: #444444; } QLineEdit { background-color: #ffffff; color: #000000; border: 2px solid #aaaaaa; padding: 10px; font-size: 18pt; selection-background-color: #007ACC; selection-color: #ffffff; } QLineEdit:focus { border-color: #007ACC; background-color: #fffffe; } QPushButton { background-color: #e0e0e0; color: #000000; border: 2px solid #888888; padding: 12px; font-size: 18pt; font-weight: bold; text-align: center; } QPushButton:hover { background-color: #d0d0d0; border-color: #666666; } QPushButton:pressed { background-color: #bbbbbb; border-color: #444444; } QPushButton:disabled { background-color: #f8f8f8; color: #888888; border-color: #cccccc; } QTextEdit { background-color: #ffffff; color: #111111; border: 1px solid #cccccc; padding: 10px; font-family: 'Consolas', monospace; font-size: 12pt; } QScrollBar:vertical { width: 10px; } QScrollBar::handle:vertical { background: #c0c0c0; min-height: 20px; border-radius: 5px; } QScrollBar::handle:vertical:hover { background: #a0a0a0; } """ def init_ui(self): layout = QVBoxLayout() layout.setSpacing(8) layout.setContentsMargins(10, 10, 10, 10) # === 标题区 - 左上角对齐 === title = QLabel("AOI 图片快速查看") title.setFont(FONT_BOLD) title.setStyleSheet("color: #000000; margin-bottom: 4px;") layout.addWidget(title, alignment=Qt.AlignLeft) # 👈 左对齐 desc = QLabel("输入 SSN 编号自动查找并显示图片") desc.setStyleSheet("font-size: 14pt; color: #555555;") layout.addWidget(desc, alignment=Qt.AlignLeft) # 👈 左对齐 # 添加一点间距 layout.addSpacing(5) # === 输入框 === self.ssn_input = QLineEdit() self.ssn_input.setPlaceholderText("例:BN14ABC12345") self.ssn_input.returnPressed.connect(self.on_search_clicked) self.ssn_input.setClearButtonEnabled(True) layout.addWidget(self.ssn_input) # === 查询按钮 === self.search_btn = QPushButton("🔍 开始查询 (Enter)") self.search_btn.setMinimumHeight(60) self.search_btn.clicked.connect(self.on_search_clicked) layout.addWidget(self.search_btn) # === 日志区域 === self.log_area = QTextEdit() self.log_area.setReadOnly(True) self.log_area.setMaximumHeight(200) self.log_area.append('<span style="color:#666666;">💡 输入 SSN 后按回车或点击【开始查询】</span>') layout.addWidget(self.log_area) self.setLayout(layout) # 自动聚焦 self.ssn_input.setFocus() def on_search_clicked(self): ssn = self.ssn_input.text().strip() if not ssn: QMessageBox.warning(self, "⚠️", "请输入 SSN!") return # 固定参数(替换为你的真实解析逻辑) line = 'BN14' by90 = '90N1JR1007G0' mo = '26272758' # 清空日志 self.log_area.clear() self.log_area.append(f"📌 参数: <br>Line:{line}</br><br> 90:{by90}</br><br>MO:{mo}</br>") # 禁用按钮 self.search_btn.setEnabled(False) self.search_btn.setText("⏳ 查询中...") # 启动线程 self.worker = SearchWorker(line, by90, mo, BASE_PATHS) self.worker.finished_signal.connect(self.on_search_success) self.worker.error_signal.connect(self.on_search_error) self.worker.start() def on_search_success(self, image_path, log_msg): self.log_area.append(log_msg) self.search_btn.setEnabled(True) self.search_btn.setText("🔍 开始查询 (Enter)") # 直接全屏显示 try: show_image_fullscreen(image_path, duration=10) except Exception as e: QMessageBox.critical(self, "❌ 显示失败", f"无法打开图片:\n{str(e)}") def on_search_error(self, error_msg): self.log_area.append(f'<span style="color:#FF4444;">{error_msg}</span>') self.search_btn.setEnabled(True) self.search_btn.setText("🔍 开始查询 (Enter)") # ============================= # 🚀 主程序入口 # ============================= if __name__ == "__main__": app = QApplication(sys.argv) app.setStyle("Fusion") # Fusion 支持自定义样式最佳 window = AOIImageViewer() window.show() sys.exit(app.exec_()) 以上完整代碼請幫忙逐行注釋
11-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值