CSS中expression/pseudo-class

本文介绍了IE5及其后续版本中CSS expression的功能和使用方法,包括如何利用expression根据浏览器窗口大小调整元素位置、实现链接虚线框消除效果、响应式图片尺寸控制等内容,并探讨了expression在实际应用中的一些注意事项。
IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javascript表达式关联起来,这里的CSS属性可以是元素固有的属性,也可以是自定义属性。就是说CSS属性后面可以是一段Javas cript表达式,CSS属性的值等于Javascript表达式计算的结果。 在表达式中可以直接引用元素自身的属性和方法,也可以使用其他浏览器对象。

  固有属性赋值

  例如,你可以依照浏览器的大小来安置一个元素的位置。

#myDiv {
position: absolute;
width: 100px;
height: 100px;
left: expression(document.body.offsetWidth - 110 + "px");
top: expression(document.body.offsetHeight - 110 + "px");
background: red;
}

#myTable tbody tr {
line-height: 24px;
background-color:expression((this.sectionRowIndex%2==0)?"#F4F8FF":"#E6EFF7");
}
  自定义属性赋值

  例如,消除页面上的链接虚线框。 通常的做法是:

<a href="link1.htm" οnfοcus="this.blur()">link1</a>
<a href="link2.htm" οnfοcus="this.blur()">link2</a>
<a href="link3.htm" οnfοcus="this.blur()">link3</a>

  采用expression的做法如下:

<style type="text/css">
a {star : expression(οnfοcus=this.blur)}
</style>
<a href="link1.htm">link1</a>
<a href="link2.htm">link2</a>
<a href="link3.htm">link3</a>

  说明:里面的star就是自己任意定义的属性,你可以随自己喜好另外定义,接着包含在expression()里的语句就是JS脚本,在自定义属性与expression之间可别忘了还有一个分号,因为实质还是CSS,所以放在style标签内,而非script内。这样就很容易地用一句话实现了页面中的链接虚线框的消除。不过你先别得意,如果触发的特效是CSS的属性变化,那么出来的结果会跟你的本意有差别。例如你想随鼠标的移进移出而改变页面中的文本框颜色更改,你可能想当然的会认为应该写为

<style type="text/css">
input
{star : expression(οnmοuseοver=this.style.backgroundColor="#FF0000";
οnmοuseοut=this.style.backgroundColor="#FFFFFF")}
</style>
<style type="text/css">
input {star : expression(οnmοuseοver=this.style.backgroundColor="#FF0000";
οnmοuseοut=this.style.backgroundColor="#FFFFFF")}
</style>
<input type="text">
<input type="text">
<input type="text">

  可结果却是出现脚本出错,正确的写法应该把CSS样式的定义写进函数内,如下所示:

<style type="text/css">
input {star : expression(οnmοuseοver=function()
{this.style.backgroundColor="#FF0000"},
οnmοuseοut=function(){this.style.backgroundColor="#FFFFFF"}) }
</style>
<input type="text">
<input type="text">
<input type="text">

附滚动条定义

body {
margin: 0px;
background-color: #F4F8FF;
scrollbar-face-color:#F4F8FF;
scrollbar-highlight-color:#788DB4;
scrollbar-shadow-color:#788DB4;
scrollbar-3dlight-color:#CFE3F3;
scrollbar-arrow-color:#9BC8ED;
scrollbar-track-color:#F4F8FF;
scrollbar-darkshadow-color:#CFE3F3;
}

细边框表格
table {
border-collapse:collapse; /* 关键属性:合并表格内外边框*/
border:solid #999; /* 设置边框属性;样式(solid=实线)、颜色(#999=灰) */
border-width:1px 0 0 1px; /* 设置边框状粗细:上 右 下 左 = 对应:1px 0 0 1px */
}
table caption {font-size:14px;font-weight:bolder;}
table th,table td {
border:solid #999;border-width:0 1px 1px 0;padding:2px;
/* border-right:expression((this.cellIndex!=5) ? "1px solid #9BC2E0": "0px");
border-bottom:1px solid #9BC2E0;
border-left: 0px;
border-top: 0px;
height: 22pt;
*/
}
tfoot td {text-align:center;}

CSS对打印的控制:
<!--media=print 这个属性可以在打印时有效-->
<style media=print>
.Noprint{display:none;}
.PageNext{page-break-after: always;}
</style>
Noprint样式可以使页面上的打印按钮等不出现在打印页面上,PageNext样式可以设置分页,在需要分页的地方<div class="PageNext"></div>就OK了。

图片尺寸控制:
img{width:expression(this.width>500?"500px":this.width+"px"); }

[b]pseudo-class伪类:[/b]
1.锚的伪类
a:link {color: #FF0000; text-decoration: none} /* 未访问的链接 */ 
a:visited {color: #00FF00; text-decoration: none} /* 已访问的链接 */
a:hover {color: #FF00FF; text-decoration: underline} /* 鼠标在链接上 */
a:active {color: #0000FF; text-decoration: underline} /* 激活链接 */
a.red:link {color: #FF0000}
a.red:visited {color: #0000FF}
a.blue:link {color: #00FF00}
a.blue:visited {color: #FF00FF}

定义这些链接样式时,一定要按照a:link, a:visited, a:hover, a:actived的顺序书写。
2.首字和首行(first-letter和first-line)伪类
p:first-letter {font-size: 300%}
div:first-line {color: red}

3.li中使用以块级显示元素

#my li{
margin-left:52%;
}
#my li a{
display:inline-block;
width:70%;
overflow:hidden;
white-space:nowrap;

}
#my li i{
width:30%;
display:inline-block;
text-align:center;
}


网站变成黑白(IE):

html{filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale='1');}
<think>我们正在处理一个关于编译错误的用户问题。用户遇到了在文件 `D:/W/B/src/mingw-w64/mingw-w64-crt/crt/pseudo-reloc.c` 的第149行出现 `undefined reference to 'fprintf'` 的错误。根据用户提供的引用,之前有类似的错误(关于`qt_plugin_instance_qgif`等),但这次是关于标准库函数`fprintf`的未定义引用。 首先,我们需要分析这个错误的原因。`undefined reference`通常发生在链接阶段,表示编译器找到了函数的声明(在头文件中),但在链接时找不到其实现(即函数的定义)。对于标准库函数`fprintf`,通常是由C标准库(如glibc、msvcrt等)提供的。 用户的环境是使用MinGW-w64(从文件路径可以看出),这是一个Windows环境下使用的GCC编译器套件,它使用自己的C运行时库(mingw-w64-crt)。 错误发生在`pseudo-reloc.c`文件的第149行,这是一个MinGW-w64运行时库的源文件。这意味着用户可能在编译MinGW-w64运行时库本身?或者是在编译某个项目时链接到了MinGW-w64的源码? 常见的可能原因: 1. 缺少链接到标准库:编译器在链接时没有自动链接到标准C库(通常是`libc`),或者链接顺序有问题。 2. 标准库未正确安装:MinGW-w64安装不完整,导致标准库文件缺失。 3. 编译器配置问题:编译器找不到标准库的路径。 解决步骤: 1. **检查MinGW-w64安装**:确保MinGW-w64安装完整,特别是标准库部分。可以尝试重新安装MinGW-w64。 2. **检查链接参数**:在链接时,确保链接了标准C库。通常GCC会自动链接`libc`,但有时如果使用了`-nostdlib`等选项,则需要显式链接。 例如,在链接命令中手动添加`-lc`(链接libc): ``` gcc ... -lc ``` 另外,确保链接顺序正确,库文件一般放在命令的末尾。 3. **查看源文件**:打开`pseudo-reloc.c`文件,查看第149行附近,确认是否真的调用了`fprintf`。通常,这个文件中的代码会使用调试输出,可能是在错误处理中。如果是这样,可能是由于没有链接标准库中的`stdio`部分。 4. **检查编译选项**:在编译时,是否定义了某些宏导致该行代码被启用?例如,可能定义了`_DEBUG`等宏,使得调试代码被编译。如果不需要,可以尝试关闭调试输出。 5. **使用正确的启动文件**:在编译C运行时库时,可能需要特殊的启动文件(crt0.o等)和链接脚本。确保这些文件存在且正确。 6. **检查环境变量和路径**:确保MinGW-w64的bin目录在PATH环境变量中,并且编译时能够找到库文件。 7. **尝试使用完整的编译命令**:如果用户是在编译MinGW-w64本身,那么应该按照官方文档的构建步骤进行。通常,构建MinGW-w64需要配置和构建整个工具链,步骤比较复杂。 由于用户的问题具体到某个源文件的某一行,用户很可能是在编译一个项目,而这个项目包含了MinGW-w64的源文件(可能是自定义构建?),或者在构建MinGW-w64本身。 建议: - 如果是构建MinGW-w64,参考官方构建指南:https://mingw-w64.org/doku.php - 如果是用户自己的项目,确保在链接时包含了标准C库。 另外,考虑到这个错误发生在运行时库的源文件中,可能的原因是构建运行时库时没有正确链接标准库。但是,标准库函数`fprintf`本身就是C运行时库的一部分,这似乎是一个循环依赖的问题。 实际上,MinGW-w64的运行时库可能会分为多个部分。在构建运行时库时,可能需要先构建一个不依赖标准库的基本部分,然后再构建其他部分。因此,构建顺序很重要。 如果用户正在构建MinGW-w64,建议按照官方文档的步骤重新构建,并确保所有依赖都正确安装。 如果用户不是在构建MinGW-w64,而是使用MinGW-w64编译自己的项目,那么这个问题可能是由于项目错误地包含了运行时库的源文件(而不是链接已编译的库)导致的。这种情况下,应该移除对运行时库源文件的直接编译,而是链接到已安装的MinGW-w64运行时库。 总结解决方法: 1. 重新安装或修复MinGW-w64安装。 2. 检查编译命令,确保正确链接标准库(例如,在链接命令末尾加上`-lc`)。 3. 如果用户正在构建MinGW-w64,请严格按照官方指南构建。 4. 避免在项目中直接编译MinGW-w64的运行时库源文件。 由于用户提供的引用中提到了QT的类似错误,但那个错误是关于QT插件的,与当前问题不同。因此,我们专注于当前的标准库函数未定义引用问题。 注意:在MinGW-w64中,标准C库的实现是`mingw-w64-crt`,它依赖于`msvcrt.dll`(Windows系统自带的C运行时库)或其他替代品(如ucrt)。因此,`fprintf`函数实际上是在`msvcrt.dll`(或ucrt)中实现的。MinGW-w64的运行时库会通过导入库来链接这些系统函数。 因此,另一种可能性是导入库(例如`libmsvcrt.a`)缺失或损坏。检查MinGW-w64安装目录下的`lib`文件夹,看是否存在`libmsvcrt.a`(或类似的库)以及`libmingw32.a`等库。 如果缺失,需要重新安装MinGW-w64,或者单独安装运行时库。 最后,提供具体步骤: **步骤1:验证MinGW-w64安装** 运行命令: ``` gcc --version ``` 确认gcc存在。然后,检查`fprintf`的库是否存在。在MinGW-w64的安装目录下,例如`mingw64/x86_64-w64-mingw32/lib`(假设是64位),查找`libmsvcrt.a`或`libucrt.a`。 **步骤2:重新安装MinGW-w64** 如果发现文件缺失,重新安装MinGW-w64。 **步骤3:检查项目链接参数** 在链接命令中,确保没有使用`-nostdlib`,并且将库放在命令的末尾。例如: ``` gcc -o program obj1.o obj2.o -lm -lc ``` 实际上,`-lc`通常不需要显式指定,因为gcc会自动链接。但如果使用了`-nostdlib`,则需要手动添加。 **步骤4:如果是构建MinGW-w64源码** 参考官方构建指南,确保配置正确。构建命令通常类似于: ``` ./configure --prefix=... --target=x86_64-w64-mingw32 make make install ``` **步骤5:检查pseudo-reloc.c中的代码** 打开文件,查看第149行。如果这一行是调试代码,并且你不需要调试信息,可以尝试注释掉这行代码(注意:修改系统库源文件需谨慎,最好在构建过程中通过宏来控制)。 例如,在MinGW-w64的构建系统中,可能可以通过配置选项来禁用调试输出。 如果用户能提供更多上下文(如完整的编译命令和构建环境),则能更准确地解决问题。 由于用户的问题描述中只给出了错误和文件位置,我们只能给出一般性的解决方案。 </think>根据您提供的错误信息,`undefined reference to 'fprintf'` 是链接阶段的常见问题,以下是系统性的解决方案: ### 原因分析 1. **标准库链接缺失**:编译器未自动链接标准 I/O 库(实现 `fprintf`) 2. **编译参数问题**:缺少必要的链接参数(如 `-lc`) 3. **工具链配置错误**:MinGW-w64 安装不完整或环境变量配置异常 4. **源代码依赖缺失**:`pseudo-reloc.c` 依赖的库未正确链接 ### 解决步骤 #### 1. 显式链接标准C库 在编译命令中添加 `-lc` 参数强制链接标准库: ```bash gcc your_source.c -o output -lc ``` > 注意:库链接顺序很重要,`-lc` 应放在命令末尾[^1] #### 2. 检查 MinGW-w64 安装完整性 ```bash # 验证标准库是否存在 ls /mingw64/lib/libc.a # 64位版本 ls /mingw32/lib/libc.a # 32位版本 ``` 若文件缺失,需重新安装 MinGW-w64 并勾选: ``` mingw-w64-crt → mingw-w64-crt-libc ``` #### 3. 修复工具链配置 ```bash # 检查环境变量 echo $PATH | grep "mingw64/bin" # 重建库索引 mingw-w64-binutils/bin/ranlib.exe /mingw64/lib/*.a ``` #### 4. 修改编译指令(关键步骤) 在构建命令中添加标准库和启动文件: ```bash gcc -o output \ D:/W/B/src/mingw-w64/mingw-w64-crt/crt/*.c \ -lmingw32 \ -lc \ -lkernel32 \ -ladvapi32 \ -lmsvcrt ``` ### 验证修复 ```c // 添加测试代码 #include <stdio.h> int main() { fprintf(stdout, "Link test passed\n"); // 验证fprintf链接 return 0; } ``` 编译并运行: ```bash gcc test.c -o test -lc && ./test ``` ### 预防措施 1. 在 CMake 中显式声明标准库依赖: ```cmake target_link_libraries(YourTarget PRIVATE c) ``` 2. 定期运行 `mingw-w64-update` 维护工具链 > 提示:此错误常见于使用自定义构建脚本时忽略了标准库依赖[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值