혼자 이것저것 공부해보는/프론트 엔드 유튜브 클론 코딩

[완성]클론코딩 유튜브 사이트(HTML,CSS,JavaScript) #6 최종 코드

silver님 2023. 4. 12. 11:30

아래의 html,css,js를 적용한 화면

 

index.html 코드

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Youtube</title>
  <script src="https://kit.fontawesome.com/f500d64197.js" crossorigin="anonymous"></script>
  <link href="https://fonts.googleapis.com/css?family=Roboto&display=swap"
  rel="stylesheet" /> 
  <link rel="stylesheet" href="style.css">
  <link rel="stylesheet" href="main.js">
</head>
<body>
  <!-- Header -->
  <header> 
    <div class="logo">
      <i class="fa-brands fa-youtube"></i>
      <span class="title">YouTube</span>
    </div>

    <div class="icons">
      <i class="fa-solid fa-magnifying-glass"></i>
      <i class="fa-solid fa-ellipsis-vertical"></i>
    </div>
  </header>

  <!-- video player -->
  <section class="player">
    <iframe src="video/MY RECORDS.mp4" frameborder="0" allowfullscreen=""></iframe> 
  </section>

 <div class="infoAndUpNext">
    <!--Video Info-->
  <section class="info">
    <!--Metadata-->
    <div class="metadata">
      <div class="titleAndButton">
        <span class="title clamp">
          (eng) MY RECORDS 좋아하는 LP 소개, 자주 가는 레코드샵, 나의 음악 취향
        </span>

        <button class="moreBtn">
          <i class="fas fa-caret-down"></i>
        </button>
      </div>
      <div class="views">
        <span class="views">조회수 15만회 2년전&nbsp;&nbsp;</span>
        <li>#LP</li>
        <li>#레코드샵</li>
        <li>#musicismylife</li>
      </div>
    </div>
    <!--Actions-->
    <div class="actions">
      <li>
        <button><i class="active fas fa-thumbs-up"></i><span>4.7천</span></button>
      </li>
      <li>
        <button><i class="fas fa-thumbs-down"></i></button>
      </li>
      <li>
        <button><i class="fas fa-share"></i><span>공유</span></button>
      </li>
      <li>
        <button><i class="fas  fa-plus"></i><span>저장</span></button>
      </li>
      <li>
        <button><i class="fas  fa-font-awesome-flag"></i><span>Report</span></button>
      </li>
    </div>
    <!--Channel-->
    <div class="channel">
      <div class="metadata">
        <img src="image/kyrin.jpg" alt="" />
        <div class="info">
          <span class="name">KYURIN 규린</span>
          <span class="subscribers">구독자 11.5만명</span>
        </div>
      </div>
      <button class="subscribe">구독</button>
    </div>
  </section>
  
  <setction class="UpNext">
    <span class="title">UpNext</span>
    <ul>
      <li class="item">
        <img src="image/333.png" alt="">
        <div class="info">
          <span class="title">
            2021 KYEJEOL LIVE of BIG Naughty
          </span>
          <span class="name">KYEJEOL LIVE</span>
          <span class="view">조회수 15만회</span>
        </div>
        <button class="moreBtn"><i class="fas fa-ellipsis-v"></i></button>
        <moreBtn></moreBtn>
      </li>
      <li class="item">
        <img src="image/111.png" alt="">
        <div class="info">
          <span class="title">
            [LENIVERSE] EP.18 LE CAFÉ 2편
          </span>
          <span class="name">LE SSERAFIM</span>
          <span class="view">조회수 27만회</span>
        </div>
        <button class="moreBtn"><i class="fas fa-ellipsis-v"></i></button>
        <moreBtn></moreBtn>
      </li>
      <li class="item">
        <img src="image/222.png" alt="">
        <div class="info">
          <span class="title">
            [playlist] 빈티지 러브 (Vintage Love)
          </span>
          <span class="name">리플레이LEEPLAY</span>
          <span class="view">조회수 9.8만회</span>
        </div>
        <button class="moreBtn"><i class="fas fa-ellipsis-v"></i></button>
        <moreBtn></moreBtn>
      </li>
    </ul>
  </setction>
 </div>
</body>

 


style.css 코드

:root{
  /* Color */
  --white-color: #fff;
  --black-color: #140a00;
  --blue-color: #045fd4;
  --red-color: #ff0000;
  --grey-dark-color: #232323;
  --grey-light-color: #e0e0e0;


  /* Size */
    --padding: 17px;
    --avatar-size: 36px;

  /* Font Size */ 
  --font-large: 20px;
  --font-medium: 14px;
  --font-small: 12px;
  --font-micro: 10px;
}

* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}

body {
  font-family: Roboto;
}

button,
button:focus {
  border: none; 
  cursor: pointer;
  outline: none;
}

header { 
  display: flex;
  justify-content: space-between;
  padding: var(--padding);
  background-color: var(--white-color);
  color: var(--black-color);
  font-weight: bold;
}

header .logo {
  font-size: var(--font-large);
}

header .logo i {
  color:var(--red-color);
}

header .icons .fa-magnifying-glass{
  margin-right: var(--padding);
}

.player {
  text-align: center;
  position:relative;
  height:0;
  padding-bottom:56.25%;
}

.player iframe {
  position:absolute;
  top:0;
  left:0;
  width:100%;
  height:100%;
}

.player video {
  width: 100%;
  height: 100%;
  max-width: 1000px;
}

.info {
  padding: var(--padding);
  list-style-type: none;
}

.info .metadata li{
  list-style-type: none;
}

.views { 
  display: flex;
  font-size: var(--font-small);
}

.views li {
  color: var(--blue-color);
  margin-right: 5px;
}

.info .metadata .titleAndButton {
  display: flex;
}

.info .metadata .titleAndButton .title {
  font-size: var(--font-large);
  font-weight: 500; 
  margin-right: var(--padding);
}

.info .metadata .titleAndButton .moreBtn {
  
}

.info .views {
  font-size: var(--font-small);
  color: var(--grey-dark-color)
}

.actions {
  display: flex;
  justify-content: space-around;
  padding: var(--padding) 0;
}

.actions button {
  display: flex;
  flex-direction: column;
  font-size: var(--font-small);
  background-color: var(--white-color);
  color: var(--grey-dark-color);

}

.actions button i {
  margin: 0 auto;
  margin-bottom: calc(var(--padding)/2);
  font-size: 20px;
}

.actions button i.active {
  color:var(--blue-color);
}

:root{
  /* Color */
  --white-color: #fff;
  --black-color: #140a00;
  --blue-color: #045fd4;
  --red-color: #ff0000;
  --grey-dark-color: #393939;
  --grey-light-color: #e0e0e0;


  /* Size */
    --padding: 17px;
    --avatar-size: 36px;

  /* Font Size */ 
  --font-large: 20px;
  --font-medium: 14px;
  --font-small: 12px;
  --font-micro: 10px;
}

* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}

body {
  font-family: Roboto;
}

button,
button:focus {
  border: none; 
  cursor: pointer;
  outline: none;
}

/* Header*/
header { 
  display: flex;
  justify-content: space-between;
  padding: var(--padding);
  background-color: var(--white-color);
  color: var(--black-color);
  font-weight: bold;
}

header .logo {
  font-size: var(--font-large);
}

header .logo i {
  color:var(--red-color);
}

header .icons .fa-magnifying-glass{
  margin-right: var(--padding);
}

/* video player*/
.player {
  text-align: center;
}

.player video {
  width: 100%;
  height: 100%;
  max-width: 1000px;
}

/* video info */
body > .info {
  padding: var(--padding);
  list-style-type: none;
}

.info .metadata li{
  list-style-type: none;
}

.views { 
  display: flex;
  font-size: var(--font-small);
}

.views li {
  color: var(--blue-color);
  margin-right: 5px;
}

.info .metadata .titleAndButton {
  display: flex;
}

.info .metadata .titleAndButton .title {
  font-size: var(--font-large);
  font-weight: 500; 
  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 {
  transition: transfrom;
}

.info  .metadata .titleAndButton .moreBtn.clicked {
  transform: rotate(180deg);
}

.info .views {
  font-size: var(--font-small);
  color: var(--grey-dark-color)
}

/* action buttons*/
.info .actions {
  display: flex;
  justify-content: space-around;
  padding: var(--padding) 0;
}

.info .actions button {
  display: flex;
  flex-direction: column;
  font-size: var(--font-small);
  background-color: var(--white-color);
  color: var(--grey-dark-color);

}

.info .actions button i {
  margin: 0 auto;
  margin-bottom: calc(var(--padding)/2);
  font-size: 20px;
}

.info .actions button i.active {
  color:var(--blue-color);
}

/* Channel Description */

.info .channel {
  display: flex;
  justify-content:flex-start;
  border-top: 1px solid var(--grey-light-color);
  border-bottom: 1px solid var(--grey-light-color);
}

.info .channel .metadata {
  display: flex;
  align-items: center;
}

.info .channel .metadata img {
  width: var(--avatar-size);
  height: var(--avatar-size);
  border-radius: 50%;
}

.info .channel .metadata .info {
  display: flex;
  flex-direction: column;
}

.info .channel .metadata .info .name {
  font-size: var(--font-medium);
}

.info .channel .metadata .info .subscribers {
  font-size: var(--font-medium);
  color: var(--grey-dark-color);
}

.info .channel .subscribe { 
  background-color: var(--black-color);
  color: var(--white-color);
  padding: 5px 10px;
  border-radius: 30px;
}

/* UpNext */

.UpNext {
  padding: 0 var(--padding);
}

.UpNext ul{
  padding: 0 var(--padding);
}

.UpNext > .title {
  font-size: var(--font-medium);
  color: var(--grey-dark-color);
  margin-bottom: calc(var(--padding) / 2);
}

.UpNext .item { 
  display: flex;
  padding: 10px;
  margin-top: var(--padding);
}

.UpNext .item .img { 
  flex: 1 1 35%;
}

.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-small);
}


.infoAndUpNext { 
  display: flex;
  flex-direction: column;
  background-color: var(--white-color);

  
}

.infoAndUpNext .moreBtn{ 
  background-color: var(--white-color);
}

@media screen and (min-width: 1200px) {
  .infoAndUpNext {
    flex-direction: row;
    margin: var(--padding) 0;
  }
}

main.js 코드

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');
});
728x90
반응형