HTML, CSS
클론코딩 유튜브 사이트 따라 만들기(HTML+CSS 연습편, 웹 포트폴리오) | 프론트엔드 개발자 입문편: HTML, CSS, Javascript
일등하이
2020. 12. 30. 17:18
반응형
www.youtube.com/watch?v=67stn7Pu7s4&t=167s
developer.mozilla.org/ko/docs/Web/HTML
HTML: Hypertext Markup Language | MDN
와 요소를 통해 외부 프로그램 없이 오디오와 비디오 미디어를 재생할 수 있습니다. HTML 요소는 공통 특성을 공유하는 요소끼리 묶는 콘텐츠 카테고리 한 가지 이상에 속할 수 있습니다. 콘텐츠
developer.mozilla.org
Font Awesome
The world’s most popular and easiest to use icon set just got an upgrade. More icons. More styles. More Options.
fontawesome.com
material.io/resources/color/#!/
Color Tool - Material Design
Create and share color palettes for your UI, and measure the accessibility of any color combination.
material.io
Google Fonts
Making the web more beautiful, fast, and open through great typography
fonts.google.com
<!DOCTYPE html>
<html lang="kr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="./style.css">
<title>Youtube Mobile</title>
<script src="https://kit.fontawesome.com/3442ebfa65.js" crossorigin="anonymous"></script>
<script src="./main.js" defer></script>
</head>
<body>
<!-- Header -->
<header>
<div class="logo">
<i class="fab fa-youtube"></i>
<span class="title">Youtube</span>
</div>
<div class="icons">
<i class="fas fa-search"></i>
<i class="fas fa-ellipsis-v"></i>
</div>
</header>
<!-- Video Player -->
<section class="player">
<video controls src="./videos/ml-agents.mp4"></video>
</section>
<div class="infoAndUpNext">
<section class="info">
<div class="metadata">
<ul class="hashtags">
<li>#DreamCoding</li>
<li>#DreamCoders</li>
<li>#Ellie</li>
</ul>
<div class="titleAndButton">
<span class="title clamp">
Clone Coding: Youtube Mobile Website 유투브 모바일 웹사이트 따라
만들기 | 프론트 엔드 개발자 입문편: HTML, CSS, Javascript 드림코딩과
함께하는 프론트엔드 실전 입문편
</span>
<button class="moreBtn">
<i class="fas fa-caret-down"></i>
</button>
</div>
<span class="views">1M views 1 month ago</span>
</div>
<ul class="actions">
<li>
<button>
<i class="active fas fa-thumbs-up"><span>1K</span></i>
</button>
</li>
<li>
<button>
<i class="fas fa-thumbs-down"><span>0</span></i>
</button>
</li>
<li>
<button>
<i class="fas fa-share"><span>Share</span></i>
</button>
</li>
<li>
<button>
<i class="fas fa-plus"><span>Save</span></i>
</button>
</li>
<li>
<button>
<i class="fab fa-font-awesome-flag"><span>Report</span></i>
</button>
</li>
</ul>
<!-- channel desc -->
<div class="channel">
<div class="metadata">
<img src="./image/thumb.jpg" alt="thumb">
<div class="info">
<span class="name"></span>
<span class="subscribes"></span>
</div>
</div>
<button class="subscribe">subscribe</button>
</div>
</section>
<section class="upNext">
<span class="title">up next</span>
<ul>
<li class="item">
<div class="img">
<img src="./image/1.png" alt="">
</div>
<div class="info">
<span class="title">아이유, 이승기님이 '니곡 내곡' 스킬을 시전하셨습니다.</span>
<span class="name">이지금</span>
<span class="views">조회수 108만회 - 5일전</span>
</div>
<button class="moreBtn">
<i class="fas fa-ellipsis-v"></i>
</button>
</li>
<li class="item">
<div class="img">
<img src="./image/2.png" alt="">
</div>
<div class="info">
<span class="title">[광고없는] 가슴 한편이 뭉클해지는 아이유 노래 모음</span>
<span class="name">이지금</span>
<span class="views">조회수 244만회 - 1주전</span>
</div>
<button class="moreBtn">
<i class="fas fa-ellipsis-v"></i>
</button>
</li>
<li class="item">
<div class="img">
<img src="./image/3.png" alt="">
</div>
<div class="info">
<span class="title">아이유 분노의 크리스마스</span>
<span class="name">이지금</span>
<span class="views">조회수 309만회 - 3개월전</span>
</div>
<button class="moreBtn">
<i class="fas fa-ellipsis-v"></i>
</button>
</li>
</ul>
</section>
</div>
<!-- Video Info -->
</body>
</html>
:root {
/* Color */
--white-color: #ffffff;
--black-color: #140a00;
--blue-color: #045fd4;
--red-color: #ff0000;
--gray-dark-color: #909090;
--gray-light-color: #e0e0e0;
/* Size */
--padding: 12px;
--avatar-size: 36px;
/* Font Size */
--font-large: 18px;
--font-medium: 14px;
--font-small: 12px;
--font-micro: 10px;
}
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
body {
font-family: Roboto;
}
ul {
list-style: none;
}
button,
button:focus {
border: none;
cursor: pointer;
outline: none;
}
header {
display: flex;
justify-content: space-between;
padding: var(--padding);
background-color: var(--black-color);
color: var(--white-color);
}
header .logo {
font-size: var(--font-large);
}
header .logo i {
color: var(--red-color);
}
header .icons. .fa-search {
margin-right: var(--padding);
}
.player {
position: sticky;
top: 0;
text-align: center;
background-color: var(--black-color);
}
.player video {
width: 100%;
height: 100%;
max-width: 1000px;
}
body > .info {
padding: var(--padding);
}
.info .metadata .hashtags {
display: flex;
font-size: var(--font-small);
color: var(--blue-color);
}
.info .metadata .hashtags li {
margin-right: var(--padding);
}
.info .metadata .titleAndButton {
display: flex;
}
.info .metadata .titleAndButton .title {
font-size: var(--font-medium);
margin-right: var(--padding);
}
.info .metadata .titleAndButton .title.clamp {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.info .metadata .titleAndButton .moreBtn {
height: 100%;
transition: transform 300ms ease-in-out;
}
.info .metadata .titleAndButton .moreBtn.clicked {
transform: rotate(180deg);
}
.info .views {
font-size: var(--font-small);
color: var(--gray-dark-color);
}
.info .actions {
display: flex;
justify-content: space-around;
margin: var(--padding) 0;
}
.info .actions button {
display: flex;
flex-direction: column;
font-size: var(--font-small);
color: var(--gray-dark-color);
}
.info .actions button i {
margin: 0 auto;
margin-bottom: calc(var(--padding) / 2);
font-size: 16px;
}
.info .actions button i.active {
color: var(--blue-color);
}
.info .channel {
display: flex;
justify-content: space-between;
border-top: 1px solid var(--gray-light-color);
border-bottom: 1px solid var(--gray-light-color);
}
.info .channel .metadata {
display: flex;
align-items: center;
}
.info .channel .metadata .info {
display: flex;
flex-direction: column;
}
.info .channel .metadata img {
width: var(--avatar-size);
height: var(--avatar-size);
border-radius: 50%;
}
.info .channel .metadata .info .name {
font-size: var(--font-medium);
}
.info .channel .metadata .info .subscribes {
font-size: var(--font-small);
color: var(--gray-dark-color);
}
.info .channel .subscribe {
text-transform: uppercase;
color: var(--red-color);
font-size: var(--font-medium);
}
.upNext {
padding: 0 var(--padding);
}
.upNext > .title {
font-size: var(--font-medium);
color: var(--gray-dark-color);
margin-bottom: calc(var(--padding) / 2);
}
.upNext .item {
display: flex;
margin-top: var(--padding);
}
.upNext .item .img {
flex: 1 1 35%;
margin-right: var(--padding);
}
.upNext .item .img img {
width: 100%;
}
.upNext .item .info {
flex: 1 1 60%;
}
.upNext .item .moreBtn {
flex: 1 1 5%;
}
.upNext .item .info {
display: flex;
flex-direction: column;
}
.upNext .item .info .title {
font-size: var(--font-small);
}
.upNext .item .info .name,
.upNext .item .info .views {
font-size: var(--font-micro);
color: var(--gray-dark-color);
}
.infoAndUpNext {
display: flex;
flex-direction: column;
}
@media screen and (min-width: 768px) {
.infoAndUpNext {
flex-direction: row;
margin: var(--padding) 0;
}
}
const moreBtn = document.querySelector(".info .metadata .moreBtn");
const title = document.querySelector(".info .metadata .title");
moreBtn.addEventListener("click", () => {
moreBtn.classList.toggle("clicked");
title.classList.toggle("clamp");
});
반응형