javascript超過容器後顯示省略號效果(相容一行或者多行)

来源:http://www.cnblogs.com/gssajl/archive/2016/07/13/5667207.html
-Advertisement-
Play Games

javascript超過容器後顯示省略號效果 在實際的項目中,由於文字內容的長度不確定性和頁面佈局的固定性,難免會出現文字內容超過div(或其他標簽,下同)區域的情況,此時比較好的做法就是當文字超過限定的div寬度後自動以省略號(…)顯示,這樣,按照習慣,人們都會知道這兒有文字被省略了。css中有個... ...


javascript超過容器後顯示省略號效果

      在實際的項目中,由於文字內容的長度不確定性和頁面佈局的固定性,難免會出現文字內容超過div(或其他標簽,下同)區域的情況,此時比較好的做法就是當文字超過限定的div寬度後自動以省略號(…)顯示,這樣,按照習慣,人們都會知道這兒有文字被省略了。css中有個屬性叫做text-overflow:ellipsis;比如使用css可以這樣寫:

{width:27em; white-space:nowrap; text-overflow:ellipsis; -o-text-overflow:ellipsis; overflow:hidden;}僅在Firefox火狐瀏覽器下無法實現文字溢出省略號表示,其文字直接從中間咔掉了,我這邊不講用css怎麼樣來實現這樣的,具體的css實現可以自己百度去,我這邊最主要的是講怎麼樣用JS來實現,怎麼樣通過JS寫一個簡單的組件,我直接調用JS的初始化方法就可以實現掉!比如如下效果:

後面的點點點 來提示用戶有更多的內容未顯示完成這樣的效果!

先廢話少說!首先來看看我做的demo效果,就能明白到底是個什麼樣的效果!

想看效果,請點擊我!ok?

一: 先來看看組件的配置項:如下:

   targetCls

null,    目標要截取的容器 必填項 預設為null

limitLineNumber 1,     要顯示的行數 預設為1行

type '...',      超過了容器長度 顯示的type 預設為省略號

lineHeight  18,       dom節點的行高 預設行高為18

isShowTitle true ,      title 是否需要title來顯示所有的內容 預設為true

isCharLimit false     根據字元的長度來限制 超過顯示省略號

maxLength 20        預設長度為20 超過字元20後 顯示省略號

二:分析

1.  首先來講講此組件:支持2種方式來截取字元串,第一:根據字元的長度來截取,超過後顯示省略號,比如我這樣調用:

 

  new MultiEllipsis({

"targetCls" : '.text8',

"isCharLimit":true,

"maxLength": 18

  });

這樣初始化的意思是說,isCharLimit為true是指用字元的個數來截取,最大的長度maxLength為18,這樣初始化,因為代碼裡面會首先判斷如果isCharLimit為true的話,就直接按照字元的個數來截取,比如如下代碼:

2. 第二種是根據多少行數及高度來截取的,比如預設配置項的行高是18,如果我想顯示2行,那也就是說高度h = 18*2, 假如容器的高度是100,那麼截取的方法是:

  使用 (100 - type的長度 - 1)  是否大於 18×2,如果大於的話,繼續截取,否則的不截取,且顯示省略號效果!如下代碼:

缺點:但是使用行高截取的話,如果數據比較少的話,是可以的,但是如果數據很多的話,比如高度為500像素或者更多的話,那麼相對來說會影響性能的,因為他們每次都要計算n次(n為迴圈調用函數多的意思)。

JS所有的代碼如下:

複製代碼

/*

* 基於JS的MultiEllipsis

* @author tugenhua

*/

function MultiEllipsis(options) {

    var self = this;

    self.options = $.extend({},defaults,options || {});

    self._init();

}

$.extend(MultiEllipsis.prototype,{

     // 頁面初始化

    _init: function(){

        var self = this,

            cfg = self.options;

        if(cfg.targetCls == null || $(cfg.targetCls + "")[0] === undefined) {

            if(window.console) {

                console.log("targetCls不為空!");

            }

            return;

        }

        if(cfg.isShowTitle) {

            // 獲取元素的文本 添加title屬性

            var title = self.getText();

            $(cfg.targetCls ).attr({"title":title});

        }

        // 如果是按照字元來限制的話 那麼就不按照高度來比較 直接返回

        if(cfg.isCharLimit) {

            self._charCompare();

            return;

        }

        self._compareHeight(cfg.lineHeight * cfg.limitLineNumber);

    },

    /*

     * 按照字元的長度來比較 來顯示文本

     * @method _charCompare {private}

     * @return  返回新的字元串到容器裡面

     */

    _charCompare: function(){

        var self = this,

            cfg = self.options;

        var text = self.getText();

        if(text.length > cfg.maxLength) {

            var curText = text.substring(0,cfg.maxLength);

            $($(cfg.targetCls + "")[0]).html(curText  + cfg.type);

        }

    },

    /*

     * 獲取目標元素的text

     * 如果有屬性 data-text 有值的話 那麼先獲取這個值 否則的話 直接去html內容

     * @method getText {public}

     */

    getText: function(){

        var self = this,

            cfg = self.options;

        return $.trim($($(cfg.targetCls + "")[0]).html());

    },

    /*

     * 設置dom元素文本

     * @method setText {public}

     */

    setText: function(text){

        var self = this,

            cfg = self.options;

        $($(cfg.targetCls + "")[0]).html(text);

    },

    /*

     * 通過配置項的 行數 * 一行的行高  是否大於或者等於當前的高度

     * @method _compareHeight {private}

     */

    _compareHeight: function(maxLineHeight) {

        var self = this;

        var curHeight = self._getTargetHeight();

        if(curHeight > maxLineHeight) {

            self._deleteText(self.getText());

        }

    },

    /*

     * 截取文本

     * @method _deleteText {private}

     * @return 返回被截取的文本

     */

    _deleteText: function(text){

        var self = this,

            cfg = self.options,

            typeLen = cfg.type.length;

        var curText = text.substring(0,text.length - typeLen - 1);

        curText += cfg.type;

        // 設置元素的文本

        self.setText(curText);

        // 繼續調用函數進行比較

        self._compareHeight(cfg.lineHeight * cfg.limitLineNumber);

    },

    /*

     * 返回當前dom的高度

     */

    _getTargetHeight: function(){

        var self = this,

            cfg = self.options;

        return $($(cfg.targetCls + "")[0]).height();

    }

});

var defaults = {

    'targetCls'               :     null,                 // 目標要截取的容器

    'limitLineNumber'         :     1,                     // 限制的行數 通過 行數 * 一行的行高 >= 容器的高度

    'type'                    :     '...',                 // 超過了長度 顯示的type 預設為省略號

    'lineHeight'              :     18,                  // dom節點的行高 

    'isShowTitle'             :        true,                // title是否顯示所有的內容 預設為true

    'isCharLimit'             :     false,               // 根據字元的長度來限制 超過顯示省略號

    'maxLength'               :     20                   // 預設為20

};


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在生產環境實現配置文件和war包 的分離,為方便在必要的時候進行一定的更改,可以避免修改包,但是需要重啟 最初為這樣的選擇配置,單不知為何未生效,修改為配置2配置方法,但不靈活,待跟進。配置1: 配置2: <!-- 環境配置和war包分離 以外部配置為準--> 註:order 值越小,優先順序越高 ...
  • 什麼是MVP?在“MVP初探”里就有講過了,就是一種UI的架構模式。 簡單的描述一下Unity和Exception Handling Application Block: Unity是一個輕量級的可擴展的依賴註入(DI)容器,支持構造函數,屬性和方法調用註入。構建一個成功應用程式的關鍵是實現非常鬆散 ...
  • 最近無論是工作還是自我學習提升都很忙,面對長篇大論的博文總是心有餘而力不足,但又不斷的接觸學習到零碎的但是很有意義的知識點,很想分享給大家,所以本篇可能會很短。 本篇接我另一篇講述 CSS 偽元素的文章: 【CSS進階】偽元素的妙用–單標簽之美,看完本文覺得有意思的可以再去看看上一篇,分享了一些偽元 ...
  • 這幾天做的項目要求用樹形表格的形式展示一部分數據,於是就想到了使用easyUI的treegrid組件,但幾經翻查各種資料,發現數據類型大多採取標準數據類型,即包含children元素的數據類型,小編查遍各種資料,幾經實驗,小編找到了一種使用簡單數據類型的展示樹形表格的方法。在這裡介紹給大家,僅供參考 ...
  • W3C盒子模型和IE盒子模型CSS佈局經典盒子模型(轉) 盒子模型是css中一個重要的概念,理解了盒子模型才能更好的排版。其實盒子模型有兩種,分別是 ie 盒子模型和標準 w3c 盒子模型。他們對盒子模型的解釋各不相同,先來看看我們熟知的標準盒子模型: 從上圖可以看到標準 w3c 盒子模型的範圍包括 ...
  • 內聯元素,與別人公用一行,但是設置寬高無效。其特點: ①和其他元素都在一行上; ②高,行高及外邊距和內邊距不可改變; ③寬度就是它的文字或圖片的寬度,不可改變 ④內聯元素只能容納文本或者其他內聯元素 代碼如下: 1 <!doctype html> 2 <html lang="en"> 3 <head ...
  • 塊級元素,簡單來說,就是自己獨占一行的元素。其特點: ①總是在新行上開始; ②高度,行高以及外邊距和內邊距都可控制; ③寬度預設是它的容器的100%,除非設定一個寬度。 ④它可以容納內聯元素和其他塊元素 彙總代碼如下: 1 <!doctype html> 2 <html> 3 <head> 4 <m ...
  • 一、開端 真的是忙完這一陣子就可以忙下一陣子了啊。。。 最近在做一個angularJS+Ionic的移動端項目。。。記錄一些技巧,方便自己以後查閱,也方便需要的人可以看一看...^_^ 二、基礎原則瞭解 ①angular的一些入門瞭解 一、基礎知識 1.angular放棄了IE8 2.四大核心分別是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...