---
# System prepended metadata

title: Clothes Store - SASS Project
tags: ['HTML, CSS, SASS']

---

#  Clothes Store - SASS Project

---
tags: Javascript relate
---

###### tags: `HTML, CSS, SASS`

# 製作一個衣服購物網站

## 成品:

![](https://i.imgur.com/hEEPgbC.jpg)

[成品網址](https://chiehliu.github.io/git-projects/clothesStore/index.html)

## 成品功能:
1.有兩條navbar其中一條有hover出下拉選單
2.投影片區域每4秒更新，淺入淺出特效
3.商品區域hover出現價錢跟購買按鈕並且商品帶有透明特效
4.下方see more按鈕有特效處理
5.footer區域字樣以及按鈕做hover變色，input內部區域做focus外框變色
6.RWD針對1200, 1000, 760, 560px 大小作處理 

# HTML

## html程式碼:

[html.index](https://github.com/chiehLiu/git-projects/blob/clothesStore/clothesStore/index.html)

# SCSS:

下面我以資料夾做分類解析

# main.scss

## main.scss

處理全部的import並且按照資料夾分類處理

```sass=
@import "abstracts/variables";
@import "abstracts/mixins";
@import "base/base";

@import "layout/header";
@import "layout/navigation";
@import "layout/slideshow";
@import "layout/products";
@import "layout/footer";

@import "components/logo";
@import "components/heading";
@import "components/dropdown";
@import "components/button";
```
# base
## _base.scss

### 全域字體大小處理

作者想要使用10px代替16px作為基礎 1rem 因為比較方便
所以10/16=0.625 使用到趴數上面就是62.5%

### `.container` 包裹住全體物件的容器直接設計grid框架上去

作者把物件都用這些grid出現的格線去做排列，並且把上面的元素固定在規畫好的格線內

* grid-template-columns 設定每一行的每個區塊怎麼分大小以及分幾塊
* grid-template-rows 設定每一列的每個區塊怎麼分大小以及分幾塊
* grid-row-gap 行的間距

![](https://i.imgur.com/hwQ8u4N.jpg)



*  `minmax()`使用兩個參數(最大值, 最小值) 功能使內容物不跑版
*  fr代表可用空間的分塊的每一塊的的代表假設寫成 1fr,1fr,1fr代表區塊分成三塊並且大小相同
 寫成 2fr,1fr,1fr代表第一塊是兩倍大其他兩個大小相同
*  max/min-content 代表所屬block的最大以及最小值下方範例使用`min-content`代表最小所以都是最小單位也就是內容物多大這個空間就多大
* 使用函式`color()`取用map `$colors`裡面的內容

```sass=
* {
    margin: 0;
    padding: 0;
    font-family: 'Josefin Sans', sans-serif;
}

// 這邊因為作者想要使用10px代替16px作為基礎 1rem 因為比較方便
// 所以10/16=0.625 使用到趴數上面就是62.5%
html {
    font-size: 62.5%;

    @include response(md) {
        font-size: 56.25%;
        //9/16 = 56.25;    
    }

    @include response(sm) {
        font-size: 50%;
        //8/16 = 56.25;    
    }
}

// minmax使用兩個參數(最大值, 最小值) 功能使內容物不跑版
// fr代表可用空間的分塊的每一塊的的代表假設寫成 1fr,1fr,1fr代表區塊分成三塊並且大小相同
// 寫成 2fr,1fr,1fr代表第一塊是兩倍大其他兩個大小相同
// max/min-content 代表所屬block的最大以及最小值下方範例使用min-content代表最小所以都是最小單位
//使用函式color取用map $colors裡面的內容
.container {
    display: grid;
    grid-template-columns: minmax(6rem, 1fr) repeat(8, minmax(min-content, 16rem)) minmax(6rem, 1fr);
    grid-template-rows: repeat(4, min-content);
    grid-row-gap: 1.6rem;
    background-color: color(tertiary);
}
```

# abstracts

## _variables.scss

設置顏色，文字的function

```sass=
$colors: (primary:#333,
    secondary:#ffe,
    tertiary:#f2f0f1,
    quaternary:#f5b149,
);

@function color($color-name) {
    @return map-get($colors, $color-name);
}

$font-sizes:(xl:3rem,
    lg:2.5rem,
    md:2rem,
    sm:1.8rem,
    xs:1.6rem);

@function size($size) {
    @return map-get($font-sizes, $size);
}
```

## _mixins.scss

### navigation
first-nav/second-nav重複的地方直接擷取近來這邊:
* display
* 定位space-around
* height
* list-style
* link部分字體的修飾以及hover特效

### flexPosition($justCont: center, $alignIte:center)
預設全置中

* display: flex
* justify-content: $justCont
* align-items: $alignIte


### footerList
* 處理footer文字部分修飾
* hover特效

### response
處理全部的RWD
並且使用if判斷式下方舉一個做例子:

判斷的地方填入sm,md,lg,xl來做數字的代替，並且使用@content來代替不同的處理內容會寫在各處要被處理的地方裡面這邊的@content比較像個代表

```sass=
@if($breakpoint==xl) {
        @media(max-width:1200px) {
            @content;
        }
    }
```




# components

## _buttons.scss

![](https://i.imgur.com/F2N4TI8.png)

處理products區域下方的See More btn:

1. position定位relative
1. 寬高
1. 定位部分選擇space-around

### hover特效: 
![](https://i.imgur.com/bidBhwR.gif)

主要處理整個背景伸長 箭頭旋轉、伸長特效

* 寬度增加 
* 文字變色 
* 箭頭尖端處移動
設定三條直線的div並且作Z軸旋轉，為了因應hover特效則處理水平移動
* 箭柄伸長
設定的直線做水平移動達到伸長特效



## _dropdown.scss

使用`::after`做出icon效果
![](https://i.imgur.com/aizQeh8.png)
```sass=
&::after {
        font-family: 'Font Awesome 5 Free';
        content: '\f078';
        font-weight: bold;
    }
```
處理hover特效碰到才會出現不然一般呈現隱藏以及透明

![](https://i.imgur.com/Ub0GVKo.gif)

```sass=
&:hover .dropdown {
        visibility: visible;
        opacity: 1;
    }
```

使用`@mixin navigation`裡面的文字變色特效以及文字修飾

### 小三角形凸起處 

使用`&::before`來做出右上角的尖角
![](https://i.imgur.com/O8FevAH.png)

```sass=
        border-right: 15px solid transparent;
        border-bottom: 15px solid darken(color(tertiary), 5%);
        border-left: 15px solid transparent;
```

## _heading.scss

大標題文字修飾
![](https://i.imgur.com/4eU3ZFp.png)

使用gird-colum/row抓取位置後開始修飾文字

```sass=
.heading {
    grid-column: 1/-1;
    grid-row: 2 / 3;
    text-align: center;

    &-text {
        font-family: 'Great Vibes', cursive;
        font-size: size(xl)*2;
        font-weight: lighter;
        letter-spacing: 0.5rem;
    }
}
```
## _logo.scss

![](https://i.imgur.com/tea4ivA.png)

使用gird-colum/row抓取位置後開始修飾圖片並且高度設定100%做RWD

```sass=
.logo {
    grid-column: 1/2;
    grid-row: 1/2;
    padding: 1rem;

    &-img {
        width: 10rem;
        height: 100%;
    }
}
```

# layout

## _header.scss

在最外層的gird容器內再grid的一次並且再度劃分行、列的大小

以行舉例:
三個區塊紅minmax(6rem, 1fr)黃(repeat)綠minmax(6rem, 1fr)
```sass=
minmax(10rem, 1fr) repeat(7, minmax(min-content, 16rem)) minmax(10rem, 1fr);
```

![](https://i.imgur.com/W5LeISF.png)

![](https://i.imgur.com/VcwwHao.png)

```sass=
.header {
    grid-column: 1 / -1;
    grid-row: 1 / 2;
    display: grid;
    grid-template-columns: minmax(10rem, 1fr) repeat(7, minmax(min-content, 16rem)) minmax(10rem, 1fr);
    grid-template-rows: repeat(3, min-content);
    grid-gap: 2rem;
    z-index: 100;
}
```

## _navigation.scss

使用`@mixin navigation` 修飾navbar文字

基本上都在操作RWD

```sass=
.second-nav {
    grid-column: 3/8;
    grid-row: 3/4;
    @include navigation;

    @include response(lg) {
        grid-column: 2/9;
    }

    @include response(md) {
        grid-column: 1/-1;
    }
}
```

## _slideshow.scss

幻燈片slide特效配上fade in&out每四秒跑一張
![](https://i.imgur.com/6I0c1rT.png)


* 使用grid抓好位置
* 設定position:relative待會給description坐定位使用
* 寬度設定100%做RWD 長度抓80vh螢幕大小
* RWD部分更換vh大小很直觀

### 每張slide處理

* 每張slide長寬繼承父層
* 必須先把預設做隱藏不然會20秒會才跑第一個動畫
* 避免圖片失真`object-fit: cover`

```sass=
&-slide {

        // 使用定位之後會讓所有圖片疊再一起，最後一張在最上層
        position: absolute;
        top: 0;
        left: 0;
        width: inherit;
        height: inherit;

        // 這邊如果不把slide隱藏掉的話20s過後才會開始跑動畫
        visibility: hidden;
        opacity: 0;
        animation: slideshow 20s linear infinite;

        img {
            width: inherit;
            height: inherit;
            // 避免圖片失真
            object-fit: cover;
        }
    }
```

### slide特效處理

先建立list後跑each loop可以得到這個效果出現在main.css裡面
![](https://i.imgur.com/7tcMPJk.png)

list:每4秒建立一個

each loop:
使用`nth-child()`選取指定元素並且內部參數放入動態的變數`#{}`再使用`nth()`抓取要迭代的內容`$item`的第一部分，animation-delay的部份則抓取`$item`的第二部分也就是秒數

@keyframes 動畫名稱

製作動畫內容

```sass=
// 使用list 建立第幾個元素以及delay幾秒
$animList: 1 0s,
2 4s,
3 8s,
4 12s,
5 16s;

// 使用nth(前面擺入每個要被個別印出的的元素也就是(1 0s)(2 4s)的代表參數, 後方會擺入index從1開始算起)
@each $item in $animList {
    .slideshow-slide:nth-child(#{nth($item,1)}) {
        animation-delay: nth($item, 2);
    }
}


// 這邊製作fade in/out 的特效頭跟尾都處理隱藏以及透明達到這樣的效果
@keyframes slideshow {
    0% {
        visibility: hidden;
        opacity: 0;
    }

    2% {
        visibility: visible;
        opacity: 1;
    }

    18% {
        visibility: visible;
        opacity: 1;
    }

    20% {
        visibility: hidden;
        opacity: 0;
    }

    100% {
        visibility: hidden;
        opacity: 0;
    }
}
```

## _products.scss

![](https://i.imgur.com/OH9RHss.png)

商品陳列區域包含一個具有hover特效的按鈕

商品也有hover特效，沒有hover的時候會隱藏

```sass=
&:hover .product-description {
        opacity: 1;
        visibility: visible;
    }

    &:hover .product-img {
        opacity: .5;
    }
```
    
![](https://i.imgur.com/MWNCkAL.gif)


商品描述欄位

基本處理一些內文背景的修飾
```sass=
 &-description {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        background-color: transparentize(color(secondary), .4);
        padding: 2rem;
        border: .1rem solid color(primary);
        border-radius: .5rem;
        color: color(primary);
        text-align: center;
        opacity: 0;
        visibility: hidden;
        transition: all 1s .5s;
        }
```

商品內文區塊的整體修飾

標題/價錢/按鈕
```sass=
&-heading {
            font-size: size(xl);}

&-price {
            font-size: size(lg);
            font-weight: 300;
            margin: 1rem 0;}
            
&-btn {
            font-size: size(xs);
            text-decoration: none;
            color: color(quaternary);
            display: block;
            padding: .5rem 1rem;
            border: .1rem solid color(quaternary);
            background-color: lighten(color(primary), 20%);}
```
## _footer.scss

### 聯絡資訊

* 更多資訊欄位
* sign up 欄位
* 聯絡資訊欄位

![](https://i.imgur.com/EkIRMXd.png)


這邊很聰明的地方是針對最左最右兩邊做處理的時候直接使用`@mixin`處理重複的部分
也就是footerList這個部分直接統一文字修飾處理

```sass=
@mixin footerList {
    &-heading {
        font-size: size(lg);
        color: color(primary);
    }

    &-item {
        list-style: none;
        margin: 1rem 0;
    }

    &-link {
        font-size: size(xs);
        text-decoration: none;
        color: lighten(color(primary), 15%);
        transition: color .2s;

        &:hover {
            color: lighten(color(primary), 35%);
        }
    }
}
```

---


![](https://i.imgur.com/dNxmJ8o.gif)

中間針對input區域四個框框處理focus特效的`not()`只排除submit對其他三個處理border變色
```sass=

&:focus:not([type="submit"]) {
                border: .1rem solid darken(color(quaternary), 30%);
            }
```

### socialMedia

![](https://i.imgur.com/CwJM2kk.png)

建立一個(index 顏色)的list並且把內容使用each loop個別迭代進去每一個social-icon使用`nth-child()`來選取各個並且元素後個別填入該文字以及邊框顏色
```sass=
$socialMediaColors:1 #3b5998,
2 #b31217,
3 #dc4e41,
4 #55acee,
5 #517fa4,
6 #0077b5;

@each $color in $socialMediaColors {
    .social-icons-item:nth-child(#{nth($color,1)}) .social-icons-link {
        color: nth($color, 2);
        border: .1rem solid nth($color, 2);
    }
}
```
得出這個結果
![](https://i.imgur.com/9VKa9PL.png)


# MAIN.CSS完整程式碼

[main.css](https://github.com/chiehLiu/git-projects/blob/clothesStore/clothesStore/css/main.css)


小補充:

[grid MDN](https://developer.mozilla.org/zh-TW/docs/Web/CSS/CSS_Grid_Layout/Basic_Concepts_of_Grid_Layout)
[grid minmax() MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/minmax())
[grid-column MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/grid-column)
[gap (grid-gap) MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/gap)
[order felx items MDN](https://github.com/chiehLiu/git-projects/blob/clothesStore/clothesStore/index.html)

