整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          css實現多行文本的展開收起

          css實現多行文本的展開收起

          在我們寫需求時可能會遇到類似于這樣的多行文本展開與收起的場景:

          那么,如何通過純css實現這樣的效果呢?

          實現的難點

          (1)位于多行文本右下角的 展開收起按鈕

          (2)展開和收起兩種狀態的切換。

          (3)文本不超過指定行數時不展示 展開收起按鈕

          一、位于右下角的“展開收起”按鈕

          多行文本截斷

          假設有這樣一個結構:

          <div className="text">
              銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,
          </div>

          多行文本超出省略,主要用到用到 line-clamp,關鍵樣式如下:

          .text {
              display:-webkit-box;
              -webkit-line-clamp:2;
              -webkit-box-orient:vertical;
              overflow:hidden;
          }

          右下角環繞效果

          下面放一個按鈕,然后設置浮動,可以使文本環繞按鈕,在通過一個 margin-top 可以使按鈕移動到右下角

          <div className="text">
              <button className="btn">展開</button>
              銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀
          </div>
          <style>
          .btn{
              float:right;
              margin-top:50px;
          }
          </style>

          可以看到,雖然按鈕到了右下角,但是文本卻沒有環繞按鈕上方的空間,空出了一大截

          此時我們可以通過多個浮動元素進行調整,這里用偽元素 ::before 來代替

          <style>
          .text:before{
              content:'';
              float:right;
              width:10px;
              height:58px;/*先隨便設置一個高度*/
              background:red
          }
          </style>

          通過清除浮動使偽元素位于按鈕的上方

          <style>
          .btn{
              float:right;
              clear:both;
          }
          </style>

          可以看到,現在文本是完全環繞在右側的兩個浮動元素了,只要把紅色背景的偽元素寬度設置為0(或者不設置寬度,默認就是 0),就實現了右下角環繞的效果

          <style>
          .text:before{
              content:'';
              float:right;
              width:0;/*設置為0,或者不設置寬度*/
              height: 50px;/*先隨便設置一個高度*/
          }
          </style>

          動態高度

          上面雖然完成了右下加環繞,但是高度是固定的,如何動態設置呢?

          這里可以用到 calc 計算,用整個容器高度減去按鈕的高度即可,如下:

          <style>
          .text:before{
              content:'';
              float:right;
              width:0;/*設置為0,或者不設置寬度*/
              height: calc(100% - 24px);/*先隨便設置一個高度*/
          }
          </style>

          很可惜,好像并沒有什么效果,打開控制臺看看,結果發現 calc(100% - 24px) 計算高度為 0

          原因就是高度 100% 失效的問題,關于這類問題網上的分析有很多

          通常的解決方式是給父級指定一個高度,但是這里的高度是動態變化的,而且還有展開狀態,高度更是不可預知,所以設置高度不可取。

          除此之外,其實還有另一種方式,那就是利用 flex 布局

          因此,這里需要給 .text 包裹一層,然后設置 display: flex

          <div className="wrap">
              <div className="text">
                  <button className="btn">展開</button>
                  銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀
              </div>
          </div>
          <style>
          .wrap{
              display :flex;
          }
          </style>

          這樣下來,剛才的計算高度就生效了,改變文本的行數,同樣位于右下角

          二、“展開”和“收起”兩種狀態

          CSS 狀態切換,需要用到 input type="checkbox"

          我們首先加一個 input,然后把之前的 button 換成 label ,并且通過 for 屬性關聯起來。

          注意!在 jsx 語法中 for 屬性要寫成 htmlFor

          <div className="wrap">
              <input type="checkbox" id="exp">
              <div className="text">
                  <label className="btn" htmlFor="exp">展開</label>
                  銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀,銀泰百貨,銀
              </div>
          </div>

          這樣,在點擊 label 的時候,實際上是點擊了 input 元素

          現在來添加兩種狀態,分別是只顯示 2 行和不做行數限制

          <style>
          .exp:checked+.text{
              -webkit-line-clamp: 999; /* 設置一個足夠大的行數即可 */
          }
          </style>

          兼容版本可以直接設置最大高度 max-height 為一個較大的值,或者直接設置為 none

          <style>
          .exp:checked+.text{
              max-height:none;
          }
          </style>

          展開 按鈕在點擊后應該變成 收起 ,使用 偽類 content 生成技術

          具體做法就是去除或者隱藏按鈕里面的文字,采用偽元素生成

          <label class="btn" for="exp"></label> <!-- 去除按鈕文字 -->
          
          <style>
          .btn::after{
              content:"展開"; /* 采用content 生成 */
          }
          </style>

          添加 .checked 狀態

          <style>
          .exp:checked+.text .btn::after{
              content:"收起";
          }
          </style>

          三、文本行數的判斷

          當文本較少時,此時是沒有發生截斷,需要隱藏展開按鈕,CSS 是沒有這類邏輯判斷

          大多數我們都需要從別的角度,采用 “障眼法” 來實現

          在文本末尾添加一個元素,為了不影響原有布局,這里設置了絕對定位,這里用 .text::after 偽元素來代替

          把剛才這個元素設置一個足夠大的尺寸,比如 100% * 100%

          <style>
          .text::after{
              content: ' ';
              width:100%;
              height:100%;
              position: absolute;
              background: #fff;
          }
          </style>

          那么如果此時文本沒有截斷,這個元素會把按鈕覆蓋掉,如果有截斷,這個元素會往下移,就不會覆蓋按鈕

          點擊展開后按鈕丟失,無法收起

          此時,我們可以添加一下:checked狀態即可,在展開時隱藏覆蓋層

          <style>
          .exp:checked+.text::after{
              visibility:hidden;
          }
          </style>

          這樣,就實現了在文字較少的情況下隱藏展開按鈕的功能

          SS圓形展開菜單。

          ·1.設置開關狀態為checked時子菜單的展開收縮動畫。

          ·2.設置開關狀態為checked時子菜單的展開收縮動畫。

          ·3.設置開關狀態為checked時子菜單的展開收縮動畫。

          ·4.重置開關細節樣式。

          ·5.添加子菜單的詳細樣式。

          ·6.設置開關狀態為checked時子菜單的展開收縮動畫。

          ·7.設置開關狀態為checked時子菜單的展開收縮動畫。

          在的移動端頁面中,很多網站都用到了側邊切換菜單欄功能,針對于該功能, 利用CSS3的知識,寫了一個實現側滑的效果。

          效果展示如下:

          HTML:首先寫好側邊的布局。然后不是側邊的內容塊最好用一個內容塊包圍住。

          CSS樣式

          給側邊菜單定位,起始位置為left:-50%,當點擊菜單的展開按鈕,側邊菜單就加上open類目,讓left:值為0,即展開切換。同理。main也一樣。

          JQ代碼

          當點擊菜單展開按鈕 定義類名為 f-lei,側邊菜單切換添加刪除類open, 主內容切換添加刪除類show。當側邊展開時,點擊展開的剩余背景能收縮展開的菜單欄。


          主站蜘蛛池模板: 精品一区二区91| 日本一区中文字幕日本一二三区视频| 亚洲图片一区二区| 国产对白精品刺激一区二区 | 久久无码人妻一区二区三区午夜| 任你躁国产自任一区二区三区| 国产一区在线视频观看| 亚洲国产视频一区| 日韩一区二区在线观看视频 | 在线精品亚洲一区二区| 中文字幕色AV一区二区三区| 亚洲国产专区一区| 精品福利一区3d动漫| 国产亚洲综合一区二区三区 | 国产一区二区三区在线免费| 日本高清一区二区三区| 亚洲色偷偷偷网站色偷一区| 亚洲狠狠久久综合一区77777| 日韩人妻无码一区二区三区 | 日韩精品无码一区二区三区不卡| 国产成人一区二区三区视频免费| 国产亚洲自拍一区| 亚洲熟妇av一区二区三区| 国产成人无码一区二区在线观看| 99久久精品国产免看国产一区| 无码毛片一区二区三区视频免费播放| 国产精品一区二区资源| 国产一区二区三区精品久久呦| 无码丰满熟妇浪潮一区二区AV| 国产精品视频一区国模私拍| 麻豆国产在线不卡一区二区| 美女视频一区二区| 一区二区免费国产在线观看| 一区二区在线免费视频| 波多野结衣一区二区三区aV高清| 国产视频一区在线观看| 亚洲一区二区免费视频| 欧美成人aaa片一区国产精品| 国产一区韩国女主播| 成人免费av一区二区三区| 天堂国产一区二区三区|