動手練一練,用純 CSS 製做一款側滑顯示留言面板的網頁組件

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

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

好了,廢話很少說,今天咱們要作的一個案例就是作一個常見的例子:在很多網站右側都有一個固定浮動的留言圖標,咱們點擊這個圖標,就會側滑顯示留言內容面板。你也許會說這個不簡單嗎,使用JQ就能輕鬆實現,可是我想說的,爲了網站的性能,能用CSS實現的儘可能不要用JS,由於如今CSS已足夠強大。編程

今天這個例子,咱們將使用純CSS實現這個效果,這裏咱們將用到」 CSS checkbox hack「的技術,效果以下圖所示:bash

1、建立 HTML 結構

基於上面的效果圖,咱們要建立三個元素,一個 checkbox 元素以及對應的 label 標記,和一個表單面板元素。微信

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

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

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

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

<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>複製代碼

完成後的效果圖以下:spa

2、定義基礎的樣式

如今咱們開始添加一些基礎的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;
}複製代碼

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

一、因爲 checkbox 這個元素在案例中無需顯示,咱們只是用其的僞類特性結合 label 控制留言面板的顯示與隱藏,所以咱們須要將其移出可視區域,記住這裏不能用隱藏屬性(display:none)。示例代碼以下:

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

二、接下來,咱們須要添加這些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;
}複製代碼

小提示: 一、這裏須要強調的是 feedback-label 樣式,在其垂直變換時,咱們先逆時針進行了旋轉,其 x ,y 軸的方向也是隨着旋轉的,因此是translate(50%, -100%),將其垂直居中。 

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

三、咱們繼續,你們不要着急,立刻就快完成了,咱們須要將頁面弄的漂亮些,添加一些樣式,示例代碼以下:

/*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,色調旋轉濾鏡,方便咱們改變當前的顏色。

4、使用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,恢復成最開始的位置,這樣咱們的留言面板內容就能顯示出來。

5、處理響應式問題

最後,特別重點提示下咱們作頁面要考慮頁面響應式適配的問題,這裏咱們須要針對手機設備作一些樣式的調整,好比更改表單面板的寬度由原來的 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));
  }
}複製代碼

6、小節

好了,到這裏,咱們的案例就所有完成了,你能夠欣賞下本身完成的傑做啦,實現起來是否是很簡單呢,最後我仍是建議你們仍是親自動手實踐一遍,這樣才能加深對本案例用到的CSS屬性的理解。

最終完成的效果,你們能夠點擊如下網址進行在線體驗:

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

今天的內容就和你們分享到這裏,感謝你的閱讀,若是你喜歡個人分享,麻煩給個關注、點贊加轉發哦,你的支持,就是我分享的動力,後續會持續分享 CSS 經常使用案例和技巧,歡迎持續關注。

更多精彩內容,請微信關注「前端達人」公衆號

相關文章
相關標籤/搜索