- html

    <div class="gnb">
        <a href="#none">before hover effect example</a>
    </div>

 

 

포지션으로 위치를 잡을거라서 before, after이던 상관이 없음 
before after :

content=''; 필수로 있어야함, 인라인요소 (크기값을 가질 수 없음)

position: absolute - 인라인블럭 (크기값 가짐)

 

- css

a {
    text-decoration: none;
    color: #000;
}
div {
    margin: 10px 0;
}
/* 공통 */
.gnb a {
    position: relative;
    padding-bottom: 5px;
}
.gnb a:before {
    content: '';
    position: absolute;
    bottom: 0;
    background-color: crimson;
    transition: 0.3s;
}

/* underline 왼쪽 -> 오른쪽 */
.gnb a:before {
    width: 0;
    height: 1px;
}
.gnb a:hover:before {
/* a에 호버될때 자기자신의 before */
    width: 100%;
}

/* underline 오 -> 왼 */
.gnb2 a:before {  
    width: 0;
    height: 1px;
    right: 0;
}
.gnb2 a:hover:before {
    width: 100%;
}

/* 도트 왼 -> 오 */
.gnb3 a:before { 
    width: 4px;
    height: 4px;
    left: 0;
}
.gnb3 a:hover:before {
    /* left: 100%; 또는 calc로 계산해주기 */
    /* left:100%는 부모요소의 끝 점 */
    left: calc(100% - 4px);
}

/* 중앙 -> 바깥쪽 */
.gnb4 a:before {  
    width: 0px;
    height: 1px;
    left: 50%;
    transform: translateX(-50%);
}
.gnb4 a:hover:before {
    width: 100%;
}
/* 바깥쪽 -> 중앙 */
.gnb5 a:before { 
    width: 100%;
    height: 1px;
    left: 50%;
    transform: translateX(-50%);
}
.gnb5 a:hover:before {
    width: 0;
}

/* background 와 background-image의 차이
background-image 속성은 이미지만 추가 할 수 있다. 
background-image: url('xx.jpg')

 

background
background-color repeat no-repeat 및 기타 속성을 추가 

- 이미지 경로 : 절대경로, 상대경로
절대경로 : <a href="http://xxx.co.kr">클릭</a>
상대경로 : 상대적으로 변경될 수 있는 경로 url(../img/xx.jpg)
*/

 

- html 

<!-- 풀 스크린 슬라이더 -->
<!-- 
	tabs - overflow:hidden 
	items - w300% 
    items>div - w33.33333%
-->
    <div class="tab-inner">     
        <input type="radio" name="t" id="tab1" checked>
        <input type="radio" name="t" id="tab2">
        <input type="radio" name="t" id="tab3">
        <div class="tabs">
            <div class="items">
                <div>
                    <h1>Slide Content 01</h1>
                </div>
                <div>
                    <h1>Slide Content 02</h1>
                </div>
                <div>
                    <h1>Slide Content 03</h1>
                </div>
            </div>
        </div>
        <div class="btn">
            <label for="tab1">Graphic</label>
            <label for="tab2">Web Publishing</label>
            <label for="tab3">Logo & CI</label>
        </div>
    </div>

 

- css

/* 풀스크린 슬라이더 css 완성본 */
body {
    padding: 0;
    margin: 0;
}
.tab-inner {
    /* container 기능 */
}

 /* 라디오버튼3개 안보이게 */
input[name=t] {
    display: none;
}

/* div.tabs 는 블럭요소라서 w100%가 디폴트값임 */
.tabs {
    overflow: hidden;

    /* 자식요소가 absolute이면 자식요소가 붕뜸
    부모요소가 자식만큼 높이를 가지고 있다가 높이값 잃음
    높이값을 안주면 overflow:hidden으로 내용이 다 사라짐  */
    position: relative;
    height: 100vh;
}
/* items > div*3 */
.items {
    /* border: 1px solid blue; */
    width: 300%;
    height: 100vh;
    transition: 0.5s;

    position: absolute;
    top: 0;
    left: 0;
}
/* .items div 가 부모요소
div에 before after로 그라디언트를 넣을 것임 
부모요소relative가 없으면 자식:before의 시작 끝을 알 수 없음 */
.items div {
    position: relative;
    height: 100vh;
    float: left;
    /* width: 100%;로 하면 안된다, 33.33333% 로 퍼센트로 나눠야함 */
    width: 33.33333%;
    box-sizing: border-box;
    /* border: 1px solid red; */
}
.items div:nth-child(1) {
    background: url(../img/photo-01.jpg) no-repeat center center;
    background-size: cover;
    background-attachment: fixed;
    /* 이미지가 스크롤되지 않고 고정된 느낌, 이미지만 그대로 있고 content만 바뀌게 보인다. */
}
.items div:nth-child(2) {
    background: url(../img/photo-02.jpg) no-repeat center center fixed;
    background-size: cover;
}
.items div:nth-child(3) {
    background: url(../img/photo-03.jpg) no-repeat center center fixed;
    background-size: cover;
}

/* 비포로 그라이언트 넣기 */
.items div:nth-child(1):before,
.items div:nth-child(2):before,
.items div:nth-child(3):before {
    content: '';
    position: absolute;
    /* 135deg : 왼쪽 상단 -> 오른쪽 하단 */
    width: 100%;
    height: 100%;
}
.items div:nth-child(1):before {
    background: linear-gradient(135deg, gold, transparent);
}
.items div:nth-child(2):before {
    background: linear-gradient(135deg, crimson, transparent);
} 
.items div:nth-child(3):before {
    background: linear-gradient(135deg, royalblue, transparent);
}  

.items div h1 {
    /* 배경위로 텍스트가 올라옴 
    z-index를 주지 않으면 absolute보다 relative가 우선이다 
    같은 relative면 마지막에 적은게 먼저 올라옴*/
    position: relative;
    text-align: center;
    font-size: 130px;
    font-weight: normal;
    color: #fff;
    transform: translateY(-200px);
    opacity: 0;
    transition: 0.5s;

    /* .items가 left로 0 -100% -200%로 밀리면서 배경이 바뀐다.(transition이 0.5s) 
    트랜지션딜레이:0.5s 배경이 바뀌고 나서 그다음에 h1이 상단에서 내려온다.  */
    transition-delay: 0.5s;
}

.btn {
    /* 하단 네비게이션 bottom:0 */
    position: absolute;
    bottom: 0px;
    /* left: 50%;
    transform: translateX(-50%); 
    로 해도 되지만 ,

    absolute -> 인라인블럭이 되기때문에
    w100% ta:c */
    width: 100%;
    height: 50px;
    line-height: 50px;
    text-align: center;
    background: rgba(0, 0, 0, 0.3);
}

.btn label {
    display: inline-block;
    /* 
    네비게이션 
    width: 50px;
    height: 5px;
    background-color: #fff; */
    color: #fff;
    margin: 0 15px;
    cursor: pointer;
}
input[id=tab1]:checked ~ .tabs .items {
    left: 0;
}
input[id=tab2]:checked ~ .tabs .items {
    left: -100%;
}
input[id=tab3]:checked ~ .tabs .items {
    left: -200%;
}
input[id=tab1]:checked ~ .btn label[for=tab1],
input[id=tab2]:checked ~ .btn label[for=tab2],
input[id=tab3]:checked ~ .btn label[for=tab3] {
    color: crimson;
}

input[id=tab1]:checked ~ .tabs .items div:nth-child(1) h1,
input[id=tab2]:checked ~ .tabs .items div:nth-child(2) h1,
input[id=tab3]:checked ~ .tabs .items div:nth-child(3) h1 {
    transform: translateY(200px);
    opacity: 1;
}

풀 스크린 슬라이더 프로토타입(기능만) 

 

 

- html

    <div class="tab-inner">
        <!-- tabs : 가로세로 100%, overflow:hidden -->
        <input type="radio" name="t" id="tab1" checked>
        <input type="radio" name="t" id="tab2">
        <input type="radio" name="t" id="tab3">
        <div class="tabs">
            <div class="items">
                <div>
                    <h1>content1</h1>
                </div>
                <div>
                    <h1>content2</h1>
                </div>
                <div>
                    <h1>content3</h1>
                </div>
            </div>
        </div>
        <div class="btn">
            <label for="tab1"></label>
            <label for="tab2"></label>
            <label for="tab3"></label>
        </div>
    </div>

 

 

- css

body {
    padding: 0;
    margin: 0;
}
.tab-inner {
    /* container */
}
input[name=t] {
    display: none;
}
/* div.tabs는 블럭요소라서 w100%가 디폴트값임 */
.tabs {
    overflow: hidden;

    /* 자식요소 absolute 
    부모요소가 자식만큼 높이를 가지고 있다가 자식absolute되면 부모 높이값 없어짐
    높이값을 안주면 overflow:hidden으로 내용이 다 사라짐  */
    position: relative;
    height: 100vh;
}
/* item > div*3 */
.items {
    /* border: 1px solid blue; */
    width: 300%;
    height: 100vh;
    transition: 0.5s;

    position: absolute;
    top: 0;
    left: 0;
}
.items div {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    float: left;
    
    /* width: 100%;로 하면 한화면에 3칸으로 나누어진다, 33.33333% 로 퍼센트로 나눠야함 */
    width: 33.33333%;
    box-sizing: border-box;
    /* border: 1px solid red; */
}
.items div:nth-child(1) {
    background-color: teal;
}
.items div:nth-child(2) {
    background-color: dodgerblue;
}
.items div:nth-child(3) {
    background-color: yellowgreen;
}
.items div h1 {
    font-size: 80px;
    font-weight: normal;
}

.btn {
    position: absolute;
    bottom: 50px;
    
    /* 중앙정렬
    left: 50%;
    transform: translateX(-50%); 
    로 해도 되지만 ,
    absolute -> 인라인블럭이 되기때문에 너비값없어짐
    w100% ta:c */
    width: 100%;
    text-align: center;
}
.btn label {
    display: inline-block;
    width: 50px;
    height: 5px;
    background-color: #fff;
    cursor: pointer;
}
input[id=tab1]:checked ~ .tabs .items {
    left: 0;
}
input[id=tab2]:checked ~ .tabs .items {
    left: -100%;
}
input[id=tab3]:checked ~ .tabs .items {
    left: -200%;
}
input[id=tab1]:checked ~ .btn label[for=tab1],
input[id=tab2]:checked ~ .btn label[for=tab2],
input[id=tab3]:checked ~ .btn label[for=tab3] {
    background-color: #000;
}

탭 가로,세로 슬라이더 + 도트 navigation

- 가로 탭 슬라이더 와이어프레임

 

 

 

 

- html

        tabs에 overflow:hidden
        items > div*3 / items가 움직인다.

<div class="tab-inner">
        <h1>test</h1>
        <input type="radio" name="tabmenu" id="tab1" checked>
        <input type="radio" name="tabmenu" id="tab2">
        <input type="radio" name="tabmenu" id="tab3">
        <div class="tabs">
            <div class="items">
                <div>content1</div>
                <div>content2</div>
                <div>content3</div>
            </div>
        </div>
        
        <div class="btn">
            <label for="tab1"></label>
            <label for="tab2"></label>
            <label for="tab3"></label>
        </div>
    </div>

- css

body {
    margin: 0;
    padding: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
}
.tab-inner {
    /* container 역할 */
    height: 500px;
    border: 1px solid green;
}
input[name=tabmenu] {
    display: none;
}
.tabs {
    position: relative;
    border: 1px solid red;
    width: 800px;
    height: 400px;
}
.items {
    position: absolute;
    top: 0;
    left: 0;
    width: 2400px;
    height: 400px;
    transition: 0.5s;
}
.items div {
    border: 1px solid blue;
    width: 800px;
    height: 400px;
    float: left;
    box-sizing: border-box;
}
.btn {
    text-align: center;
}
.btn label {
    display: inline-block;
    width: 10px;
    height: 10px;
    background-color: lightgray;
    cursor: pointer;
}
input[id=tab1]:checked ~ .tabs .items {
    left: 0;
}
input[id=tab2]:checked ~ .tabs .items {
    left: -800px;
}
input[id=tab3]:checked ~ .tabs .items {
    left: -1600px;
}
input[id=tab1]:checked ~ .btn label[for=tab1],
input[id=tab2]:checked ~ .btn label[for=tab2],
input[id=tab3]:checked ~ .btn label[for=tab3] {
    background-color: crimson;
}

 

가로 탭 슬라이더 완성

html

<div class="tab-inner">
        <h1>test</h1>
        <input type="radio" name="tabmenu" id="tab1" checked>
        <input type="radio" name="tabmenu" id="tab2">
        <input type="radio" name="tabmenu" id="tab3">
        <div class="tabs">
            <div class="items">
                <div>
                    <img src="img/face-01.jpg" alt="">
                    <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Dolorum quas rem quos optio eaque accusamus veritatis saepe quod numquam obcaecati. Voluptates molestiae natus quis odit minima quam corrupti, accusantium hic!</p>
                    <p>
                        <b>Ackerley</b>
                        Media Analyst at <span>ZenDesk</span>
                    </p>
                </div>
                <div>
                    <img src="img/face-01.jpg" alt="">
                    <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Dolorum quas rem quos optio eaque accusamus veritatis saepe quod numquam obcaecati. Voluptates molestiae natus quis odit minima quam corrupti, accusantium hic!</p>
                    <p>
                        <b>Ackerley</b>
                        Media Analyst at <span>ZenDesk</span>
                    </p>
                </div>
                <div>
                    <img src="img/face-01.jpg" alt="">
                    <p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Dolorum quas rem quos optio eaque accusamus veritatis saepe quod numquam obcaecati. Voluptates molestiae natus quis odit minima quam corrupti, accusantium hic!</p>
                    <p>
                        <b>Ackerley</b>
                        Media Analyst at <span>ZenDesk</span>
                    </p>
                </div>
            </div>
        </div>
        <div class="btn">
            <label for="tab1"></label>
            <label for="tab2"></label>
            <label for="tab3"></label>
        </div>
    </div>

 

css

.tab-inner {
    /* container 역할 */
    height: 500px;
    /* border: 1px solid green; */
}
.tab-inner h1 {
    text-align: center;
}
input[name=tabmenu] {
    display: none;
}
.tabs {
    position: relative;
    /* border: 1px solid red; */
    width: 800px;
    height: 400px;
    overflow: hidden;
}
.items {
    position: absolute;
    top: 0;
    left: 0;
    width: 2400px;
    height: 400px;
    transition: 0.5s;
}
.items div {
    /* border: 1px solid blue; */
    padding: 50px;
    width: 800px;
    height: 400px;
    float: left;
    box-sizing: border-box;
    text-align: center;
}
.items div img {
    width: 100px;
    border-radius: 50%;
}
.items div p b {
    display: block;
}
.items div p span {
    color: orange;
}
.btn {
    text-align: center;
}
.btn label {
    display: inline-block;
    width: 10px;
    height: 10px;
    background-color: lightgray;
    cursor: pointer;
}
input[id=tab1]:checked ~ .tabs .items {
    left: 0;
}
input[id=tab2]:checked ~ .tabs .items {
    left: -800px;
}
input[id=tab3]:checked ~ .tabs .items {
    left: -1600px;
}

input[id=tab1]:checked ~ .btn label[for=tab1],
input[id=tab2]:checked ~ .btn label[for=tab2],
input[id=tab3]:checked ~ .btn label[for=tab3] {
    background-color: crimson;
    border-radius: 50%;
}

 

 

 

- 세로 탭 슬라이더 (가로 슬라이더에서 css만 수정)

/* items의 가로너비를 800px로 바꾸고 items위치 top으로 조정 */
.items {
    position: absolute;
    top: 0;
    left: 0;
    /* width: 2400px; */
    width: 800px;
    height: 400px;
    transition: 0.5s;
}
input[id=tab1]:checked ~ .tabs .items {
    /* left: 0; */
    top: 0;
}
input[id=tab2]:checked ~ .tabs .items {
    /* left: -800px; */
    top: -400px;
}
input[id=tab3]:checked ~ .tabs .items {
    /* left: -1600px; */
    top: -800px;
}

 

 

- html

슬라이드 이미지1, 2, 3 중에 한개만 보이고 나머지 이미지는 hideen 

slide - overflow:hidden

slide-inner - width:900px

<div class="tab-inner">
        <input type="radio" name="tabmenu" id="tab1" checked>
        <input type="radio" name="tabmenu" id="tab2">
        <input type="radio" name="tabmenu" id="tab3">
        <div class="slide">
            <div class="slide-inner">
                <a href="#none1">
                    <img src="img/tabmenu/slide-01.jpg" alt="">
                </a>
                <a href="#none1">
                    <img src="img/tabmenu/slide-02.jpg" alt="">
                </a>
                <a href="#none1">
                    <img src="img/tabmenu/slide-03.jpg" alt="">
                </a>
            </div>
        </div>
        <div class="btn">
            <label for="tab1"></label>
            <label for="tab2"></label>
            <label for="tab3"></label>
        </div>
</div>

 

- css

body {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
}
.tab-inner {
    width: 300px;
    height: 350px;
}
input[name=tabmenu] {
    display: none;
}
.slide {
    /* 자식요소가 absolute, float -> 부모요소 높이값을 잃는다. 높이값 추가*/
    position: relative;
    width: 300px;  
    height: 300px;
    overflow: hidden;
}
.slide-inner {
    position: absolute;
    width: 900px;
    font-size: 0;
/* w900px 이미지 오른쪽 마진때문에 밑으로 내려간다.
  1. 폰트사이즈0 : 마진이 폰트의 특성임 
  2.오른쪽마진: -6px 
*/
    top: 0;
    left: 0;
    transition: 0.5s;
}
.btn {
    text-align: center;
    margin-top: 10px;
}
.btn label {
    display: inline-block;
    width: 20px;
    height: 20px;
    background-color: lightgray;
    border-radius: 50%;
    cursor: pointer;
}
input[id=tab1]:checked ~ .slide .slide-inner {
    left: 0;
}
input[id=tab2]:checked ~ .slide .slide-inner {
    left: -300px;
}
input[id=tab3]:checked ~ .slide .slide-inner {
    left: -600px;
}
input[id=tab1]:checked ~ .btn label[for=tab1],
input[id=tab2]:checked ~ .btn label[for=tab2],
input[id=tab3]:checked ~ .btn label[for=tab3] {
    background-color: crimson;
}

- 21/08/10 수정 

*완성본 탭버튼3개 

 

1. 도트 네비게이션 클릭하면 색상 변경, 순서에 맞게 이미지 변경

label로 버튼 만들고 <input type=radio>와 label을 연결해서 input:checked 되면 이미지 변경, 버튼 백그라운드 변경  

탭메뉴에 라디오 버튼을 이용하면 다중선택을 막을 수 있다.

 

- html

맨 처음 radio는 checked 넣기 

    <div class="tab-inner">
        <input type="radio" name="tabmenu" id="tab1" checked>
        <input type="radio" name="tabmenu" id="tab2">
        <input type="radio" name="tabmenu" id="tab3">
        <div class="content slide1">
            <img src="img/tabmenu/slide-01.jpg" alt="">
        </div>
        <div class="content slide2">
            <img src="img/tabmenu/slide-02.jpg" alt="">
        </div>
        <div class="content slide3">
            <img src="img/tabmenu/slide-03.jpg" alt="">
        </div>
        <!-- 탭버튼 -->
        <div class="btn">
            <label for="tab1"></label>
            <label for="tab2"></label>
            <label for="tab3"></label>
        </div>
    </div>

 

- css 

인접선택자 + :  바로 밑에 있는 요소만 가능함

형제선택자 ~ : 형제 중에 선택 

 

position: absolute -> 인라인블럭으로 변경됨, width값 사라짐
width: 100% 필요 

.tab-inner {
    position: relative;
    width: 300px;
    height: 350px; 
}
input[name=tabmenu] {
    display: none;
}
.content {
    opacity: 0;
    position: absolute;
}
.btn {
    position: absolute;
    text-align: center;
    bottom: 10px;
    width: 100%;
}
.btn label {
    display: inline-block;
    width: 20px;
    height: 20px;
    background-color: lightgray;
    border-radius: 50%;
    cursor: pointer;
}
input[id=tab1]:checked ~ .slide1,
input[id=tab2]:checked ~ .slide2,
input[id=tab3]:checked ~ .slide3 {
	opacity: 1;
	/* visibility: visible; */
}
.tab-container input[id=tab1]:checked ~ .btn label[for=tab1],
.tab-container input[id=tab2]:checked ~ .btn label[for=tab2],
.tab-container input[id=tab3]:checked ~ .btn label[for=tab3] {
    background-color: crimson;
}

 

2. visibility 써야하는 이유 

이미지opacity: 0; -> checked되면 opacity: 1; 을 줘서 보이게 되어있는데, 여기서 opacity를 주석처리하면

3번째 이미지(.slide3)가 맨위로 올라오게 된다. 

.content {
	position: absolute;
	/* opacity: 0; */
	/* visibility: hidden;
}

 

 

이미지를 누를 수 있게 이미지 3개를 a태그로 감싸기 ( href를 #1 #2 #3로 설정 ) 

- 이미지에 opacity0 다시 넣기

<div class="content slide1">
 <a href="#1">
  <img src="../../../../images/tabcontent/tabcontent-01.jpg" alt="">
 </a>
</div>
...

 

어느 탭을 눌러도 다 #3 으로 연결된다.

이미지에 visibility: hidden; 넣고 클릭되면 visibility: visible;로 변경하면 a링크가 제대로 간다.

.content {
	opacity: 0;
	position: absolute;
	visibility: hidden;
}
input[id=tab1]:checked ~ .slide1,
input[id=tab2]:checked ~ .slide2,
input[id=tab3]:checked ~ .slide3 {
	opacity: 1;
	visibility: visible;
}

 

 

3. 트랜지션 추가 

.content {
	opacity: 0;
	position: absolute;
	visibility: hidden;
   	transition: .5s; 
}

 

 

4. 배너 추가하기 

 

.content 밑에 div 생성

span으로 따로 묶은이유는 fz 다르게 하기 위해서 이다.

			<div class="heading">
				<div class="text1">Sale <span>50%</span></div>
				<div class="text2">Sale <span>30%</span></div>
				<div class="text3">Sale <span>20%</span></div>
			</div>
.text1,
.text2,
.text3 {
	position: absolute;
	padding-top: 10px;
	box-sizing: border-box;
	top: 20px;
	left: 20px;
	width: 100px;
	height: 100px;
	background-color: crimson;
	color: #fff;
	font-size: 30px;
	font-weight: bold;
	text-align: center;
	border-radius: 50%;
	opacity: 0;
	transform: translateY(-50px);
	transition: .3s;
}
.text2 {
	background-color: dodgerblue;
}
.text3 {
	background-color: yellowgreen;
}
.text1 span,
.text2 span,
.text3 span {
	font-size: 25px;
}

input[id=tab1]:checked ~ .heading .text1,
input[id=tab2]:checked ~ .heading .text2,
input[id=tab3]:checked ~ .heading .text3 {
	opacity: 1;
	transform: translateY(0);
	transition-delay: .5s;
}

+ Recent posts