整合營銷服務商

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

          免費咨詢熱線:

          JS代碼實現按住shift鍵完成復選框的區間選中

          文通過js代碼實現了按住鍵盤的SHIFT鍵,通過鼠標點擊網頁復現框實現區間選中的功能,還是比較實用的。 完整的代碼實現例子如下:

          <!DOCTYPE html>

          <html>

          <head>

          <title>測試頁面</title>

          <meta name="content-type" content="text/html; charset=gb2312">

          <script type="text/javascript" src="jquery.js" ></script>

          <script type="text/javascript">

          //選擇全部

          function checkAllItem(obj){

          var box = document.getElementsByName("box");

          for(var index=0;index<box.length;index++){

          if(obj.checked){

          box[index].checked = true;

          }else{

          box[index].checked = false;

          }

          }

          }

          //全局變量

          var shiftKeyDown = false;

          function keyDownHandler(event){

          shiftKeyDown = true;

          }

          function keyUpHandler(event){

          shiftKeyDown = false;

          }

          function selectRow(obj){

          if(shiftKeyDown){

          var checks = $(":checkbox[name='box']");

          var currentIndex = checks.index($(obj)[0]);

          var lastIndex = -1;

          var box = document.getElementsByName("box");

          for(var index=0;index<box.length;index++){

          if(box[index].checked){

          if(index!=currentIndex){

          lastIndex = index;

          if(index < currentIndex)

          break;

          }

          }

          }

          if(lastIndex ==-1){

          return ;

          }

          if(lastIndex < currentIndex){

          for(var i=lastIndex;i<=currentIndex;i++){

          if(obj.checked){

          box[i].checked = true;

          }else{

          box[i].checked = false;

          }

          }

          }else{

          for(var i=currentIndex;i<=lastIndex;i++){

          if(obj.checked){

          box[i].checked = true;

          }else{

          box[i].checked = false;

          }

          }

          }

          }

          }

          </script>

          </head>

          <body onkeydown="keyDownHandler(event)" onkeyup="keyUpHandler(event);">

          <h3>javascript代碼實現按住shift鍵完成復選框的區間選中</h3>

          <table style="width: 60%;" border="1">

          <tr>

          <td style="width: 10%" ><input type="checkbox" name="allBox" onclick="checkAllItem(this);"/>全選 </td>

          <td>列1</td><td>列2</td></tr><tr>

          <td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          <tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          <tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          <tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr><tr>

          <td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          <tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          <tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          <tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          <tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          <tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          <tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          <tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          <tr><td><input type="checkbox" name="box" onclick="selectRow(this);"/></td>

          <td>Cell</td><td>Cell</td></tr>

          </table>

          </body>

          </html>


          家好,不知道你們是否和我一樣存在這樣的困惑呢,雖然css入門容易,但是其內容太多,好多屬性看了似是而非,覺得自己看懂了,到自己用的時候又很犯難了,看到漂亮的效果還是無從下手,這主要還是自己對新屬性實踐太少了,不能進行靈活應用,CSS總讓一些人找不到感覺。其實學好CSS真的沒有太多捷徑,和JS編程一樣,要重視對待,要多看和多練,因為現在的CSS不再是以前的CSS啦。

          比如這兩本書《 CSS 權威指南第四版》,1000多頁,買了好幾個月我到現在還沒看完,文字實在太枯燥了,看完了忘,忘了繼續看,實在看不下去,不知道大家有沒有同樣的感受呢?

          好了,廢話不多說,今天我們要做的一個案例就是做一個常見的例子:在不少網站右側都有一個固定浮動的留言圖標,我們點擊這個圖標,就會側滑顯示留言內容面板。你也許會說這個不簡單嗎,使用JQ就能輕松實現,但是我想說的,為了網站的性能,能用CSS實現的盡量不要用JS,因為現在CSS已足夠強大。

          今天這個例子,我們將使用純CSS實現這個效果,這里我們將用到” CSS checkbox hack“的技術,效果如下圖所示:


          一、創建 HTML 結構

          基于上面的效果圖,我們要創建三個元素,一個 checkbox 元素以及對應的 label 標記,和一個表單面板元素。

          這里用到了一個 CSS 特性值得大家關注下:<label> 標簽的 for 屬性用于指定與哪個表單元素進行關聯,擴大表單元素的點擊區域,我們點擊 label 元素標記,其對應的表單元素將會被聚焦選中。

          這個特性是我們實現這個案例的技巧之一,再結合 CSS checkbox 的偽類選擇器進行留言面板的顯示與隱藏,這樣我們就可以擺脫 JS 來實現這個案例。

          基于以上思路 ,我們開始動手吧,首先我們先放置 checkbox,和其對應的 label,最后添加表單面板和相關的表單元素。

          我們將通過表單的 id 屬性與表單中label元素的 for 值與其關聯,最終我們完成了 HTML 結構如下段代碼所示:

          <input type="checkbox" id="mycheckbox">
          <label for="mycheckbox" class="feedback-label">FEEDBACK</label>
          <form class="form">
            <div>
              <label for="fullname">Full Name</label>
              <input type="text" id="fullname">
            </div>
            <div>
              <label for="email">Email</label>
              <input type="email" id="email">
            </div>
            <div>
              <label for="comment">Comment</label>
              <textarea id="comment"></textarea>
            </div>
            <div>
              <button type="submit">Send</button>
            </div>
          </form>
          

          完成后的效果圖如下:

          二、定義基礎的樣式

          現在我們開始添加一些基礎的CSS的式,這里我們用到了CSS自定義變量,方便我們全局修改,還有一些 reset 規則,和表單的基礎規則樣式,示例代碼如下:

          :root {
            --white: white;
            --gradient: linear-gradient(-45deg, #FFA600 0%, #FF5E03 50%);
            --form: #eeefef;
            --border-radius: 4px;
            --form-width: 500px;
            --form-mob-width: 320px;
          }
           
          * {
            padding: 0;
            margin: 0;
            box-sizing: border-box;
          }
          
          body {
            font: 20px/1.5 sans-serif;
            background: var(--white);
          }
          
          h1 {
            font-size: 2rem;
            text-align: center;
            margin-top: 20vh;
          }
           
          button,
          label {
            cursor: pointer;
          }
           
          label {
            display: block;
          }
           
          button,
          input,
          textarea {
            font-family: inherit;
            font-size: 100%;
            border: none;
          }
           
          textarea {
            resize: none;
          }
          

          三、 定義表單元素相關樣式

          1、由于 checkbox 這個元素在案例中無需顯示,我們只是用其的偽類特性結合 label 控制留言面板的顯示與隱藏,因此我們需要將其移出可視區域,記住這里不能用隱藏屬性(display:none)。示例代碼如下:

          [type="checkbox"] {
            position: absolute;
            left: -9999px;
          }
          

          2、接下來,我們需要添加這些CSS操作:

          • 使用 fix 屬性將 checkbox 對應的 label 標簽元素固定在右側的中央。
          • 垂直先顯示”FEEDBACK“文本。
          • 隱藏表單面板,我們這里將其往右移動其寬度的 100% 的距離,并垂直居中。

          對應的CSS代碼如下:

          /*CUSTOM VARIABLES HERE*/
          .feedback-label,
          .form {
            position: fixed;
            top: 50%;
            right: 0;
          }
           
          .feedback-label {
            transform-origin: top right;
            transform: rotate(-90deg) translate(50%, -100%);
            z-index: 2;
          }
           
          .form {
            width: var(--form-width);
            max-height: 90vh;
            transform: translate(100%, -50%);
            padding: 30px;
            overflow: auto;
            background: var(--form);
            z-index: 1;
          }
          

          小提示:

          1、這里需要強調的是 feedback-label 樣式,在其垂直變換時,我們先逆時針進行了旋轉,其 x ,y 軸的方向也是隨著旋轉的,所以是translate(50%, -100%),將其垂直居中。

          2、在 form 樣式里,我們使用 transform 方法,translate(100%, -50%) 將其移出頁面顯示區域

          3、我們繼續,大家不要著急,馬上就快完成了,我們需要將頁面弄的漂亮些,添加一些樣式,示例代碼如下:

          /*CUSTOM VARIABLES HERE*/
           
          .feedback-label,
          .form input,
          .form textarea,
          .form button {
            border-radius: var(--border-radius);
          }
           
          .feedback-label,
          .form button {
            background: var(--gradient);
            color: var(--white);
          }
           
          .feedback-label:hover,
          .form button:hover {
            filter: hue-rotate(-45deg);
          }
           
          .feedback-label {
            padding: 5px 10px;
            border-radius: var(--border-radius) var(--border-radius) 0 0;
          }
           
          form div:not(:last-child) {
            margin-bottom: 20px;
          }
           
          form div:last-child {
            text-align: right;
          }
           
          .form input,
          .form textarea {
            padding: 0 5px;
            width: 100%;
          }
           
          .form button {
            padding: 10px 20px;
            width: 50%;
            max-width: 120px;
          }
           
          .form input {
            height: 40px;
          }
           
          .form textarea {
            height: 220px;
          }
          

          小提示:這里我們的背景色用到了 linear-gradient() 線性漸變,實現了一個漂亮的顏色漸變背景。還有一個 CSS3 語法需要關注下:hue-rotate,色調旋轉濾鏡,方便我們改變當前的顏色。

          四、使用CSS選擇器,實現表單面板的切換和隱藏

          我們通過點擊 checkbox 對應的 label 標簽進行切換和顯示留言面板,這里我們用到了 :checked 偽類,以及 ~(后續同胞選擇器)和 +(緊鄰同胞選擇器),輔助元素的選擇進行樣式變換,示例代碼如下:

          [type="checkbox"]:checked + .feedback-label {
            transform: rotate(-90deg) translate(50%, calc((var(--form-width) + 100%) * -1));
          }
           
          [type="checkbox"]:focus + .feedback-label {
            outline: 2px solid rgb(77, 144, 254);
          }
           
          [type="checkbox"]:checked ~ .form {
            transform: translate(0, -50%);
          }
           
          .feedback-label,
          .form {
            transition: all 0.35s ease-in-out;
          }
          

          這里有幾個樣式規則我們需要聊一下:

          1. translate(50%, calc((var(--form-width) + 100%) * -1)); 這個樣式是不是有些復雜,其實也不難,就是多加了一個表單面板的寬度,由于旋轉后,y軸變成了水平軸,向左移動相當Y軸往上移動,因此是負值,需要乘-1。
          2. 第二個選擇器,我們之所以加個選中后的 outline 輪廓屬性,主要是為了方便那些習慣鍵盤操作的用戶,當其使用 Tab 鍵選擇 feedback label元素時,然后再使用 Space 空格鍵就能很方便的打開留言面板進行切換。
          3. 第三個選擇器,我們使用 transform: translate(0, -50%); 將 X 軸更改成0,恢復成最開始的位置,這樣我們的留言面板內容就能顯示出來。

          處理響應式問題

          最后,特別重點提示下我們做頁面要考慮頁面響應式適配的問題,這里我們需要針對手機設備做一些樣式的調整,比如更改表單面板的寬度由原來的 500px 調整到 320px,以及初始字體的大小,調整成16px。

          最終添加的響應式代碼如下:

          /*CUSTOM VARIABLES HERE*/
           
          @media screen and (max-width: 600px) {
            body {
              font-size: 16px;
            }
           
            .form {
              padding: 15px;
              width: var(--form-mob-width);
            }
           
            form div:not(:last-child) {
              margin-bottom: 10px;
            }
           
            [type="checkbox"]:checked + .feedback-label {
              transform: rotate(-90deg) translate(50%, calc((var(--form-mob-width) + 100%) * -1));
            }
          }
          

          小節

          好了,到這里,我們的案例就全部完成了,你可以欣賞下自己完成的杰作啦,實現起來是不是很簡單呢,最后我還是建議大家還是親自動手實踐一遍,這樣才能加深對本案例用到的CSS屬性的理解。

          最終完成的效果,大家可以點擊以下網址進行在線體驗:

          https://www.qianduandaren.com/demo/feedback/

          今天的內容就和大家分享到這里,感謝你的閱讀,如果你喜歡我的分享,麻煩給個關注、點贊加轉發哦,你的支持,就是我分享的動力,后續會持續分享 CSS 常用案例和技巧,歡迎持續關注。

          延伸閱讀

          基礎章節:這30個CSS選擇器,你必須熟記(上)

          基礎章節:這30個CSS選擇器,你必須熟記(中)

          基礎章節:這30個CSS選擇器,你必須熟記(下)

          使用 CSS Checkbox Hack 技術制作一個手風琴組件

          計思路:利用復選框的是否選中來控制側邊欄的顯示與隱藏

          主要知識點:label標簽 、

          .class:checked偽類 、

          "+" 選擇器

          實現步驟:

          1.完成網頁的整體布局

          html:

          <div class="wrap">
           <header class="header">
           <span><img src="./bars.svg" alt="導航欄"></span>
           <span>小白開始學前端</span>
           </header>
           <aside class="navbar">
           <p>側邊欄</p>
           </aside>
           <article class="main">
           <<p>主要內容</p>
           </article>
           <footer class="footer">
           底部
           </footer>
          </div>
          

          css:

          *{
           margin: 0;padding: 0;box-sizing: border-box;
          }
          .wrap{
           width: 100vw;width: 100%;height: 100vh;position: relative;padding: 60px 0;
          }
          .wrap .header{
           width: 100vw;width: 100%;height: 60px;position: fixed;top: 0;background-color: #000; padding:0 10px;color: #fff;
           /* 布局 */
           display: flex;flex-flow: row nowrap; justify-content: space-between;align-items: center;
          }
          .wrap .header *{
           display: inline-block;height: 40px;line-height: 40px;
          }
          .header img{
           max-height: 100%;display: block;cursor: pointer;
          }
          .wrap .navbar{
           width: 100vw;width: 100%;height: calc(100% - 60px);position: absolute;z-index: 999;background-color: rgba(213, 204, 204, 0.92);
          }
          .wrap .navbar::after{
           position: absolute;content: "";display: inline-block; z-index:-1;width: 90vw;height: 100%;background-color: #fff;top:0;
          }
          .wrap .footer{
           width: 100vw;width: 100%;height: 60px;position: fixed;bottom: 0;background-color: #000;
          }
          

          效果圖:

          2.將側邊欄隱藏

          設置側邊欄 display:none或者是visibility:hidden;

          .wrap .navbar{
           display: none; //將側邊欄隱藏
           width: 100vw;
           width: 100%;
           height: calc(100% - 60px);
           position: absolute;
           z-index: 999; //將側邊欄的層級設置為最頂層
           background-color: rgba(213, 204, 204, 0.92);}
          

          或者是

          .wrap .navbar{
           visibility: hidden;
           position: absolute;
           z-index: -999; //將側邊欄的層級設置為最底層
           width: 100vw;
           width: 100%;
           height: calc(100% - 60px);
           background-color: rgba(213, 204, 204, 0.92);
          } 
          

          效果圖:

          3.利用復選框實現側邊欄的顯示

          到這里我們已經完成了網頁的整體布局

          為了實現復選框操縱側邊欄的顯示,我們要對第一步驟中的html代碼進行小小的修改

          在網頁中添加復選框按鈕

          將span標簽替換成label標簽,添加input標簽

          效果圖

          接下來我們對復選框進行設置,隱藏復選框

          #controller{
           position: absolute;
           z-index: -999;
           opacity: 0;/*visibility: hidden; */
          }
          

          效果圖:

          下一步就是實現單擊復選框操控側邊欄的顯示與隱藏

          我們在css中添加以下代碼

          #controller:checked + .navbar{
           display: block;
          }
          

          這樣就可以實現側邊欄的顯示與隱藏

          接下來,為側邊欄添加過渡效果

          側邊欄過渡效果

          到這里,利用復選框操控側邊欄就已經制作完成了。

          第一次寫,可能有寫得不好地方。


          主站蜘蛛池模板: 精品一区中文字幕| 一区二区三区无码高清视频| 亚洲欧美成人一区二区三区| 亚洲欧洲一区二区三区| 人妻无码一区二区三区免费| 一区二区三区杨幂在线观看| 中文字幕AV无码一区二区三区| 亚洲国产激情一区二区三区 | 尤物精品视频一区二区三区| 国精产品一区二区三区糖心| 日本一区二区三区中文字幕| 成人精品视频一区二区三区尤物| 91久久精品无码一区二区毛片| 亚洲色婷婷一区二区三区| 好爽毛片一区二区三区四| 波多野结衣在线观看一区| 久久久久久人妻一区二区三区| 亚洲一区精品视频在线| 久久无码AV一区二区三区| 熟女精品视频一区二区三区| 中文字幕无线码一区| 国产精品视频一区二区三区不卡| 国产91精品一区| 冲田杏梨高清无一区二区| 国产精品无码一区二区三区在| 久久久国产精品无码一区二区三区 | 亚洲精品日韩一区二区小说| 国产精品一级香蕉一区| 国产精品乱码一区二区三区| 国产成人一区二区精品非洲| 国产一区二区三区亚洲综合 | 狠狠色婷婷久久一区二区| 91亚洲一区二区在线观看不卡| 国产a∨精品一区二区三区不卡 | 狠狠综合久久av一区二区| 国产香蕉一区二区三区在线视频| 国产91精品一区二区麻豆亚洲| 一区二区视频在线| 国产成人无码AV一区二区在线观看| 麻豆国产一区二区在线观看| 国产一区二区三区小说|