前几天一位在广告公司的朋友发来求助,说:“有一个项目要求实现对字符串进行动态拆分,然后对拆分出的字符分别使用不同的样式效果...”,听到这个需求,我内心有点不屑,这有何能,最多五分钟搞定啊~~ 于是我在直接在浏览器控制台敲了一段Demo代码发给这位朋友,然后沾沾自喜中.....五秒钟后,回复我说:“不是的,*&*^&*~~!@......”,我意识到模糊的需求真TMD害人害己啊,不搞清需求盲目动手真是自找苦吃啊~~~

经过一番更详尽的沟通后,总结他的需求是这样的:一段随机的英文文本放在一个固定宽度的容器中,且文本如果出现多行情况时,每行文本的样式(如:字体大小,颜色等)可以通过CSS控制与其它行进行样式区分;当英文文本更改后,同样可以实现上述需求。

最终的效果可能如下图(画的太丑~):

这样子岂不是要将字符串中的每一个单词都截出来,然后逐个再放回到容器中,当某一个单词在当前行中无容身之处时,强制将其置于下一行,依此类推,直到最后。

突然回想起来前一段时间看到过一个基于JQuery的插件,叫做Lettering.js (官网:http://letteringjs.com/),可以实现对英文字符的智能拆分,可以通过参数实现拆分为行(line)、单词(word)、字符(char)的操作,使用很方便简洁,那我想,这个拆分截取的工作就可以交给它来完成,我可以将重点放在换行的判断操作上。

Lettering.js官方的一个example网站实现方式:

HTML源代码及Lettering.js的使用:

使用Lettering.js后HTML结构:

通过分析可以看到:

1、在JS代码中执行$(".glass p").lettering("lines")后,将原来每一个<br>标签前后的文本都wrap在一个独立的<span class="line*"></span>中;

2、对行进行单词拆分操作,如:$('.line3').lettering('words');

3、对行进行字符拆分操作,如:$('.line2').lettering();

3、对行进行单词+字符拆分操作,如:$('.line1').lettering('words').children('span').lettering();

而我们要实现的目标与上面这个example中的区别是:

1、我们不会事先将文本进行手动换行(即:不会手动添加<br>,因为不知道应该在哪里加<br>~~~);

2、我们无须将单词进一步拆分为字符;

3、我们一共会有多少行文本? 这是一个未知数,直到最后一刻才可知晓~~~。

我们的实施:

html容器:

<div id="test" class="test-text">Here is the multiline English text of demonstration, the text here is dynamic and the style of each single line could be customized by CSS and different from others. </div>

html容器样式:

.test-text {
font-family:"Aleo Regular","Palatino Linotype",Palatino;
width: 500px;
margin: 0 auto;
background: #ecfeff;
color: #f60;
font-size: 24px;
padding: 25px;
line-height: 1.667;
word-wrap: break-word;
word-break: break-all; text-shadow: 0 1px 1px rgba(0,0,0,.5);
}

JS引用:

<script src="http://http://code.jquery.com/jquery-1.10.1.js"></script>
<script src="https://github.com/downloads/davatron5000/Lettering.js/jquery.lettering-0.6.1.min.js"></script>

所以我们实现的重点是:换行点~~~

之前说过,我们的想法就是逐个遍历已经拆分好的单词,通过对比当前单词与其后一个单词是否在同一行位置来确定换行点;

通过判断offset().top的差值来确定是否同行,JS代码也很简单:

 $(document).ready(function(){
var Dom = $("#test");
Dom.lettering('words').children('span').each(function(){
var $this = $(this), next = $this.next();
if(next.length!=0){
if(Math.abs(next.offset().top - $this.offset().top) > 5 ){
$this.after("<br />");
}
}
});
});

这样子就可以实现动态添加<br>来为文本换行啦~~~

还有一个问题,如何对每一行文本的样式进行区分自定义呢?考虑到我朋友说过,这个效果只需要兼容最新的Chrome浏览器即可,我首先想到的是用CSS3实现,换行点都找到了,那还不简单吗?

更新JS如下(添加了换行点特殊类名)

 $(document).ready(function(){
var Dom = $("#test");
var lineCount = 0;
Dom.lettering('words').children('span').addClass("word").each(function(){
var $this = $(this), next = $this.next();
if(next.length!=0){
if(Math.abs(next.offset().top - $this.offset().top) > 5 ){
$this.addClass("break-point-"+(++lineCount)).after("<br />");
}
}
});
});

新增如下CSS(这个CSS实现方式有点SB,需要最大量度定义多行的样式,这里只是传达思想,实现方式有很多~~)

.test-text .word{
display:inline-block;
}
.test-text .break-point-1 ~ span{
font-size:30px;
color:#333;
}
.test-text .break-point-2 ~ span{
color:#036;
font-size:15px;
}
.test-text .break-point-3 ~ span{
color:#FC0;
font-size:22px;
}
.test-text .break-point-4 ~ span{
color:#090;
font-size:18px;
}
.test-text .break-point-5 ~ span{
font-size:26px;
color:#930;
}
.test-text .break-point-6 ~ span{
color:#93C;
font-size:34px;
}
.test-text .break-point-7 ~ span{
color:#f60;
font-size:38px;
}
.test-text .break-point-8 ~ span{
color:#002569;
font-size:46px;
}
.test-text .break-point-9 ~ span{
font-size:10px;
color:darkgreen;
}
.test-text .break-point-10 ~ span{
color:lightblue;
font-size:33px;
}
.test-text .break-point-11 ~ span{
color:yellow;
font-size:16px;
}
.test-text .break-point-12 ~ span{
color:green;
font-size:16px;
}
.test-text .break-point-13 ~ span{
color:ruby;
font-size:14px;
}
.test-text .break-point-14 ~ span{
color:purple;
font-size:11px;
}
.test-text .break-point-15 ~ span{
color:pink;
font-size:12px;
}
.test-text .break-point-16 ~ span{
color:gray;
font-size:16px;
}

可以参考我做好的demo:

http://jsfiddle.net/divayang/697ynekh/

http://jsfiddle.net/divayang/697ynekh/5/

使用JQuery.lettering.js实现多行文本样式自定义的更多相关文章

  1. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  2. jQuery.template.js 简单使用

    之前看了一篇文章<我们为什么要尝试前后端分离>,深有同感,并有了下面的评论: 我最近也和前端同事在讨论这个问题,比如有时候前端写好页面给后端了,然后后端把这些页面拆分成很多的 views, ...

  3. 修改 jquery.validate.js 支持非form标签

    尝试使用markdown来写一篇blog,啦啦啦 源代码传送门:github 在特殊情况下我们使用jquery.validate.js对用户输入的内容做验证的时候,表单并不是一定包含在form之中,有 ...

  4. 表单验证插件之jquery.validate.js

    提到表单验证的插件,第一个想到的就是jquery.validate.js,所以小生想在这里稍微详细地说一下这款插件的具体使用方法,便于理解,我直接附上整段demo的代码(没怎么调样式,主要是看js): ...

  5. 延迟加载外部js文件,延迟加载图片(jquery.lazyload.js和echo,js)

    js里一说到延迟加载,大都离不开两种情形,即外部Js文件的延迟加载,以及网页图片的延迟加载: 1.首先简单说一下js文件的3种延迟加载方式: (1)<script type="text ...

  6. 初探jquery.slimscroll.js和iscroll5.js

    网上关于实现各种滚动效果的插件不胜枚举,这里,我简单介绍一下自己用过的两款比较有代表性的插件: 1.jquery.slimscroll.js,需要先引入jquery类库,主要用于模拟传统的浏览器滚动条 ...

  7. 动态生成二维码插件 jquery.qrcode.js

    前段时间做项目,需要动态生成一个二维码,于是就在网上找了一下发现一个jquery插件jquery.qrcode.js,所以今天就简单说一下这个插件的使用: jquery.qrcode.js是依赖jqu ...

  8. Jquery客户端校验——jquery.validate.js

    jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证 ...

  9. 懒加载插件- jquery.lazyload.js

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...

随机推荐

  1. foreach 和for语句比较

    1.首先想到循环就是执行效率的问题,参考博客http://www.cnblogs.com/yzxchoice/archive/2007/12/15/995949.html 2. 测试时候发现出现“   ...

  2. CSS3阴影 box-shadow的使用

      text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[ins ...

  3. Android Service 系统服务

    android sdk 提供很多公用的服务,也就是系统服务,开发者可以通过Activity类的getSystemService方法获取指定的服务.系统服务包含音频服务.视频服务窗口服务等.本篇主要讲T ...

  4. vbox下安装 linux 64 bit出现“kernel requires an x86_64 cpu

        今天在vbox下安装linux 64bit出现"kernel requires an x86_64 cpu, but only detected "的错误,网上有很多文章介 ...

  5. z-index解决弹出层遮罩层覆盖子div不能显示输出的问题

    // 添加以下代码来进行测试: // ajax 发生错误,就会执行$('body').ajaxError(function(e, xhr, setting, text){    // e - even ...

  6. The executable was signed with invalid entitlements新设备run出现这个问题

    出现这个问题一般是新手不熟悉开发者发布流程造成地 一定要安开发者流程一步一步走 这样就不会出错了 注意这几个地方地设置 1.

  7. Winform子窗体刷新父窗体

    调用窗体(父):Form1,被调用窗体(子):Form2方法1:   所有权法//Form1://需要有一个公共的刷新方法public   void   Refresh_Method(){//...} ...

  8. C++写geohash

    http://www.cnblogs.com/LBSer/p/3310455.html http://www.sxrczx.com/pages/my.oschina.net/853294317/blo ...

  9. gridView行号的显示

    我们在进行开发的时候,很多地方希望dataGridview或girdView显示行号,这里我来说一下两种的实现方法 在girdView中很简单很好实现,我在这里写一下代码,具体其他功能可以看其带的DE ...

  10. 在windows下,git webhook使用php拉取代码的学习总结

    原来上传代码到测试服务器都是用ftp,我觉得这种方式很低效,而且容易出错,比如忘记传某个修改过文件. 现在项目的代码放在了git@osc上了,想使用他webhook,每当有push的时候,git@os ...