์ƒˆ์†Œ์‹

์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด

Code Review

์„œ์šธ์‹œ์ฒญ

  • -

 

๐Ÿ“ ์„œ์šธ์‹œ์ฒญ

๐Ÿ‘‰ ์‚ฌ์ดํŠธ๋ช… : ์„œ์šธ์‹œ์ฒญ
๐Ÿ‘‰ ์ž‘์—…๊ธฐ๊ฐ„ : 3์ผ
๐Ÿ‘‰ ์‚ฌ์šฉ์–ธ์–ด : HTML5, CSS3, JQuery
๐Ÿ‘‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : Swiper
๐Ÿ‘‰ ๋ถ„๋ฅ˜ : ์ ์‘ํ˜• PC, ํด๋ก ์ฝ”๋”ฉ
๐Ÿ‘‰ URL : https://codenablog.github.io/Seoul-cityhall/


โœจPOINT

โœ”๏ธ ์‹œ๋ฉ˜ํ‹ฑ์›น์— ์œ ์˜ํ•˜๋ฉฐ ์ž‘์„ฑ
โœ”๏ธ swiper custum

 


๐Ÿ’ก ๋ ˆ์ด์•„์›ƒ

์„œ์šธ์‹œ์ฒญ ์‚ฌ์ดํŠธ๋Š” class: common-inner๋กœ ์ „์ฒด width๊ฐ’๋งŒ ์žก์•„์ฃผ์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  section๋งˆ๋‹ค ๋‹ค๋ฅธ inner๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„น์…˜๋“ค์˜ ๋ฌถ์Œ์€ inner1 ,inner2…๋“ฑ์œผ๋กœ ํด๋ž˜์Šค ๋ช…์„ ์ฃผ์—ˆ๋‹ค.

์œ„ ์ด๋ฏธ์ง€ ์ฒ˜๋Ÿผ 3๊ฐœ์˜ section์˜ ์œ„ ์•„๋ž˜์— padding๊ฐ’์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ• ๋•Œ๋ฅผ ์œ„ํ•ด section์„ ๋ฌถ์–ด์ฃผ๋Š” inner๋ฅผ ๋˜ ํ•˜๋‚˜ ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.

 


๐Ÿ“ ์›น ์ ‘๊ทผ์„ฑ

1. skip nav ํ™œ์šฉํ•˜๊ธฐ (๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ)

๐Ÿ”Ž Markup

    <div class="skip-nav">
      <a href="#contents">๋ณธ๋ฌธ๋‚ด์šฉ๋ฐ”๋กœ๊ฐ€๊ธฐ</a>
    </div>

    <header class="header">
    </header>

    <main class="main" id="contents">
    </main>

 

๐Ÿ”Ž CSS

.skip-nav{
  position: relative;
    z-index: 3000;
}
.skip-nav a{
  position: absolute;
  top: -30px;
  left: 0;
  width: 138px;
  height: 30px;
  border: 1px solid #4ec53d;
  background: #333;
  text-align: center;
}

.skip-nav a:active,
.skip-nav a:focus{
  text-outline: 0;
  text-decoration: none;
  z-index: 1000;
}

 

2. ํ•˜๋‹จ ๋ฉ”๋‰ด tab์œผ๋กœ ์ด๋™ (keyUP, keyDowna)

ํƒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋™ํ•˜๋Š” ์žฅ์• ์ธ๋“ค์„ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด tab์ด sub item ๋๊นŒ์ง€ ๊ฐ€๋ฉด ์ž๋™์œผ๋กœ ์ฐฝ์ด ๋‹ซํ˜€์•ผ ํ•œ๋‹ค.

sub-item์˜ ์ฒซ๋ฒˆ์งธ์™€ ๋งจ ๋งˆ์ง€๋ง‰ ์š”์†Œ์—์„œ๋งŒ ๋™์ž‘์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ์ง€์ •์€ :first-chlid์™€ last-child๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

๐Ÿ”Ž ๊ธฐ๋ณธ Animation

$('.sc-relrate .sub-list li:first-child').keydown(function(e){
	
});

$('.sc-relrate .sub-list li:last-child').keydown(function(e){
  
});

 

โญ keyCode์ด์šฉํ•˜๊ธฐ

ํ‚ค๋ณด๋“œ๋ชจ๋“  ์žํŒ์€ ์ˆซ์ž๋กœ ๊ฐ’์ด ํ• ๋‹น ๋˜์–ด์žˆ๋‹ค. ์ด keyCode๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ˆ๋ฅผ๋“ค๋ฉด ๊ฒŒ์ž„์„ ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๋“ค์€ ์›€์ง์ž„์„ ์ œ์–ดํ•˜๊ฒŒ ๋˜๋Š”๋ฐ

์—ฌ๊ธฐ์„œ tab์˜ ๋ฒˆํ˜ธ์ธ 9์„ ์‚ฌ์šฉํ•˜์—ฌ item์—์„œ tab, shift tabํ‚ค๋ฅผ๋ˆŒ๋ €์„๋•Œ sub-list์ฐฝ์ด ๋‹ซํžˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๋งˆ๋ฌด๋ฆฌํ•˜์˜€๋‹ค.

๐Ÿ”Ž Animation

$('.sc-relate .sub-list li:first-child').keydown(function(e){ // sub-li์˜ ์ฒซ๋ฒˆ์งธ ์ž์‹
  key = e.keyCode;

  if(key === 9 && e.shiftKey){ // keyCord๊ฐ€ 9์™€ shiftํ‚ค ์ผ๋•Œ (tab + shift)
    $('.relate-btn').removeClass('on');
    $('.sub-area').slideUp();
  }
});

$('.sc-relate .sub-list li:last-child').keydown(function(e){// sub-li์˜ ๋งˆ์ง€๋ง‰ ์ž์‹
  if(key === 9 && !e.shiftKey){ // keyCord๊ฐ€ 9์ด๊ณ  shiftํ‚ค๋Š” ์•„๋‹๋•Œ (tab)
    $('.relate-btn').removeClass('on');
    $('.sub-area').slideUp();
  }
});

 


๐Ÿ“ Option

์†์„ฑ value๊ฐ’์œผ๋กœ ์ฃผ์†Œ ์ด๋™ํ•˜๊ธฐ

 

 

๐Ÿ”Ž Markup

<div class="len-area">
    <select name="select" class="len-selcet">
        <option class="en" value="http://english.seoul.go.kr/?SSid=101-01">ENGLISH</option>
        <option class="ja" value="http://japanese.seoul.go.kr/?SSid=101-02">ๆ—ฅๆœฌ่ชž</option>
        <option class="ch1" value="http://chinese.seoul.go.kr/?SSid=101-04">็ฎ€ไฝ“ไธญๆ–‡</option>
        <option class="ch2" value="http://tchinese.seoul.go.kr/?SSid=101-03">็นไฝ“ไธญๆ–‡</option>
        <option class="ww" value="http://world.seoul.go.kr/">WorldWide</option>
    </select>
    <input class="go" type="button" value="GO">
</div>
 
 

๐Ÿ“ swiper

โญ swiper์˜ html๊ธฐ๋ณธ ๊ตฌ์กฐ

  <div class="swiper mySwiper">
    <div class="swiper-wrapper">
      <div class="swiper-slide">Slide 1</div>
      <div class="swiper-slide">Slide 2</div>
      <div class="swiper-slide">Slide 3</div>
      <div class="swiper-slide">Slide 4</div>
      <div class="swiper-slide">Slide 5</div>
      <div class="swiper-slide">Slide 6</div>
      <div class="swiper-slide">Slide 7</div>
      <div class="swiper-slide">Slide 8</div>
      <div class="swiper-slide">Slide 9</div>
    </div>
  </div>

 

< ํ•„์ˆ˜ ํด๋ž˜์Šค ์š”์†Œ >

์ด ์„ธ๊ฐœ์˜ ํด๋ž˜์Šค๋งŒ ์žˆ๋‹ค๋ฉด ์Šค์™€์ดํผ๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค!

" swiper   mySwiper(์ž„์˜ ์ง€์ • ๊ฐ€๋Šฅ) "
" swiper-wrapper "
" swiper-slide " 

 

โญ swiper ์˜ต์…˜

slidePerView : ํ™”๋ฉด์— ํ•œ๋ฒˆ์— ๋ณด์—ฌ์งˆ ์Šฌ๋ผ์ด๋“œ์˜ ๊ฐœ์ˆ˜

spaceBetween : ์Šฌ๋ผ์ด๋“œ ์‚ฌ์ด ๊ฐ„๊ฒฉ

loop :  ์Šฌ๋ผ์ด๋“œ ๋งˆ์ง€๋ง‰์—์„œ ๋™์ž‘

  • ture : ๋ฌดํ•œ ๋ฃจํ”„
  • false : ๋งˆ์ง€๋ง‰ ์Šฌ๋ผ์ด๋“œ์—์„œ ๋ฉˆ์ถค

pagination : ์Šฌ๋ผ์ด๋“œ ํŽ˜์ด์ง€

      pagination: {
        el: ".swiper-pagination",
        clickable: true,
      },
  • bullets : ํŒŒ๋ž€ ์ 
  • progressbar : /๊ฐ€ ์žˆ๋Š” ์ˆซ์ž (๋ถ„์ˆ˜)
  • fraction : 
  • scrollbar : ์Šคํฌ๋กค ๋ฐ”
  • custom
navigation : ์Šฌ๋ผ์ด๋“œ๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ
      navigation: {
        nextEl: ".swiper-button-next",
        prevEl: ".swiper-button-prev",
      },

 

 

๐Ÿ“ Swiper targeting

 

๊ด‘๊ณ ์˜ ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ 1-4๋ฒˆ์€ ์ฃผ์š”๋‰ด์Šค, 5~12๋Š” ์‹œ๋ฏผ์ฐธ์—ฌ์— ํ•ด๋‹น๋œ๋‹ค.

  1. ‘์นดํ…Œ๊ณ ๋ฆฌ’๋ฅผ ํด๋ฆญํ–ˆ์„๋•Œ ํ•ด๋‹น๋˜๋Š” ‘๊ด‘๊ณ  ์ด๋ฏธ์ง€’๋กœ ์ด๋™์„ ํ•ด์•ผํ•œ๋‹ค.
  2. ‘์Šค์™€์ดํผ’ ๋˜๋ฉด์„œ ์™ผ์ชฝ์˜ ‘์นดํ…Œ๊ณ ๋ฆฌ’๋„ ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค.

 

1. ‘์Šฌ๋ผ์ด๋“œ ์นดํ…Œ๊ณ ๋ฆฌ’ ํด๋ฆญ ์‹œ ํ•ด๋‹น๋˜๋Š” ์ด๋ฏธ์ง€๋กœ ์ด๋™

 

๐Ÿ”Ž Markup

<section class="sc-mainslide">
	<div class="group-tab">
		<!-- 1. ์Šค์™€์ดํผ ์นดํ…Œ๊ณ ๋ฆฌ -->
	  <button href="" class="tab news active">
	    <i class="ico-news"></i>
	    <em class="title" >์ฃผ์š”๋‰ด์Šค</em>
	  </button>
	  <button href="" class="tab citizen">
	    <i class="ico-citizen"></i>
	    <em class="title">์‹œ๋ฏผ์ฐธ์—ฌ</em>
	  </button>
	</div>
</section>

 

๐Ÿ”Ž Animation

$('.sc-mainslide .group-tab .tab').click(function(){
  $(this).addClass('active').siblings().removeClass('active');
});

 

์ด์ œ๋Š” ํด๋ฆญํ•œ ํƒญ๋ถ€๋ถ„๋งŒ ์„ ํƒ์ด ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

2. ‘์Šฌ๋ผ์ด๋“œ ์ด๋ฏธ์ง€’๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด์„œ ํ•ด๋‹น๋˜๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ž๋™ ์„ ํƒ

โญ slideTo ์‚ฌ์šฉํ•˜๊ธฐ 

"์Šฌ๋ผ์ด๋“œ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ํด๋ฆญํ–ˆ์„๋•Œ ํ•ด๋‹น๋˜๋Š” ์Šฌ๋ผ์ด๋“œ๋กœ ์ด๋™ํ•˜๊ธฐ"์—์„œ ํ•ต์‹ฌ์€ slideTo()์ด๋‹ค. (swiper์—์„œ ์ œ๊ณต๋˜๋Š” ๋ช…๋ น์–ด)

๋‚˜๋Š” html์— data-tab์œผ๋กœ ์ˆœ์„œ๋ฅผ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด ๋‘๊ณ  data ๊ฐ’์„ ์ˆซ์ž ๊ฐ’ ์•ˆ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

 

๐Ÿ”Ž Animation

$('.sc-mainslide .group-tab .tab').click(function(){
  index = $(this).data('tab');
  $(this).addClass('active').siblings().removeClass('active');

  mainswiper.slideTo(index
});

 

 

  on:{
    "slideChange":(function(){
      if (this.realIndex >= 3) {
        $('.sc-mainslide .group-tab .tab.citizen').addClass('active').siblings().removeClass('active');;
      } else {
        $('.sc-mainslide .group-tab .tab.news').addClass('active').siblings().removeClass('active');;
        
      }
    })
  }
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.