Sau css con cuối cùng

Sau phần 2 của series hướng dẫn cắt PSD sang HTML toàn tập mình đã drop một thời gian vì bận viết các bài khác nhau nên hôm nay quay lại để tiếp tục cho các bạn với mục tiêu trong tháng 12 là xong series hướng dẫn cắt PSD

hôm nay sẽ là phần 3 nối tiếp các phần trước thì chúng ta đã hoàn thành phần Header và Menu. Tiếp đến bây giờ là phần Tính năng với cấu trúc bố cục khá phức tạp hơn một chút. The you can see before

Sau css con cuối cùng

Ồ. Cái trên thì chắc dễ rồi còn ba phần bên dưới thì sao nhỉ, tạo cấu trúc HTML sao cho đúng, đặt tên lớp sao cho chuẩn BEM, dễ dàng tái sử dụng, mã tối ưu và quan trọng là hiển thị đúng như vậy với Design. Thôi thì không dài dòng nữa chúng ta cùng phân tích và làm nhé

Nếu bạn nào chưa đọc các bài trước thì nhớ nhấn vào đây để đọc lại nhé vì mình có link tới source code để các bạn có thể tải về làm theo đó. Nếu các bạn không đọc hai phần trước mà bay vô phần này thì luôn là tẩu hỏa nhập ma đấy

# Tiêu đề tính năng

Sau css con cuối cùng

Rồi nhìn vào phần Feature Header, ta thấy có ba phần chính đó là một tấm hình nhỏ, một tiêu đề và một đoạn văn bản đơn giản

Sau khi sử dụng các công cụ của Photoshop để lấy các thông số như kích thước chữ, khoảng cách… thì mình đã có các công cụ số có thể như kích thước của tiêu đề và chữ đều là 18px, màu nền của khối là màu xám mờ.

Lưu ý các thông số như khoảng cách, cỡ chữ, màu sắc các bạn nên tự làm bằng cách sử dụng công cụ có sẵn của Photoshop nhé. Trong vi bài này mình chỉ nói sơ thôi vì cụ thể từng bước rất là dài và tốn kém thời gian

Giờ mình tạo cấu trúc HTML đơn giản cho nó như sau

<div class="feature">
 <div class="feature__header">
  <img src="images/icon1.png" alt="" class="feature__img-top">
  <h2 class="feature__heading">A NEW GENERATION OF VINTAGE BIKE</h2>
  <p class="feature__header-desc">Lorem Ipsum simply dummy text.. </p>
 </div>
</div>

Mình đặt tên theo chuẩn BEM đã nói ở các bài trước để code nó clean hơn. Nhiều bạn sẽ hỏi tại sao không đặt thẻ
.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}
5 class is
.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}
6 or is thẻ
.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}
7 class is
.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}
8

Là vì ​​tẹo nữa chúng ta sẽ sử dụng lại chúng trong phần Danh sách tính năng bên dưới cho nên mình đặt tên theo kiểu đó để có thể sử dụng lại sau này

Save the task set name. Các bạn có thể đặt tên theo kiểu của mình để học hỏi hoặc có thể đặt theo phong cách riêng của các bạn nhé. Miễn sao các bạn thấy ổn là được rồi nhé

Cuối cùng dựa vào các thông số mình đã lấy được từ Photoshop chúng ta có CSS ​​như sau

.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}

Sau css con cuối cùng

Chúng ta sẽ có kết quả như mong đợi. Như vậy là xong phần Feature Header nha các bạn. Tiếp theo sẽ là phần khó nắm bắt bên dưới

# Danh sách tính năng

Sau css con cuối cùng

Nhìn vào hình thì tổng thể ta có block1 và block2 giống nhau nhưng ngược hướng ta có thể dùng CSS flexbox kèm thuộc tính

.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}
9 để thay đổi vị trí vì thế chỉ cần code cái block1 thì cái block2 coi như xong. Cấu trúc block1 và block2 có tỷ lệ là 2/3 và 1/3 tương ứng với 67% và 33%

Còn block3 thì cấu trúc của nó có tới ba cột. Nhìn có cảm giác bằng nhau nhưng sau khi đo thì mình thấy cột thứ hai to hơn hai cột còn lại một chút xíu thôi cho nên nếu chia %ra thì ta sẽ có ba cột tương ứng là cột1(33%) cột 2(34)

Bây giờ là đến phần code HTML cho chúng ta. Mình dùng lại HTML ở phần Feature Header ở trên luôn cho các bạn dễ hình dung và thêm thẻ

<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
0 để làm cái Feature List này

<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>

Mình sử dụng 
<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
1 để làm dạng danh sách vì mình có tới ba phần tử cũng như có thể chọn các phần tử dễ dàng bằng cách sử dụng
<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
2
<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
3…. để thuận tiện cho việc tùy chỉnh mã một cách trơn tru

# Mục tính năng

Lưu ý những đoạn mã dưới đây nằm trong thẻ ul có lớp

<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
4 ở đoạn mã trên nhé

Sau css con cuối cùng

Dựa vào hình ta thấy block1 có hai phần đó là phần hình ảnh bên trái và phần nội dung bên phải và chiều cao của block1 là 600px. Tỷ lệ đã nói ở trên là 67% và 33% và chúng tôi sẽ sử dụng CSS Flexbox để tạo bố cục từ đó chúng tôi có HTML CSS như thế này

<li class="feature__item">
 <div class="feature__item-img">
 </div>
 <div class="feature__item-content">
 </div>
</li>

.feature__item {
  display: flex;
  flex-flow: row wrap;
  height: 60rem;
  overflow: hidden;
}
.feature__item-img {
  width: 67%;
  position: relative;/*Note*/
}
.feature__item-content {
  width: 33%;
}

Vì mới chia cột thôi nên lúc này nhìn vào Web vẫn chưa có gì đâu. Do đó, chúng ta sẽ tiếp tục đưa các phần tử khác vào

Sau css con cuối cùng

Ở cột bên trái ta có hai tấm hình, một hình để phủ hết cột và một hình nhỏ nằm giữa các cột. Ta sẽ có HTML như thế này

<div class="feature__item-img">
  <img src="images/img14.jpg" alt="" class="img__bg">
  <img src="images/img-bicycle-company.png" alt="" class="img__brand">
</div>

Tấm hình phủ hết cột mình cho lớp là
<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
5 nghĩa là hình nền và tấm hình nhỏ là
<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
6 kiểu như là thương hiệu-logo nha. Sau đó mình sẽ CSS cho chúng như dưới đây
.feature__item .img__bg {
  height: 100%;
  width: 100%;
  object-fit: cover;
}
.feature__item .img__brand {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 2;
}

Các bạn để ý ở lớp
<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
7 (có Ghi chú ở trên) mình cho thuộc tính
<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
8 để hình ảnh có lớp
<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
6 có thể dùng
<li class="feature__item">
 <div class="feature__item-img">
 </div>
 <div class="feature__item-content">
 </div>
</li>
0 để căn chỉnh theo đấy. Nếu bạn chưa biết về vị trí thuộc tính trong CSS thì có thể tìm hiểu tại đây

Sau css con cuối cùng

Đến cột phải thì trong cột phải thì lại có hai nội dung khác theo chiều dọc. Một trên một dưới nên mình sẽ đặt là content-top và content-bottom

<div class="feature__item-content">
 <div class="feature__item-content-top">
  <img src="images/icon2.png" alt="" class="feature__img-top">
  <h3 class="feature__heading">Vintage Oliva</h3>
  <p class="feature__item-text">Lorem Ipsum simply...</p>
 </div>
 <div class="feature__item-content-bottom">
  <img src="images/img1.jpg" alt="" class="img__bg">
 </div>
</div>

Phần nội dung trên cùng có chiều cao là 400px và nội dung dưới cùng có chiều cao là 200px. Từ đó mình tính ra được phần trăm chiều cao tương ứng là 67% và 33%

Các bạn để ý sẽ thấy lại lớp

<li class="feature__item">
 <div class="feature__item-img">
 </div>
 <div class="feature__item-content">
 </div>
</li>
1 và
<li class="feature__item">
 <div class="feature__item-img">
 </div>
 <div class="feature__item-content">
 </div>
</li>
2 mình đã sử dụng trước đó vì như mình đã nói từ trước là các phần sau cũng sử dụng chúng nên phải đặt tên như thế để tái sử dụng

Nhìn vào cấu trúc cột bên phải mình thấy nội dung theo hướng chiều dọc cho nên mình sẽ sử dụng flexbox với thuộc tính

<li class="feature__item">
 <div class="feature__item-img">
 </div>
 <div class="feature__item-content">
 </div>
</li>
3. Nếu chưa hiểu kỹ về flexbox thì đừng quên tham khảo lại nó tại đây

.feature__item-content {
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

Tiếp đến là content-top ta có padding hai bên là 70px và nội dung của nó nằm giữa cho nên mình cũng dùng flexbox cho nó luôn, kèm theo đó là CSS cho chiều cao của nó(content-top) và đoạn chữ(
.feature__item-content-top {
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 0 7rem;
  position: relative;
  background-color: white;
  height: 67%;
}
.feature__item-text {
  font-size: 1.6rem;
  line-height: 1.6;
  color: var(--text);
  text-align: justify;
  position: relative;
  padding-bottom: 3rem;
}
.feature__item-content-bottom {
  height: 33%;
}

Sau css con cuối cùng

Đến block2 thì cấu trúc HTML y chang block1 luôn chỉ thay đổi đường dẫn hình ảnh và nội dung chữ đồ thôi, sau đó ta dùng thuộc tính

.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}
9 cho lớp
<li class="feature__item">
 <div class="feature__item-img">
 </div>
 <div class="feature__item-content">
 </div>
</li>
6 số hai bằng cách sử dụng
<li class="feature__item">
 <div class="feature__item-img">
 </div>
 <div class="feature__item-content">
 </div>
</li>
7 như sau thì lúc này phần nội dung hình

.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}
0
Sau css con cuối cùng

Cuối cùng là block3 với cấu trúc HTML cũng trang trí block1 nhưng thêm một cột hình ảnh mà thôi(

<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
7). Mình có Note ở cấu trúc HTML bên dưới đây

.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}
1
Cấu trúc đã thay đổi nên không thể để 67% 33% như hai cột được nữa nên chúng ta phải mã lại. Như đã nói ở phần phân tích thì ta có tỷ lệ ba cột tương ứng là 33% 34% 33%

Để chọn

<li class="feature__item">
 <div class="feature__item-img">
 </div>
 <div class="feature__item-content">
 </div>
</li>
6 cuối cùng, chúng ta sẽ sử dụng
<div class="feature">
 <div class="feature__header">
  ...
 </div>
 <ul class="feature__list">
   ...
 </ul>
</div>
3 và CSS cho phần hình ảnh (cùng một lớp) và phần nội dung ở giữa các lần cuối cùng

.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}
2
“Unit menu” phải không các bạn?

Sau css con cuối cùng

Còn hai điểm nữa mà mình quên làm một là ở đầu cột nội dung ở phía dưới có cái hình tam giác như mình đã note mũi tên ở trên hình

Chúng ta đã tìm hiểu và sử dụng nó ở bài trước và sau đấy. Các bạn có thể quay lại xem để tham khảo nha. Ở đây mình sẽ sử dụng

.feature__item {
  display: flex;
  flex-flow: row wrap;
  height: 60rem;
  overflow: hidden;
}
.feature__item-img {
  width: 67%;
  position: relative;/*Note*/
}
.feature__item-content {
  width: 33%;
}
1 và mã như sau

.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}
3
Và hai là ở phần chữ trong content-top có viền ở dưới đoạn ngắn mình cũng chỉ ở trên hình cho các bạn thấy đó. Do đó chúng ta sẽ áp dụng lại
.feature__item {
  display: flex;
  flex-flow: row wrap;
  height: 60rem;
  overflow: hidden;
}
.feature__item-img {
  width: 67%;
  position: relative;/*Note*/
}
.feature__item-content {
  width: 33%;
}
1 next to doing
.feature__header {
 padding: 11rem 1.5rem 14rem;
 background-color: var(--bg-light);
}
.feature__img-top {
 margin: 0 auto 3rem;
}
.feature__heading {
 font-size: 1.8rem;
 line-height: 1.6;
 text-transform: uppercase;
 color: var(--heading);
 margin-bottom: 2rem;
 font-weight: bold;
 text-align: center;
}
.feature__header-desc {
 font-size: 1.8rem;
 line-height: 1.6;
 color: var(--text);
 max-width: 106rem;
 margin: 0 auto;
 text-align: center;
}
4
Kết quả là sau khi hồi phục vật chất phân tích và mã thì chúng ta đã có kết quả như mong đợi hehe.
Sau css con cuối cùng

# Lời kết

Phù. The end of the end. Cám ơn các bạn đã đọc một bài viết dài và chi tiết như thế này. Các bạn có thể nhấn vào đây để xem kết quả trực tuyến hoặc nhấn vào đây để tải mã nguồn về tham khảo đối chiếu xem có giống mã của các bạn làm không nhé cũng như để tiếp tục theo dõi phần 4 sắp tới

Nếu có gì không hiểu hoặc đóng góp ý kiến ​​thì đừng ngại mà bình luận nha. Mình luôn sẵn sàng trả lời. Chúc các bạn một ngày tốt lành