1.sassを使ったページ作成
2.jqueryでカレント表示
3.srcsetを使って画像を差し替える
4.clip-pathを使った表現
5.AOSを使ったスクロールアニメーション
6.ajaxを使ってSVGアニメーションを外部ファイル化&クッキーを使って1回のみ表示
7.resizeイベントを使用したナビゲーション
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sassを使ったシングルページ</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<header>
<div class="header_inner">
<h1>サイトタイトル</h1>
<p>タグライン</p>
</div>
<nav id="g-nav">
<ul>
<li id="list01" class="current"><a href="#content01">コンテンツ1</a></li>
<li id="list02"><a href="#content02">コンテンツ2</a></li>
<li id="list03"><a href="#content03">コンテンツ3</a></li>
<li id="list04"><a href="#content04">コンテンツ4</a></li>
<li id="list05"><a href="https://www.yahoo.co.jp/">外部サイトへ</a></li>
</ul>
</nav>
</header>
<div class="main">
<div class="key-visual">
<picture>
<source media="(min-width:1200px)" srcset="img/pc.jpg 1200w" sizes="1200px">
<source media="(min-width:960px)" srcset="img/pc.jpg 1200w" sizes="100vw">
<source media="(min-width:641px)" srcset="img/tab.jpg 960w" sizes="100vw">
<img media="(max-width:640px)" srcset="img/sp.jpg 640w" sizes="100vw">
</picture>
</div>
<div class="box" id="content01">
<div class="box-inner">
<p class="photo" data-aos="fade-left"><img src="https://placehold.jp/3d4070/ffffff/600x400.jpg" alt=""></p>
<p class="txt" data-aos="fade-left" data-aos-delay="200">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostr</p>
</div>
</div>
<div class="box" id="content02">
<div class="box-inner">
<p class="photo" data-aos="fade-right"><img src="https://placehold.jp/3d4070/ffffff/600x400.jpg" alt=""></p>
<p class="txt" data-aos="fade-right" data-aos-delay="200">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostr</p>
</div>
</div>
<div class="box" id="content03">
<div class="box-inner">
<p class="photo" data-aos="fade-left"><img src="https://placehold.jp/3d4070/ffffff/600x400.jpg" alt=""></p>
<p class="txt" data-aos="fade-left" data-aos-delay="200">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostr</p>
</div>
</div>
<div class="box" id="content04">
<div class="box-inner">
<p class="photo" data-aos="fade-right"><img src="https://placehold.jp/3d4070/ffffff/600x400.jpg" alt=""></p>
<p class="txt" data-aos="fade-right" data-aos-delay="200">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostr</p>
</div>
</div>
</div>
<div class="curtain">
<p id="svg-logo-box">
</p>
</div>
<footer>
<a href="#" id="to-top">
<p class="to-top-btn">ページトップに戻る</p>
</a>
</footer>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="js/script.js"></script>
<script src="js/aos.js"></script>
<script src="js/jquery.cookie.js"></script>
<script>
$(window).on('load resize',function(){
if(window.matchMedia('(min-width:768px)').matches){
AOS.init();
}
});
</script>
<script>
$.ajax({
url: 'img/logo2.svg',
})
.then(
function(data){
var svg = $(data).find('svg');
$('#svg-logo-box').append(svg);
},
function(){
alert('読み込み失敗');
});
if($.cookie('access')){
$('.curtain').hide();
}else{
$('.curtain').delay(4000).fadeOut(400);
}
$(window).load(function(){
$.cookie('access',$('body').addClass('access'));
});
</script>
</body>
</html>
@import "_reset.scss";
@import "_aos.scss";
header{
width: 100%;
background:#FFF;
display: flex;
padding:0 20px;
position: fixed;
top: 0;
left: 0;
z-index: 100;
border-bottom: 4px solid darkslategray;
.headerinner{
width: 40%;
>h1{
padding: 10px 0;
}
>p{
margin-bottom: 10px;
}
}
#g-nav{
width: 60%;
>ul{
display: flex;
justify-content: center;
>li{
height: 50px;
margin:0 10px;
>a{
display: block;
padding: 32px 0 18px;
text-align: center;
color: #006c6c;
font-weight: bold;
&::after{
display: block;
content: "";
width: 0;
height: 6px;
background-color: #006c6c;
transition:0.2;
}
}
&.current>a::after{
width: 100%;
}
}
}
}
}
.main{
padding-top:120px;
}
.key-visual{
max-width: 1200px;
margin: 100px auto;
img{
max-width: 100%;
}
}
.box{
height: 120vh;
clip-path: polygon(0 0,100% 0,100% 90%,0 100%);
&:nth-of-type(even){
background-color: darkslategray;
clip-path: polygon(0 10%,100% 0,100% 90%,0 100%);
}
.box-inner{
max-width: 600px;
margin: 0 auto;
padding-top: 160px;
position: relative;
>.txt{
width: 300px;
height: 200px;
padding: 20px;
background-color: darkslategray;
color: #FFF;
position:absolute;
right: -180px;
bottom: -50px;
}
}
&:nth-of-type(odd) .txt{
left: -180px;
background-color: #FFF;
color: #222;
}
}
.curtain{
width: 100%;
height: 100vh;
background-color: #FFF;
position: fixed;
top:0;
left: 0;
z-index: 1000;
}
#svg-logo-box{
width: 300px;
margin: 100px auto 0;
}
.svg-logo{
fill:#FFF;
stroke:#F90000;
stroke-width:2px;
stroke-dasharray: 640px;
stroke-dashoffset: 640px;
animation: logo-anime 1s 0.5s forwards linear;
}
@keyframes logo-anime{
0%{stroke-dashoffset: 640px;}
100%{stroke-dashoffset: 0;}
}
footer{
width: 100%;
height: 200px;
background:darkslategray;
}
.to-top-btn{
width: 50px;
height: 50px;
border-radius: 50%;
background:darkslategray;
border: 2px solid #FFF;
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
position: fixed;
right: 60px;
bottom: 60px;
&::before{
display: block;
content: "";
width: 20px;
height: 20px;
border-top: 2px solid #FFF;
border-right: 2px solid #FFF;
transform: rotate(-45deg);
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
}
}
script.js
$(function(){
var div01 = $('#content01').offset().top;
var div02 = $('#content02').offset().top - 50;
var div03 = $('#content03').offset().top - 50;
var div04 = $('#content04').offset().top - 50;
$(window).scroll(function(){
var posScroll=($(this).scrollTop());
if(0<=posScroll && posScroll<div02){
$('#list01').addClass('current').siblings('li').removeClass('current');
}else if(div02<=posScroll && posScroll<div03){
$('#list02').addClass('current').siblings('li').removeClass('current');
}else if(div03<=posScroll && posScroll<div04){
$('#list03').addClass('current').siblings('li').removeClass('current');
}else if(div04<=posScroll){
$('#list04').addClass('current').siblings('li').removeClass('current');
}
});
$('#to-top').on('click', function () {
$('html,body').animate({ scrollTop: 0 },200);
});
});