ul列表中包含input时line-height属性失效的解决办法

本文探讨了在IE6浏览器中<UL>列表包含<input>控件时出现的行高属性失效问题,并提供了解决方案。通过定义input标签的宽度、高度和边距,实现了与其他列表项相同的视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么<UL>列表含<input>控件时,行高属性在IE6.0下失效?FF2.0下正常。这是一个不常见的问题,我们不提倡这样的布局方式,input元素尽可能的使用lable标签而不是包含于ul的li标签中。但在实际操作中,也可能存在这样的情况,我们就ul列表中包含input时line-height属性失效的问题作一些探讨。

  我们知道input标签是一个block元素,也就是一个块元素,而line-height只可以应用于inline行内元素。所以line-height属性的设置对input元素是无效的。我们看下面的代码:

 Source Code to Run [www.52css.com]

    [ 可先修改部分代码 再运行查看效果 ]

  CSS模板下载所在的li标签及input元素,行高明显的小于40px。因为input是block元素无line-height属性可言。我们只能通过变通的方法来解决问题。

  首先我们定义好input标签的外观,即他的宽度与高度。然后设置边距,使其达到与其它li列表项同样行高的视觉效果,而不是通过line-height属性来实现。

 Example Source Code [www.52css.com]
input {
    border:1px solid #666;
    width:120px;
    height:20px;
    margin:10px 0;
    vertical-align:middle;
    line-height:20px;
}

  我们定义input元素的边框为一象素的灰色实线。宽度与高度分别是120px与20px。我们定义的li列表项的行高为40px。要使input元素如其它列表项一样,则设置input元素的上下边距为10px。即达到了行距为40px的效果。但这样会造成“CSS模板下载”与input标签水平不对齐,我们设置vertical-align:middle。使得文字与输入框水平对齐。关于vertical-align:middle的相关知识,请参考本站相关文章。心细的你或许会发现,我们这里也设置了line-height属性,值是20px。这里的line-height属性设置是input输入文字的行高,我们这样设置,可以使输入文字在输入框垂直居中。
   通过此例,我们应该注意区分不同的属性所能作用的对象,line-height属性是inline元素所拥有的,对于block元素是不起作用的。我们看最终的运行效果:

 Source Code to Run [www.52css.com]

    [ 可先修改部分代码 再运行查看效果 ]
QGridLayout * villageLayout = new QGridLayout(); // 创建 QWebEngineView 实例 QWebEngineView* webView = new QWebEngineView(parent); // 全面启用WebEngine功能 webView->settings()->setAttribute(QWebEngineSettings::AutoLoadImages, true); webView->settings()->setAttribute(QWebEngineSettings::PluginsEnabled, true); webView->settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, true); webView->settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, true); webView->settings()->setAttribute(QWebEngineSettings::PlaybackRequiresUserGesture, false); webView->settings()->setAttribute(QWebEngineSettings::AllowRunningInsecureContent, true); webView->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true); webView->settings()->setAttribute(QWebEngineSettings::SpatialNavigationEnabled, true); webView->settings()->setAttribute(QWebEngineSettings::LinksIncludedInFocusChain, true); // 原始信息保持变 QString info = "<h1><img src=\"http://127.0.0.1:8090/api/v1/public/system/exam/get-temp?path=/uploads/web/contents/202508/08/324653451ede48ac8eeb573e7f4d840c.png\" alt=\"\" data-href=\"\" style=\"\"/>\uD83E\uDD23\uD83D\uDE0C\uD83D\uDE04 <a href=\"https://www.baidu.com/\" target=\"_blank\">百度</a> </h1><table style=\"width: auto;\"><tbody><tr><th colSpan=\"1\" rowSpan=\"1\" width=\"auto\">1</th><th colSpan=\"1\" rowSpan=\"1\" width=\"auto\">2</th><th colSpan=\"1\" rowSpan=\"1\" width=\"auto\">3</th></tr><tr><td colSpan=\"1\" rowSpan=\"1\" width=\"auto\">4</td><td colSpan=\"1\" rowSpan=\"1\" width=\"auto\">5</td><td colSpan=\"1\" rowSpan=\"1\" width=\"auto\">6</td></tr></tbody></table><h3 style=\"line-height: 1.5;\"><span style=\"color: rgb(255, 77, 79); font-family: "Times New Roman";\">签收单</span></h3><ul><li>1</li><li>2</li></ul><ol><li>3</li><li>4</li></ol><div data-w-e-type=\"todo\"><input type=\"checkbox\" disabled >1212</div><pre><code > webView->settings()->setAttribute(QWebEngineSettings::AutoLoadImages, true);</code></pre><p><br></p><hr/><p><br></p><div data-w-e-type=\"video\" data-w-e-is-void>\n<video poster=\"\" controls=\"true\" width=\"auto\" height=\"auto\"><source src=\"http://127.0.0.1:8090/api/v1/public/system/exam/get-temp?path=/uploads/web/contents/202508/11/f6b2d6301cd34b6db1a03841a3b33000.mp4\" type=\"video/mp4\"/></video>\n</div><p><br></p>"; // 创建完整的HTML文档 QString styledInfo = "<!DOCTYPE html>" "<html>" "<head>" "<meta charset=\"UTF-8\">" "<style>" "table { border-collapse: collapse !important; border: 1px solid black !important; width: auto; }" "th, td { border: 1px solid black !important; padding: 8px !important; text-align: left; }" "th { background-color: #f2f2f2 !important; font-weight: bold; }" "ul, ol { margin: 10px 0; padding-left: 20px; }" "li { margin: 5px 0; }" "video { max-width: 100%; height: auto; border: 1px solid #ccc; display: block; margin: 10px 0; }" "pre { background-color: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; }" "hr { margin: 15px 0; border: 0; border-top: 1px solid #eee; }" "</style>" "</head>" "<body>" + info + "</body>" "</html>"; webView->setHtml(styledInfo, QUrl("http://127.0.0.1:8090/")); villageLayout->addWidget(webView); ui->widgetImage->setLayout(villageLayout); \uD83E\uDD23\uD83D\uDE0C\uD83D\uDE04 qt无法识别此编码
08-12
<template> <div class="main"> <base-drawer v-model="drawerVisible" title="" direction="rtl" size="20%" :before-close="onDrawerClose"> <!-- 抽屉内容 --> <div v-if="currentRow"> <div class="trend-content"> <div class="chart-placeholder"> <!-- 加载中提示 --> <div v-if="isLoading" class="loading"> <p>正在加载中...</p> </div> <!-- 后端返回内容渲染(支持Markdown格式) --> <div v-else class="strategy-content" v-html="talkStrategy"></div> </div> </div> </div> <!-- 无数据提示 --> <div v-else-if="!isLoading" class="empty提示"> <p>未获取到数据,请重试</p> </div> <!-- 底部插槽(Vue3标准语法) --> <template #footer></template> </base-drawer> </div> </template> <script lang='ts'> import { reactive, toRefs, onMounted, nextTick } from 'vue' // import { useRoute } from 'vue-router' import { marked } from 'marked' // 导入WebSocket工具函数 import { getWsUrl } from './utils/webscoket'; // 导入抽屉组件 import BaseDrawer from "./components/BaseDrawer.vue"; // 定义类型接口,规范数据结构 // interface CurrentRow { // id: string | number; // intervieweeName?: string; // thyy?: string; // startTime?: string; // [key: string]: any; // } interface WsResponse { answer?: string; is_stop?: boolean; [key: string]: any; } export default { name: 'TrendDrawerPage', components: { BaseDrawer, }, setup() { // const route = useRoute(); const data = reactive({ // 抽屉相关状态 drawerVisible: true, currentRow: null as CurrentRow | null, socket: null as WebSocket | null, wsMessage: null as string | null, isLoading: false, talkStrategy: "", }); // Markdown格式化函数 const formatMarkdown = (content: string): string => { if (!content) return "<p>暂无分析结果</p>"; // 使用marked库解析Markdown(更规范的处理方式) // 自定义marked渲染器来优化样式 const renderer = new marked.Renderer(); // 自定义标题渲染 - 修复方法签名 renderer.heading = ({ text, depth }: { text: string; depth: number }) => { const headingClass = `md-heading md-heading-${depth}`; return `<h${depth} class="${headingClass}">${text}</h${depth}>`; }; // 自定义段落渲染 renderer.paragraph = (text) => { return `<p class="md-paragraph">${text}</p>`; }; // 自定义列表渲染 renderer.list = (body, ordered, start) => { const tag = ordered ? "ol" : "ul"; return `<${tag} class="md-list"${ start ? ` start="${start}"` : "" }>${body}</${tag}>`; }; renderer.listitem = (text) => { return `<li class="md-list-item">${text}</li>`; }; // 自定义分隔线 renderer.hr = () => '<hr class="md-divider">'; // 配置marked选项 marked.setOptions({ renderer: renderer, breaks: true, gfm: true, }); // 解析Markdown return marked(content); }; // 发送分析请求 const sendAnalysisRequest = () => { if (!data.socket || data.socket.readyState !== WebSocket.OPEN) { console.error("WebSocket 未连接"); return; } const requestData = { task_type: data.currentRow?.type, person_name: data.currentRow?.intervieweeName, talk_reason: data.currentRow?.thyy, timestamp: data.currentRow?.startTime, context: "", question: "", }; try { const jsonStr = JSON.stringify(requestData); data.socket.send(jsonStr); } catch (error) { console.error("JSON序列化失败:", error); data.talkStrategy = `<p>数据发送失败:${(error as Error).message}</p>`; data.isLoading = false; } }; // 抽屉关闭回调 const onDrawerClose = (done: () => void) => { // 关闭WebSocket连接 if (data.socket) { data.socket.close(1000, "用户关闭抽屉"); data.socket = null; } done(); // 确认关闭抽屉 }; // 初始化趋势分析 const trend = async () => { data.currentRow = { id: -1, type: '历史趋势', intervieweeName: '测试51号', thyy: '耳目谈话', startTime: '1751253194000', }; data.drawerVisible = true; data.isLoading = true; data.talkStrategy = ""; // 关闭现有连接 if (data.socket) { data.socket.close(); data.socket = null; } // 等待DOM更新 await nextTick(); if (!data.currentRow?.id) { console.error("缺少任务ID"); data.isLoading = false; data.talkStrategy = "<p>数据错误:缺少任务ID</p>"; return; } // 构建WebSocket URL(结合环境变量) let wsUrl = ''; if (import.meta.env.VITE_APP_ENV === 'development') { // 开发环境使用代理路径 wsUrl = `/tendency/ws/ws/talkAnalysis/${data.currentRow.id}`; // wsUrl = `ws://192.168.3.148:8000/ws/talkAnalysis/${data.currentRow.id}`; } else { wsUrl = getWsUrl(`/ws/talkAnalysis/${data.currentRow.id}`); } console.log('WebSocket URL:', wsUrl); try { data.socket = new WebSocket(wsUrl); let accumulatedAnswer = ""; data.socket.onopen = () => { console.log("WebSocket连接成功"); sendAnalysisRequest(); }; data.socket.onmessage = (event) => { data.isLoading = false; try { const res: WsResponse = typeof event.data === "string" ? JSON.parse(event.data) : event.data; if (res.answer) { accumulatedAnswer += res.answer; data.talkStrategy = formatMarkdown(accumulatedAnswer); } if (res.is_stop) { data.socket?.close(); data.socket = null; console.log("流式输出结束"); } } catch (error) { console.error("消息解析错误:", error); data.talkStrategy = `<p>数据解析失败:${(error as Error).message}</p>`; } }; data.socket.onerror = (error) => { console.error("WebSocket错误:", error); data.talkStrategy = "<p>连接失败,请重试</p>"; data.isLoading = false; }; data.socket.onclose = (event) => { if (data.isLoading) data.isLoading = false; console.log(`WebSocket关闭:${event.code} - ${event.reason}`); }; } catch (error) { console.error("创建WebSocket失败:", error); data.isLoading = false; data.talkStrategy = `<p>连接创建失败:${(error as Error).message}</p>`; } }; // 组件挂载初始化 onMounted(() => { // trend(); }); return { ...toRefs(data), onDrawerClose, }; }, }; </script> <style scoped> .trend-content { height: calc(100% - 40px); min-height: 300px; overflow: auto; padding: 10px 0; } .chart-placeholder { padding: 16px; min-height: 200px; } .loading { display: flex; align-items: center; justify-content: center; height: 200px; color: #666; } .strategy-content { line-height: 1.8; color: #333; } .empty提示 { text-align: center; padding: 50px 0; color: #999; } /* Markdown渲染样式 */ .md-heading { margin: 1.2em 0 0.5em; font-weight: 600; } .md-heading-1 { font-size: 1.5em; border-bottom: 1px solid #eee; padding-bottom: 0.3em; } .md-heading-2 { font-size: 1.3em; } .md-heading-3 { font-size: 1.1em; } .md-paragraph { margin: 0.8em 0; } .md-list { margin: 0.8em 0; padding-left: 1.5em; } .md-list-item { margin: 0.3em 0; } .md-divider { margin: 1em 0; border: 0; border-top: 1px solid #eee; } </style> 使用组件弹框了base-drawer 正常div绘制 marked第三方插件没有生效 基于提供代码修复下呢 亲
最新发布
08-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值