✍️
cssadvand
  • [BEM] Exploring SMACSS: Scalable and Modular Architecture for CSS
  • 😀CSS-only infinite scrolling carousel animation (ok)
  • css carousel
  • 🤡 Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 1)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 2)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 3)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 4)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 5)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 6)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 7)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 8)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 9)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 10)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 11)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 12) [Phần đặc biệt]
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 13)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 14)
  • 😘Thuộc tính tabindex="-1" không ngờ lại nguy hiểm vậy đọc bài dưới 😌
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 15)
  • 🥸CSS tạo theme cho dark mode đọc bài (Phần 16)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 16)
  • Mẹo để optimize Google Fonts API mà ít dev để ý đọc (Phần 17)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 17)
  • Thật may nhờ có white-space: pre-line đọc (Phần 18)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 18)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 19)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 20)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 21)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 22)
  • Thuộc tính image-rendering nhờ bài (Phần 23) mà phát hiện ra cách làm bức ảnh mờ trở nên rõ nét
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 23)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết 🤡
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 24)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 25)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 26)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 27)
  • 😘mix-blend-mode pha trộn giữa 1 đối tượng với đối tượng bên dưới đó (Phần 28)
    • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 28)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 29)
  • 🥸aspect-ratio (Phần 30)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 30)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 31)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 32)
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 33)
  • 😘CSS Scroll Triggered Animations Full (ok)
  • 🥹Difference between animation and transition in CSS
  • 😄animation-timeline có phải nó làm việc với thanh cuộn (ok)
  • 😍Từ bài animation-timeline làm việc với thanh cuộn tìm ra cách sử dụng background-clip: text;
  • background-clip: text;
  • 😅Sử dụng list-style-type để tạo icon đẹp (ok)
  • 😁Convert css to scss good (ok)
  • 😁CSS - Hướng dẫn: Tạo ảnh động với hàm steps()
  • 😆Multiple image cross fading in CSS - without (java) khá đẹp script (ok)
  • 😇Function css full 🤩
  • 😅[SVG] SVG viewBox Attribute (ok)
  • 😅Tailwind CSS (ok)
  • 😍Thật không thể tin được sử dụng filter: brightness(0) invert(1); để chuyển màu ảnh 🤣
  • 😅Background text matter.vn (ok)
  • 😆Chọn màu, color, color contrast ratio (ok)
  • 😁Tổng hợp Animating SVG text cực đẹp (ok)
  • 😂Chuyển động tròn :(
  • 😆MOVE-BG mepop.vn (ok)
  • 😆Counter Increment list, number xuongkhopbacninh.com (ok)
  • Boxes That Fill Height, full Height(Or More) (and Don’t Squish) (ok)
  • Equal Height (chiều cao bằng nhau) (oK)
  • 😅Sử dụng nodejs và scss cấu trúc thư mục tốt P.1(ok)
  • 🥲Sử dụng nodejs và js cấu trúc thư mục tốt P.2 (ok)
  • === START STUDY P.1 && P.2 SỬ DỤNG NODEJS VÀ CẤU TRÚC ===
  • 😉1 Giao diện sử dụng thuộc tính data-coreui-toggle="dropdown" (ok)
  • === END STUDY P.1 && P.2 SỬ DỤNG NODEJS VÀ CẤU TRÚC ===
  • 😆Css box-shadow đẹp (ok)
  • === START Tutorials Classical BEM stack ===
  • 😀HTML with BEM (ok)
  • 😀CSS with BEM (ok)
  • === END Tutorials Classical BEM stack ===
  • === START SMACSS ===
  • Categorizing CSS Rules
  • Base Rules
  • Layout Rules
  • Module Rules
  • State Rules
  • Theme Rules
  • Changing State
  • === END SMACSS ===
  • All CSS Grid Properties (ok)
  • 😇Column Grid full example(Responsive)
  • === Start Điều quan trọng nhất cách chia cột và thay đổi vị trí ===
  • CSS Grid căn bản - Phần 1
  • CSS Grid căn bản - Phần 2
  • CSS Grid: Holy Grail Layout
  • Sử dụng CSS Grid để xây dựng web layout
  • Luyện tập CSS Grid qua bài tập tạo layout Airbnb, youtube, Pinterest
  • === End Điều quan trọng nhất cách chia cột và thay đổi vị trí ===
  • Overflow:hidden dots at the end full (ok)
  • Gulp để viết Sass && cai dat
  • Cách nhúng font vào svg (ok)
  • font-face Hướng dẫn conver font và nhúng sử dụng online (ok)
  • 😇Create CSS Animations on Scroll (ok)
  • Hiệu ứng hover bằng js hiện phần description (ok)
  • Text Link on Hover phần 1 (ok)
  • Kết hợp transition & transform-origin phần 2 (ok)
  • Text Hover Phần 3 (ok)
  • Social Media Icons hover effect (ok)
  • css rotate a pseudo :after or :before content:""
  • Hiệu ứng ảnh tự zoom, animation, scale phần 1 full (ok)
  • CodePen Home Image zoom on hover - auto run - view (ok)
  • scroll-padding (ok)
  • Tạo vòm giống styleathome (ok)
  • Tổng hợp những css đẹp để làm trang trí (ok)
  • Cách thay đổi màu svg full (ok_)
  • Disable Auto Zoom in Input “Text” tag - Safari on iPhone (ok)
  • function calc css (ok)
  • Get the scroll distance from bottom to scroll, var distanceFromBottom (ok) vinmec.com (ok)
  • ---------- Start CSSscan không sử dụng ----------------------
  • Unused CSSscan your website for unused CSS selectors (ok)
  • PurifyCSS OnlineRemove unused CSS code from your stylesheets (ok)
  • Remove unused CSS styles from Bootstrap using PurgeCSS (ok)
  • 😆Thêm column, media bootstrap, custom bootstrap (ok)
  • ---------- End CSSscan không sử dụng ----------------------
  • Xây dựng blog đơn giản (Node + React)
  • Các tham số của Gulp
  • File đã thực hành với Gulp (ok
  • gulp-livereload (chưa đọc)
  • Tối ưu hiệu năng Google Fonts (ok)
  • Học CSS GRID thông qua những layout phức tạp
  • [GRID] sử dụng grid xây dựng layout giống Masonry (ok)
  • PageSpeed Insights Chrome Extension (ok)
  • Tăng tốc website bằng cách cải thiện front-end
  • Code chuẩn SEO là gì
  • 10 CSS3 Animation Tools phổ biến
  • Trang check SEO OKE
  • Làm sao để SEO từ khóa?
  • Kiểm soát web typography với việc hiển thị CSS font (ok)
  • Các mẫu phông chữ hiển thị và thuộc tính hiển thị phông chữ của CSS
  • Một số mẹo tối ưu hóa HTML/CSS/JS đúng chuẩn
  • Web Performance
  • Preload, Prefetch, Preconnect (ok)
  • Tối ưu hóa phần Front end cho trình duyệt (part 1)
  • Tối ưu hóa phần Front end cho trình duyệt (part 2)
  • Sử dụng thuộc tính attr html && css (ok)
  • Disable Auto Zoom in Input “Text” tag - Safari on iPhone (ok)
  • CSS submit button weird rendering on iPad/iPhone submit color (ok)
  • Turn off iPhone/Safari input element rounding (ok)
  • scroll bongda.com.vn (ok)
  • Làm chiếc xe ô tô chuyển động giống 2020.yp.vn (ok)
  • Sự khác biệt giữa :empty và :blank trong CSS (ok)
  • Is there a CSS parent selector? (ok)
Powered by GitBook
On this page
  • Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 15)
  • Tổng kết

Was this helpful?

Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 15)

https://viblo.asia/p/mot-vai-thu-thuat-css-ma-chinh-frontend-co-the-con-chua-biet-phan-15-bWrZnENnKxw

PreviousThuộc tính tabindex="-1" không ngờ lại nguy hiểm vậy đọc bài dưới 😌NextCSS tạo theme cho dark mode đọc bài (Phần 16)

Last updated 7 months ago

Was this helpful?

Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 15)

Bài đăng này đã không được cập nhật trong 4 năm

Hello xin chào mọi người, mình đã trở lại và tiếp tục với phần 15 của series về

Bắt đầu thôi nào!

1. :empty selector giúp xử lý nhiều trường hợp không cần động đến JS

Đây là 1 thuộc tính rất hay mà có lẽ nhiều dev Frontend đã đọc qua, nhưng trường hợp nào để mà nó trở nên hữu dụng thì không gặp thường xuyên và đấy cũng là lý do khiến nhiều dev bỏ quên nó.

Để rồi khi gặp phải những tình huống xử lý giao diện hơi khó chút, lại phải dùng đến JS, mà quên bén đi rằng, trong CSS có :empty selector hoàn toàn có thể xử lý được, mà còn rất là đơn giản nữa!

Không những thế, selector này dễ dàng áp dụng vào rất nhiều dự án, bởi nó đã được support ở hầu hết các trình duyệt phổ biến.

Hãy cùng mình tái hiện 1 tình huống xử lý giao diện sau, để biết :empty làm việc hiệu quả đến như nào nhé!

App của bạn cần tạo ra vùng nhập nội dung cho user (kiểu như ô gõ status của facebook vậy!)

Và cần làm được 2 yêu cầu dưới:

1. Hiển thị chữ "Nhập nội dung ở đây" khi vùng nhập đang trống

2. Vùng nhập đó khi giãn tới 1 độ cao nhất định sẽ xuất hiện thanh scrollbar

Nói đến đây, nhiều dev nghĩ rằng đơn giản dùng textarea thôi mà! Nhưng không đơn giản thế, textarea có rất nhiều giới hạn bởi behavior mặc định của nó.

Bạn cũng thử inspect element khu vực gõ status của facebook lên mà xem, hoàn toàn không có chút textarea nào cả!

Với yêu cầu thứ 1, nếu là textarea thì mình đơn giản sử dụng thuộc tính placeholder ở đây là xong.

Nhưng với yêu cầu thứ 2, nếu là textarea thì buộc phải dùng đến JS thôi!

Vậy thì với chỉ bằng CSS, đây là cách của mình:

  • Tạo 1 div sử dụng thuộc tính contenteditable="true" của HTML5 cung cấp, cho phép user được gõ nội dung vào trong đó.

  • Dùng selector :empty để style CSS cho pseudo element :before thêm đoạn text là "Nhập nội dung ở đây".

  • Và đương nhiên, khi nội dung được nhập vào, chữ "Nhập nội dung ở đây" sẽ biến mất (cách làm như như là đang giả lập hành vi của một textarea vậy).

Bạn hãy xem code và kết quả của demo bên dưới:


<div class="editor" contenteditable="true"></div>
.editor {
   border-radius: 5px;
   border: 2px solid black;
   width: 500px;
   padding: 10px;
   background-color: #fff;
   color: #000;
   max-height: 100px;
   overflow: auto;

   &:empty:before {
      content: "Nhập nội dung ở đây";
      color: #aaa;
   }
   
   // Just style outline when focused   
   &:focus {
      outline: none;
   }
}

// Don't mention it. Just styled for easy to look
body {
   display: flex;
   justify-content: center;
   align-items: flex-start;
   height: 100vh;
   background-color: #eee;
   padding-top: 50px;
}

:empty selector nó sẽ chọn đến những elements nào mà không chứa gì cả hoặc chứa ở trong chỉ là HTML comment các bạn nhé!

Đây sẽ là match

<div></div>

<div><!-- test --></div>

Đây sẽ là không match

<div> </div>

<div>
  <!-- test -->
</div>

<div>
</div>

Không chỉ giải quyết được mỗi tình huống trên, :empty còn có thể được dùng để xử lý nhiều tình huống khác nữa.

Hãy đọc thêm các nguồn tài liệu mà mình đính kèm bên dưới, để biết đâu bạn gặp được tình huống tương tự như trong dự án mình đang làm.

Đọc hiểu thêm

2. Tạo hiệu ứng phủ mờ, một thương hiệu của iOS [Not Cross-Browsers]

Có ai đã hình dung được hiệu ứng này là gì chưa ạ?

Đây được gọi là Blurry các bạn nhé!

Là 1 dev Frontend thì rất có thể một dự án nào đó của khách hàng, họ thích hiệu ứng trên và muốn đưa vào app của họ.

Thật là may mắn khi chính CSS đã cung cấp cho chúng ta 1 thuộc tính làm được điều này, đó là backdrop-filter: blur(...).

Bạn hãy xem code và kết quả của demo bên dưới:


<div class="box-blurry">
  <h1>Hello World!</h1>
</div>

.box-blurry {
   width: 200px;
   height: 300px;
   border-radius: 5px;
   overflow: hidden;
   box-shadow: 0 14px 28px rgba(#000, .25),
    				0 10px 10px rgba(#000, .22);
   background: url(https://picsum.photos/200/300?grayscale) no-repeat 0 0;
   
   h1 {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      color: #000;
      font-size: 20px;
      padding: 30px 20px;
      border-radius: 5px;
      
      // Important  
      background-color: rgba(255, 255, 255, 0.5);
      backdrop-filter: blur(5px);
   }
}







// Just centering
body {
   width: 100vw;
   height: 100vh;
   display: flex;
   flex-direction: column;
   justify-content: center;
   align-items: center;
   background-color: #ddd;
}

Chỉ có 1 điều hơi tiếc chút là nó chỉ đang support 1 số version mới nhất của những trình duyệt như Chrome, Safari và Edge.

Cho nên hãy cân nhắc trước khi sử dụng nó cho dự án của bạn nhé!

Đọc hiểu thêm

3. CSS cũng có thể onClick() được, thật khó tin!

Dựa vào khả năng focusable của các elements trong HTML như button, a, chúng ta dễ dàng làm giả sự kiện click mà không cần đến JS.

Đầu tiên là cần element HTML mà có trang bị hành vi focusable mặc định, mới dễ dàng làm được, bởi vì chúng ta sẽ dùng pseudo classes là :active để dựa vào đấy mà ẩn hiện nội dung nhé mọi người.

Hãy xem code và demo bên dưới (mình đang click toggle đóng mở 1 cái Dropdown Memu chỉ bằng CSS thôi đấy!)


<div class="box">
  <button>☰</button>
  <nav class="menu">
    <ul>
      <li><a href="https://www.google.com/" target="_blank">Google</a></li>
      <li><a href="https://www.facebook.com/" target="_blank">Facebook</a></li>
    </ul>
  </nav>
</div>
.box {
   width: 170px;
   height: 270px;
   background-color: #FFAB40;
   border-radius: 5px;
   padding: 15px;
}

.menu {
   visibility: hidden;
   width: 120px;
   background-color: #fff;
   border-radius: 5px;
   padding: 10px;
}

button + .menu:active,
button:focus + .menu {
    visibility: visible;
}


// Just centering
body {
   width: 100vw;
   height: 100vh;
   display: flex;
   align-items: center;
   justify-content: center;
}

Mặc dù tính chất chỉ áp dụng được cho các element có focusable, nhưng có 1 tip để biến các thành phần khác có thể có đượcfocusable, đó là thêm attribute tabindex="-1" vào.

Hãy xem code và demo bên dưới


<div class="box" tabindex="-1"><img src="https://i.ebayimg.com/images/g/LbAAAOSwtrJbN7N7/s-l300.jpg" alt=""/>
  <nav class="menu">
    <ul>
      <li><a href="https://i.ebayimg.com/images/g/LbAAAOSwtrJbN7N7/s-l300.jpg" target="_blank">Open in new tab</a></li>
      <li><a href="https://i.ebayimg.com/images/g/LbAAAOSwtrJbN7N7/s-l300.jpg" download="pug-cute">Download</a></li>
    </ul>
  </nav>
</div>

.box .menu:active,
.box:focus .menu {
    visibility: visible;
}

// Just style
.box {
   position: relative;
   
   &:focus {
      outline: none;
   }
   
   img {
      border-radius: 5px;
   }
}

.menu {
   visibility: hidden;
   width: 120px;
   background-color: #fff;
   border-radius: 5px;
   padding: 10px;
   position: absolute;
   top: 50%;
   left: 50%;
   transform: translate(-50%, -50%);
}

// Just centering
body {
   width: 100vw;
   height: 100vh;
   display: flex;
   align-items: center;
   justify-content: center;
}

Đọc hiểu thêm

Tổng kết

Hi vọng mọi người sẽ tăng thêm skill CSS với 3 tips trên.

Nếu thấy thích thì Upvote, thấy hay thì Clip bài này của mình nhé! ^^

P/s: Tiêu đề câu view thôi nhé! Anh em Frontend pro rồi đừng chém em ạ!

https://developer.mozilla.org/en-US/docs/Web/CSS/:empty
https://twitter.com/samantha_ming/status/1157782908364451840
https://css-tricks.com/almanac/selectors/e/empty/
https://medium.com/@samanthaming/css-empty-selector-607ac55d4e
https://tympanus.net/codrops/css_reference/empty/
https://css-tricks.com/the-backdrop-filter-css-property/
https://caniuse.com/#feat=css-backdrop-filter
https://twitter.com/eriksen_dk/status/1156848253515816960
https://www.simonewebdesign.it/pure-css-onclick-context-menu/
https://stackoverflow.com/questions/13630229/can-i-have-an-onclick-effect-in-css
Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết