letter-spacing+first-letter实现按钮文字隐藏

本文地址:http://www.zhangxinxu.com/wordpress/?p=3557

一、文不在长,有货则灵

图片式按钮的文字隐藏看来是大家都比较关注的一个问题(分享讨论、微博转发等可见一斑),text-indent负值为最常用方法,然问题有三:

  1. 较大的负值有性能问题,例如新浪/腾讯微博提交按钮的-9999em,大概12~16万像素的宽度,相对于100个显示器宽度,在低配Android pad上,尤其含动画效果的时候,会直接卡爆;
  2. FireFox浏览器下虚框。其实问题不大,overflow:hidden可修复;
  3. 不能应用在IE6/IE7伪inline-block水平元素上,否则元素会被text-indent拐走。

即使有人提出:

{ text-indent: 100%; white-spacing: nowrap; overflow: hidden; }

除了性能有所缓解,后面两个问题依旧存在。

二、法不在高,能用则行

上周分享,有同行提到另外一个隐藏之法,简称为:font: 0/0 a法。

释义为,字号大小0, 行高0,字体a是因为就一个字母,换成b也是OK的,实际并无a字体。日本高中社团要至少4个人才能成立,游泳社就3个人,于是就去田径队找了个旱鸭子来充数,这个旱鸭子就是这里的a.

一般要配合overflow: hidden使用。

实例顶千言,您可以狠狠地点击这里:font:0/0 a与按钮文字隐藏demo

CSS代码如下:

.btn {
    display: inline-block;
    width: 52px; height: 25px;
    border: 0;
    background: #f0f0f0 url(/study/image/flash_copy_btn.png);
    font: 0/0 a;
    overflow: hidden;    /* 抹掉a标签按钮最上面的小点 */
}

说明:

  1. 网上有说法是Chrome下需要添加color: transparent,不过据我win7 Chrome浏览器查看,没什么问题,因此CSS中无此声明;
  2. overflow: hidden用来解决IE6浏览器下,a元素等模拟标签下最顶部残存小点点的问题。
  3. 对于原生的button按钮元素,此方法表示无能为力,低版本IE浏览器下,小点点依旧存在,如下放大后的截图:

相比text-indent负值缩进,此方法优点在于可以应用在inline-block水平元素上;不足在于不能用在原生的button按钮元素上。

因此,还有改进余地以及寻找更好方法的动力。

三、斯是吾法,齐论德馨

此方法是我午饭后打瞌睡的时候想到的,一句话概括就是letter-spacing负值+first-letter伪元素负值实现。

对于新方法,先展示效果才能让别人有继续深入的兴趣。您可以狠狠地点击这里:letter-spacing/first-letter与按钮文字隐藏demo

IE6浏览器下的截图如下:

CSS代码如下:

.btn {
    display: inline-block;
    width: 52px; height: 25px;
    border: 0;
    background: #f0f0f0 url(/study/image/flash_copy_btn.png);
    letter-spacing: -3em;
    overflow: hidden;
}
.btn:first-letter {
    margin-left: -20em;
}

1. 关于letter-spacing负值
letter-spacing控制字符间距,可以是负值,可以让字符水平方向重叠,甚至倒序排列,如值为-2em时候。选择下面下拉值,可以看到不同letter-spacing大小对应效果:

更改letter-spacing大小:
 
2em

1em

0

-1em

-2em

我是测试文字!

于是,如果按钮text-alignleft的话,letter-spacing值在小于-2em的时候,字符都跑到了首字符的左侧(也就是在按钮的外面)。一旦按钮设置了overflow:hidden除了第一个字符,其余字符都隐藏了

2. 关于first-letter伪元素
first-letter伪元素与first-line伪元素实际是表兄弟关系,first-line可以实现IE6/IE7的单标签多背景效果,前不久刚介绍,那first-letter呢?

顾名思意,first-letter控制第一个字符的样式,IE5.5开始支持,支持的样式有(参考自MDN):

  • 所有字体相关属性:fontfont-stylefont-variantfont-weightfont-sizeline-height以及font-family.
  • 所有背景相关属性:background-colorbackground-imagebackground-positionbackground-repeatbackground-size, 以及background-attachment.
  • 所有margin相关属性:marginmargin-topmargin-rightmargin-bottommargin-left.
  • 所有padding相关属性:paddingpadding-toppadding-rightpadding-bottompadding-left.
  • 所有border相关属性:缩写的borderborder-styleborder-colorborder-width及普通书写的属性。
  • color属性。
  • text-decorationtext-transformletter-spacingword-spacing(合适情境下), line-heightfloatvertical-align(只有当floatnone的时候)这些CSS属性们.

要隐藏第一个字符,我采用的就是margin负值。例如:

.btn:first-letter {
    margin-left: -20em;
}

于是,字符们全部都隐藏了

当然,还是有些需要说明的。

3. 其他一些说明:

  1. 此方法兼容IE6+, 适用于inline-block水平元素,且适用于button元素,不过,需要是下面这种写法:

    <button type="button/submit">按钮</button>

    而不能是这样子:

    <input type="button/submit" value="按钮" />
  2. 此方法受text-align属性影响。letter-spacing负值+first-lettermargin负值适用于text-align:left;的情况,如果按钮text-alignright,则letter-spacing以及first-lettermargin需要使用正值。

    值的大小其实没有定值。一般,letter-spacing绝对值大于2em可以,首字符margin可以大一些,demo中是-20em.
  3. 多个:first-letter伪元素不要使用逗号分隔,貌似会全部失效,应分开写使用逗号分隔的时候逗号前面一定要留一个空格,就跟众所周知的{前面要留有空格一样,否则,IE6浏览器会忽略这条声明:

    .btn:first-letter,
    .img:first-letter {
        margin-left: -20em;
    }
    
    .btn:first-letter ,    /* 逗号前需有1个空格 */
    .img:first-letter {
        margin-left: -20em;
    }
    

未大规模测试,欢迎反馈问题。

在实际应用的时候,我们可以把该功能的CSS独立出来,公共使用,例如:

.notext {
    text-align: left;
    letter-spacing: -3em;
    overflow: hidden;
}
.notext:first-letter {
    margin-left: -20em;
}

四、不是会两句古诗就了不起的

其实呢,如果不要兼顾原生button按钮,还可以使用padding撑开容器尺寸隐藏文字的方法,类似下面:

.btn {
    display: inline-block;
    padding-top: 25px;
    width: 52px; height: 0;
    background: #f0f0f0 url(/study/image/flash_copy_btn.png);
    overflow: hidden;
}

代码少,理解简单,兼容性还不错。就是不能用在正宗的按钮元素上(IE6/IE7直接隐藏抗议)。

五、孔子曰:“何陋之有?”

letter-spacing+first-letter隐藏文字的方法动用了伪元素,方法虽糙,但效果不糙。我个人觉得比前两种方法都要好一些,您觉得呢?

行文仓促,文中难免有表达不准确之处,欢迎指正;如果有技术性错误,务必指出,感谢阅读!

原创文章,转载请注明来自张鑫旭-鑫空间-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=3557

(本篇完)

时间: 2024-10-27 07:58:55

letter-spacing+first-letter实现按钮文字隐藏的相关文章

[WinForm][DevExpress]自定义GridControl中按钮文字内容

最近项目开发中,使用到了GridControl的FindPanel,这样可以很好的对数据进行筛选,可是所展现的按钮文字是英文,如图: 那怎么定义两个按钮问题,以符合项目需求了?经过一番搜索发现利用GridLocalizer可以很好实现: 核心代码: public class BuilderGridLocalizer : GridLocalizer { Dictionary<GridStringId, string> CusLocalizedKeyValue = null; /// <su

iOS7 修改导航系统默认返回按钮文字及颜色

//iOS7 修改系统默认返回按钮文字及颜色 UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"返" style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationItem.backBarButtonItem = item; [[UINavigationBar appearance] setTintColor:[UIColor

点击按钮实现隐藏和显示的切换代码

点击按钮实现隐藏和显示的切换代码:在不少应用中,都有这样的功能,点击同一个按钮可以实现一个元素的显示和隐藏的切换,下面就通过代码实例介绍一下如何实现此效果,代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> &

如何让div中的文字只显示一行,多余的文字隐藏并加上省略号(超链接形式)

写页面的时候遇到了一个小小的问题,如何让div中一行超链接文字只显示一行,多余的文字隐藏并加上省略号,悬浮时隐藏的文字显示出来?解决问题时发现了css3的一个新标签  text-overflow  ,其属性规定当文本溢出包含元素时发生的事情.语法如下: text-overflow: clip|ellipsis|string; 代码如下: <!DOCTYPE html><html><head><meta http-equiv="Content-Type&q

关于采用css样式将多余的文字隐藏,以及实现树形菜单

前不久根据项目需要,需要写个页面,在页面中需要动态的实现一个树形的菜单,经过问度娘,选择使用一个treeTable的js插件.http://zhanchaojiang.com/demo/demo/treeTable.html这是对该插件的介绍地址.在这个插件中有如下几个树形:theme:default或者是vsStyle,默认为default,差别应该在样式上,default是加减号,vsStyle是三角.expandLevel:默认展开的层数,默认值为1.也就是刷新该页面时树状图展开的层次.c

jQuery Mobile(jqm)按钮的隐藏和显示,包括a标签,圆角和非圆角按钮

在移动互联网时代,HTML5开发越来越收到欢迎.于是各种HTML5的框架都出来了.由于对于jquery的熟悉,jquery mobile 为多数人选择学习的对象.我也是众多追求者之一.最近一直在开发jQuery Mobile的相关应用.并颇有心得,再这里和大家一起分享一下. 好了,我们之间上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head>

点击按钮显示隐藏层 和 切换按钮同时显示多个隐藏层

按钮点击显示隐藏层(再次点击按钮则隐藏层关闭): HTML部分: <button type="button" id="show" onclick="showHidden()">点我显示隐藏层</button> <div id="hidden" style="display:none">我是隐藏层.</div> JS部分: <script type='te

CSS多余文字隐藏

有时候容器的宽度是固定的,但要显示的文字有点多,就需要将多余的文字隐藏,而且为了表示还有字没有显示,用省略号表示. 类似这样: 用下面的css样式就可以实现: .hidden-text { overflow: hidden; text-overflow: ellipsis; } 三个属性一起使用,就可以实现上述的效果. overflow,默认值是visible,如果不设置hidden,就会把内容全部显示,查出容器的范围. text-overflow:有三个值, clip(修剪文本).ellips

java swing 去掉按钮文字周围的焦点框

闲来无事,写了个swing界面,运行后看到当点击按钮时,中间文字会出现一个刚好把文字围住的小方框,这是按钮获得焦点的标志,我是觉得一个字:丑!怎么去掉呢?万能的度娘告诉我,设置下button的setFocusPainted为false,我试了一下,果然ok,下面将代码分享给大家,可以将设置属性的那句话注掉,看看前后效果. import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.sw