范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

多行内容超出显示的JS解决方案

  一个貌似很简单,但写起来也不简单的问题—对于多行文字,超出...显示。
  通过css可以实现,但受限于浏览器兼容问题,有时候还需要依赖js来实现。
  通过js实现,就需要考虑到文字大小,中英文、数字、标点符号所对应的字节长度不一致,如果考虑的不全面,对于不同的文字内容,总会有点差距。
  首先,我们需要了解,中文汉字,英文字母,数字以及特殊符号所占的字节长度是不一样的,如果需要计算准确,就不能按照字符串的元素个数去截取,把它们换算成字节数来截取,准确度更高。所以,我们需要一个获取字符串字节长度的方法: function bitCompute(content) {    var total = 0,     len = arguments[0].length || 0    for (var i = 0; i < len; i++) {     if (content[i].charCodeAt() > 255) {      total += 2;     } else {      total += 1;     }    }    return total }
  对于要截取多少内容的字节数,我们需要知悉能放入容器内的字节数与总字节数的比例,展示字节数/总字节数 = offsetWidth / scrollWidth: function complate() {    var offsetWidth = el.offsetWidth;    var scrollWidth = el.scrollWidth;    var gap = scrollWidth - offsetWidth;    var percent = Math.floor(offsetWidth / scrollWidth * 1e3) / 1e3;    return {     gap: gap,     percent: percent    } }
  根据计算得出的数据,我们就可以操作字符串了。 function cut(content) {    el.innerhtml = content;    var info = complate(),     percent = info.percent;    var total = bitCompute(content).total;    var showLen = +(total * percent).toFixed(0) - cfg.placeholder;    content = bitCompute(content, showLen).content;    return content + cfg.padding; }  function bitCompute(content, maxLen) {    var total = 0,     len = arguments[0].length || 0,     outContent = "";    for (var i = 0; i < len; i++) {     if (content[i].charCodeAt() > 255) {      total += 2;     } else {      total += 1;     }     if (maxLen && total > maxLen) {      break;     }     outContent += content[i];    }    return {     total: total,     content: outContent    } }
  当然文字展示的多少,也是和字体大小相关的,所以我们也需要把字体大小的因素考虑到,而且作为一个工作方法,本身就不应该页面中的元素有关联,所以我们应该在方法中自己创建元素,放入内容,计算offsetWidth和scrollWidth。 function cutFactory(opt) {   var cfg = {    padding: opt.padding || "...",    classList: opt.classList || [],    style: opt.style || {},    debug: opt.debug   };   cfg.placeholder = bitCompute(cfg.padding).total;   var el = doc.createElement("span");   el.className = cfg.classList.join(" ");   var customStyles = [];   for (var styleKey in cfg.style) {    if (cfg.style.hasOwnProperty(styleKey)) {     customStyles.push(styleKey + ":" + cfg.style[styleKey]);    }   }   el.style.cssText = "position:absolute;left:0;top:0;background:transparent;color:transparent;height:100%;white-space:nowrap;overflow:visible;border:0;" + (cfg.debug ? "background:white;color:red;" : "") + customStyles.join(";");   var p = doc.createElement("p");   p.appendChild(el);   p.style.cssText = "width:99%;min-height:50px;line-height:50px;position:absolute;left:3px;top:3px;overflow:hidden;outline:0;background:transparent;" + (cfg.debug ? "outline:1px solid red;background:black;" : "");   doc.body.appendChild(p);   var css = win.getComputedStyle(el);   cfg.fontSize = parseFloat(css.fontSize) || 16;   return function (content) {    el.innerhtml = content;    var out = {     flag: false,     cut: "",     all: content,     last: content    }    if (complate().gap > 0) {     out.flag = true,     out.last = out.cut = cut(content)    }    return out   } }
  最后,再暴露一个方法,方便使用者调用。
  为了性能考虑,不创建过多dom元素,我们可以缓存一下字体大小和容器宽度相同的截取方法。 function subStringEL(name, fontSize, width) {   this.subStringELFns || (this.subStringELFns = {});   var key = "key_" + fontSize + "_" + width;   var fn = this.subStringELFns[key];   if (!fn) {    fn = this.subStringELFns[key] = cutFactory({     style: {      "font-size": fontSize,      "width": width     }    })   }   return fn(name); }
  这样就完美的解决了多行超出...显示的问题了,兼容性很好,而且也能准确截取,灵活方便。

DMi超混加持,3。5升油耗的比亚迪秦Plus成油车终结者2021年1月11日,比亚迪发布了极致省油的DMi超级混动技术,搭载该技术的秦Plus馈电标称油耗则可达到3。8升百公里。3。8升百公里的数据怎么来的,适用于大部分驾驶场景吗,宣传特斯拉Model2渲染图曝光,16万人民币起售近日,外媒爆料,特斯拉正打算针对中国市场推出一款全新的车型,该车型的定位将低于Model3,或命名为Model2,售价约16万20万元人民币。从图片来看,Model2整体的设计语言大众公布EV旗舰新品车型细节通过OTA实现L4大众汽车始终专注于推出消费者负担得起的电动汽车,但据报道,这家德国品牌正计划在不久的将来通过一项名为ProjectTrinity的旗舰车型来展示其在电动车领域的权威性。近日,大众汽全球车企爆发芯片危机,奥迪福特斯巴鲁等部分汽车工厂关停受到疫情影响,全球半导体行业产能下降,如今缺少芯片的情况,已经不止停留在手机电脑等数码产品,汽车行业也开始受到冲击。近期,车企因缺少芯片而不得不减产甚至关停工厂的新闻频频登上媒体报PPT成真,特斯拉展示4680电池产线,续航里程增加16近日,特斯拉官方公布了一段视频,展示了预热许久的4680新型电池生产线。对此,特斯拉CEO埃隆马斯克表示,由于特斯拉的电池产线灵感来源于批量生产行业,因此,未来特斯拉将以生产玩具汽三星S21加入汽车连接联盟,可用UWB钥匙开启奥迪宝马福特昨天,宝马宣布将为2021款新车增加对增强版UWB数字钥匙的支持,iPhone及AppleWatch将可以实现较远距离开启。如今,三星也宣布与奥迪宝马福特及杰恩斯达成合作,为消费者大众CEO开通推特账号,第一件事就是向特斯拉的马斯克发战书在过去的2020年,美国电动汽车厂商一直在忙着建设德国工厂,而德国是老牌汽车品牌大众的主场,这口气自然咽不下。近日,大众汽车CEO似乎坐不住了,在特斯拉CEO埃隆。马斯克的主场进行新能源汽车逆袭蔚来市值暴涨18倍,特斯拉成全球第一车企2020年,疫情对全球汽车行业造成了巨大的冲击,行业经历了有史以来最大规模的停产。但从下半年开始,全球汽车行业迎来了复苏,供需端迅速回暖。对于上市车企而言,得益于汽车电动化转型步伐德系车比日系车皮实?媒体实测大众速腾对撞卡罗拉,谁又翻车了汽车爱好者中有一种说法,德系车厚实耐撞,日系车皮薄吸震。关于日系车和德系车谁的安全系数更高,民间一直存在不同的声音。在去年中保研的碰撞测试里,德系的大众车型可谓全线翻车,迈腾途观,特斯拉柏林超级工厂获批,首先量产ModelY和4680电池特斯拉CEO马斯克此前曾表示,将令柏林的电池生产工厂年产能达到100GWh,甚至可能扩大到200250GWh。这个数据有多么夸张?100GWh已经是目前全球最大电池工厂特斯拉内华达目标ModelY,大众ID。4CROZZ售价19万起2020年新能源汽车发展迅猛,而传统燃油车品牌中,大众应对电动化转型积极,推出了MEB全新电动平台拥抱汽车智能化。2020年11月3日,大众正式公布了国产电动汽车ID。4CROZZ
亚马逊的大封杀,给跨境电商指了一条明路跨境电商去年有多风光,今年就有多惨。4月以来,国内跨境电商公司们迎来了亚马逊平台史上最严厉的一波封号潮。封号年年有,今年却特别狠。包括帕拓逊傲基有棵树通拓泽宝等跨境电商行业头部公司中国力量在行动!心系河南,居然之家鸿星尔克多家企业捐款捐资今天彻底不闭馆!请大家转发有需要的人!在居然之家北龙湖店附近的被困人员,不要冒险回家,馆里提供热水及休息场所。风雨无情,人有情。只要需要我们就在。一场突如其来的天灾,让河南人民陷于前置仓电商双熊,谁在裸泳?一个月前,每日优鲜和叮咚买菜还在为了前置仓电商第一股争分夺秒,同一天递交招股书,同一天更新招股书。一个月后,前置仓电商双雄变双熊。尤其每日优鲜,上市即破发,两天便跌去34,叮咚买菜超李宁比肩阿迪,4200亿的安踏真的稳了?5041亿港元,这是安踏体育(HK02020)的最新市值,是李宁(HK02331)的2。1倍,也是耐克之后的全球第二大体育品牌。不仅如此,安踏2020年净利润达51。62亿元,首次创新时代传统药企如何脱颖而出?从科兴制药引进英夫利西单抗说起一款新药上市的威力有多大?前有华东医药凭借少女针上市,强势收获涨停板,今有迈博药业凭借国内首款英夫利西单抗类似药获批上市,股价大涨。7月14日,迈博药业公告表示,英夫利西单抗类似药创新药企战火重燃,为何它们入局伴随诊断?近日,基石药业发布泰吉华(阿伐替尼片)伴随诊断试剂盒人PDGFRA基因D842V突变检测试剂盒(PCR荧光探针法)获国家药品监督管理局优先审批。该试剂盒用于精准筛选携带PDGFRA冰峰IPO,老牌汽水的救赎之战上世纪90年代,可口可乐和百事可乐先后并购了北冰洋山海关天府可乐崂山可乐等7家国产汽水品牌,并将品牌雪藏,史称两乐水淹七军。唯一的幸存者是冰峰,其后它牢牢占据陕西市场。这个拥有70二次供地开始,首轮抢地的房企被拍晕在沙滩第一轮抢地过去不到3个月,二次供地又拉开了序幕。截至8月4日,无锡厦门长春已经完成第二次集中供地。实际上,厦门长春早在6月就已完成二次供地。从厦门无锡此次供地结果来看,土拍市场一改居然之家董事长汪林朋出手增持,企业价值持续释放居然之家(000785。sz)董事长兼CEO汪林朋正在二级市场增持居然之家股票。公开数据显示,截止至7月27日,汪林朋增持公司股票300余万股,金额超过1500万元。此外,其它高管倍轻松,下一个石头科技?继石头科技极米科技之后,又一家消费硬件类企业,倍轻松成功上市,成为科创板按摩器第一股。市场也很给面儿,倍轻松上市首日大涨524。74。随后几个交易日有所回落,但总市值也接近百亿。相银行网点大撤退大行向左,中小行向右2013年,美国银行家布莱特金在银行3。0提出银行不再是一个地方,而是一种服务。2018年,他又在银行4。0中进一步判断银行服务无处不在,就是不在银行网点。关于银行网点去留的激辩已