Firefox 下 text-overflow:ellipsis 的省略号会浮动在上面

text-overflow:ellipsis 属性通常用于隐藏超出长度的文本,并在文本最后面增加省略号。

456bereastreet 发现:如果在网页的交互等过程中,出现一个新层(例如鼠标移动到下拉菜单,弹出下拉菜单内容),在 Firefox 下,文本内容当然会被新弹出内容遮住,但是省略号并不会。它会出现在新层的上面。

可以使用 Firefox 打开 Demo 看一下具体效果。

如果你也遇到了这个问题,解决方法很简单,只需要为新弹出的覆盖层的 z-index 属性赋值为 >1 的数值即可,这样就可以解决了。你可以在上面的 Demo 中,使用 Firebug 增加一下。

Transform 属性会导致子元素的 fixed 属性失效

在项目中,需要为顶部导航条增加滚动跟随效果。很显然,只需要为 #header 加上 position:fixed; 属性即可,但是加上之后却无效。只能用监测浏览器滚动距离然后实时的赋值到 top 属性来模拟跟随。

但是这种方法由于浏览器之间滚动的距离不同等缘故,会导致闪烁等问题,只在 Firefox 效果完美。同时会影响性能,在中低端安卓设备中效果很差。这种影响用户体验的事情,是肯定要避免的。还是得回来使用 fixed,但是从未发现过 fixed 失效的情况啊,只能挨个测试一下。

问题发现

先写了一个 div ,赋值 fixed 属性,然后在普通网页中效果正常。将其插入无效代码平级位置,结果失效。将其插入 body 标签下级,正常。说明问题出在其父属性值中。

然后使用 Firebug 依次取消父属性值,当去掉 transform 属性值之后,fixed 生效。原来问题出在 transform 上。

然后就做了个 Demo 测试一下。

这是一个坑,如果不知道的,可以记一下。因为 transform 是一个 CSS3 中比较重要的动画属性,以后的应用会越来越多。对于 position 的其他属性尚未测试,因为 fixed 比较特殊,效果比较明显。在 google 上搜索了一下,发现了一篇 Eric 写的 Un-fixing Fixed Elements with CSS Transforms ,不过没看懂,还望各位有知道的指点一下。

使用 CSS 将彩色图片转换成黑白图片

  • 原文:Convert Images To Black And White With CSS
  • 原作者:Dudley Storey 译者:潜行者 m
  • 版权声明:版权归原作者所有,翻译仅作学习参考交流使用。
    PS:最近翻译不少国外的优秀文章,不是没有写作灵感,是马上就要四级考试了 T _ T,哥现在还没开始正式复习。为了锻炼一下英语,所以选择翻译一些优秀的国外文章。

CSS3 中的滤镜(filter)功能让我们轻松方便简单的处理图片,而不需要使用 PhotoShop 或者使用很多 JavaScript、PHP 代码。这个属性已经得到比较新的 Firefox、Safari、Chrome 浏览器支持,而且我们可以通过综合的可替代的技术来模拟实现这个效果——甚至是 IE 浏览器。

本文中,我们将使用标准测试图片 Lena Söderberg (译者注:Lena 这张裸体美女照片,被作为图片压缩的标准测试用图片)作为演示,使用 CSS 将其转换成黑白图片。在下面我将讲解如何使用 CSS 的这个功能实现调整色调、模糊、亮度、对比度和一些其他的效果。效果图:

lena

CSS3 的灰阶滤镜

使用 CSS3 来稀释一个图片的颜色,再简单不过了。我们可以把这个 CSS 语句写成一个类,这样遇到想要效果的图片,直接加上个类就可以了。

img.desaturate { filter: grayscale(100%); }

当然,当前的浏览器在使用 CSS3 的时候,要加上他们自己的浏览器功能实验性前缀,所以,我们首先要做的,就是写上浏览器的前缀:

img.desaturate { filter: grayscale(100%);
-webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
-o-filter: grayscale(100%);
}

想要用在某个图片上很简单,加上一个类:

<img src=lena-söderberg.png alt="Lena Söderberg" style=width:512px;height:512px class=desaturate>

这就可以了。

增加一个 SVG 的滤镜效果

这个功能目前只在 Chrome 18+ 有效,其他浏览器马上就会增加支持。为了在 Firefox 4+ 中得到相同的效果,我们可以需要使用 SVG 滤镜。我把新建了一个单独的文件 的 saturate.svg ,代码如下:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
<filter id="greyscale">
<feColorMatrix type="matrix" values="0.3333 0.3333 0.3333 0 0
0.3333 0.3333 0.3333 0 0
0.3333 0.3333 0.3333 0 0
0  0  0  1 0"/>
</filter>
</svg>

不要被这段 SVG 代码吓住了——虽然上面的矩阵数列有点复杂。这段代码我推荐你直接复制粘贴成一个通用的“小文件”。我会再写一篇文章详细介绍一下上面矩阵变化,在这里不再赘述。

加上上面的 SVG 文件引用,我们要插入 HTML 页面的 CSS 代码如下:

img.desaturate{
filter: grayscale(100%);
-webkit-filter: grayscale(100%); -moz-filter: grayscale(100%);
-ms-filter: grayscale(100%); -o-filter: grayscale(100%);
filter: url(desaturate.svg#greyscale);
}

为 IE 做兼容

到现在我们的代码可以兼容未来的浏览器,和最新版的 Chrome 、 Firefox 4+。为了让 IE 6-9 加入兼容列表,我们需要使用微软的笨拙但是有效的 filter 滤镜:

img.desaturate{
filter: grayscale(100%);
-webkit-filter: grayscale(100%); -moz-filter: grayscale(100%);
-ms-filter: grayscale(100%); -o-filter: grayscale(100%);
filter: url(desaturate.svg#greyscale);
filter: gray;
}

如果你还想做老版本的 Webkit 内核浏览器的兼容:

img.desaturate{
filter: grayscale(100%);
-webkit-filter: grayscale(100%); -moz-filter: grayscale(100%);
-ms-filter: grayscale(100%); -o-filter: grayscale(100%);
filter: url(desaturate.svg#greyscale);
filter: gray;
-webkit-filter: grayscale(1);
}

不幸的是,Safari 和 Opera 仍然不支持,但是 Safari 5.2 ——很快就会发布——应该会支持 webkit CSS3 滤镜功能,同时 Opera 对 CSS3 的支持正在不断提升。

注意

如果你想要在所有的浏览器中实现这个视觉效果(假设你的访问者都支持 JavaScript)你可以使用 jQuery 或者 Greyscale.js 来修改你的图片,使其去色。

上面咱们写的 CSS 代码可以让我们不需要使用 PhotoShop 就可以把图片变成黑白的。使用 CSS 来实现这个功能,可以非常容易修改:例如,你可以看到当我们把去色程度参数从 100% 变成 50% 的时候图片会是原色和黑白融合在一起的效果。

由 opacity 属性引发的层叠问题思考与解决

在最近的一个作品中,在使用 opacity 属性来实现页面整体透明的时候,发现了一个问题。如果两个层发生了重叠,使用了 opacity 属性并且属性值小于 1 的层,会覆盖掉后面的层。于是动手做了个实验,来验证 opacity 的层次。

网页中的层叠规律是这样的:如果两个层都没有定义 position 属性为 absolute 或者 relative 属性,哪个层的 HTML 代码放在后面,哪个层就显示在上面。如果指定了 position 属性,并且设置了 z-index 属性,谁的值大,谁就在上面。

发现问题

而对于没有激活 z-index 的普通层来说,如果那个层使用了属性值小于 1 的 opacity 属性,哪个层就会显示在上面。我们做一个 Demo。代码如下:

 <!DOCTYPE html>
 <html>
 <head>
 <title>带有 opacity 的层叠问题</title>
 <style>
 html{padding:40px;}
 .dd{width:100px;height:100px;}
 #a{background:red;}
 #b{background:blue;margin-left:20px;margin-top:-80px;}
 #c{background:green;margin-left:40px;margin-top:-80px;}
 </style>
 </head>
 <body>
 <div id="a"></div>
 <div id="b"></div>
 <div id="c"></div>
 </body>
 </html>

保存为 html 文件打开之后,可以看到正常的次序

正常的层叠

这时候,我们为 #a 加上属性 opacity:0.9 神奇的事情发生了,它覆盖了另外两个层

加上小于1的 opacity 之后的层叠

只有当为另一个层(例如:#c)也设置一个小于 1 的 opacity 值(例如:0.8)之后,后面的 #c 才能安装正常的规则覆盖在 #a 上面。

同时为另一个层赋值 opacity

这样,增加了小于 1 的 opacity 属性的层,升高了一个层次。至于里面的科学原理,我没有想明白,或许也可能是一个小 BUG。但是有时候这种情况是我们不希望发生的。

解决问题

那么如何来解决这个问题呢?前面也说过了,正常的情况下,指定了 position 并且指定了 z-index 值的层,拥有比普通层更高的层次,那么指定 opacity 的层和指定了 position 的层相比呢?我们对 #b 加上 position:relative 看看。这时候的样式代码如下:

 #a{background:red;opacity:0.9;}
 #b{background:blue;margin-left:20px;margin-top:-80px;position:relative;}
 #c{background:green;margin-left:40px;margin-top:-80px;opacity:0.8;}

保存刷新后,看到效果是这样的:

对层使用了 position 属性之后的层叠效果

也就是说,对层使用 position 属性的 relative 之后,可以使其层次和 opacity 相同,这样之后,按照正常的排序进行层叠显示(在后面的实验中,我对 absolute 属性值也做了测试,结果和 relative 属性值表现的相同)。当我们取消了 #c 的 opacity 属性之后,我们可以看到,#c 被排在了最下面。

对底层取消 opacity 属性之后的效果

还没有完,之前只是对 #b 激活了 position:relative 属性,还没有使用 z-index。我们对 #b 进行了 z-index 的设置(例如:100),很显然的,#b 成为了最顶层。

对中间层设置 z-index 的效果

得出结论:

使用了 position 属性值为 absolute、relative 的层,将会比普通层更高层次。使用了小于 1 的 opacity 属性的层,也比普通层更高层次并且和指定 position 的层同层,但是不支持 z-index 属性,所以指定 position 的层,可以使用 z-index 属性,来覆盖带有小于 1 的 opacity 属性的层。