地鶏割烹IRORI

和食居酒屋
クリエイター: Leyco
縦書きを含む和風居酒屋のトップページです。Javascriptはドロワー、画像のフェードイン、メニュー部分の縦線の動きに使用していますが、任意ですので難しい場合にはJSなしで挑戦してみましょう。
ソースコード
HTML
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>地鶏割烹IRORI</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
href="https://fonts.googleapis.com/css2?family=Cinzel&family=Noto+Serif+JP:wght@400;600&family=Zen+Kaku+Gothic+New:wght@400;500;700&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="assets/css/destyle.css">
<link rel="stylesheet" href="assets/css/style.css">
<link rel="icon" href="assets/img/favicon.ico">
</head>
<body>
<header>
<div class="header__flex">
<h1 class="header__logo"><a href="#"><img src="assets/img/logo.png" alt="地鶏割烹IRORI"></a></h1>
<div class="header__navi">
<div class="header__navi__open">
<span></span>
<span></span>
<span></span>
</div>
<ul id="header__navi__li">
<li class="header__navi__changeColor"><a href="#menu">お品書き</a></li>
<li class="header__navi__changeColor"><a href="#news">お知らせ</a></li>
<li class="header__navi__changeColor"><a href="#info">店舗案内</a></li>
<li class="header__navi__btn"><a href="#">お問い合わせ</a></li>
</ul>
</div>
</div>
<div class="header__fv">
<div class="fadeIn"><img src="assets/img/logo_white.png" alt="ロゴ"></div>
</div>
</header>
<main>
<!------導入------->
<section class="section__start">
<div class="container__top">
<div class="container__top__text">
<h2 class="font_lg js-fade">最高の一品を味わう</h2>
<div class="mark js-fade"><img src="assets/img/mark.png" alt=""></div>
<p class="font_md js-fade">厳選された比内地鶏をはじめ<br>
旬の魚や季節の野菜を使った<br>
最高の一品をお作りしています<br>
隠れ家のような店内で<br>
日本酒と料理をお楽しみください</p>
</div>
<div class="container__top__img js-fade"><img src="assets/img/about.jpg" alt="厨房の様子の画像"></div>
</div>
</section>
<!--------お品書き--------->
<section id="menu" class="section__main">
<div class="container__main">
<h2>お品書き</h2>
<div class="menu__main">
<div class="menu__item tx_r">
<div class="menu__item__img js-slide-left"><img src="assets/img/menu_yakitori.jpg" alt="焼き鶏の画像"></div>
<div class="menu__item__text">
<div class="menu__item__text__title">
<p class="menu__item__text__ja c-marker js-markerScrollAnimation">焼き鶏</p>
<p class="menu__item__text__en">YAKITORI</p>
</div>
<div class="menu__item__text__detail">
<p>ここにテキストが入りますここにテキストが入りますここにテキストが入ります</p>
<p class="p_bd">1,500yen~</p>
</div>
</div>
</div>
<div class="menu__item tx_l">
<div class="menu__item__img js-slide-left"><img src="assets/img/menu_otsukuri.jpg" alt="お造りの画像"></div>
<div class="menu__item__text">
<div class="menu__item__text__title">
<p class="menu__item__text__ja">お造り</p>
<p class="menu__item__text__en">OTSUKURI</p>
</div>
<div class="menu__item__text__detail">
<p>ここにテキストが入りますここにテキストが入りますここにテキストが入ります</p>
<p class="p_bd">1,500yen~</p>
</div>
</div>
</div>
<div class="menu__item tx_r">
<div class="menu__item__img js-slide-left"><img src="assets/img/menu_mizutaki.jpg" alt="水炊きの画像"></div>
<div class="menu__item__text">
<div class="menu__item__text__title">
<p class="menu__item__text__ja js-line-slide">水炊き</p>
<p class="menu__item__text__en">MIZUTAKI</p>
</div>
<div class="menu__item__text__detail">
<p>ここにテキストが入りますここにテキストが入りますここにテキストが入ります</p>
<p class="p_bd">1,500yen~</p>
</div>
</div>
</div>
</div>
<div class="menu__sub">
<h3>おすすめの一皿</h3>
<table>
<tbody>
<tr>
<th>地鶏竜田揚</th>
<td>1,000yen</td>
</tr>
<tr>
<th>旬魚のカルパッチョ</th>
<td>1,000yen</td>
</tr>
<tr>
<th>季節野菜の彩サラダ</th>
<td>1,000yen</td>
</tr>
<tr>
<th>自家製だし巻き玉子</th>
<td>1,000yen</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!------お知らせ------->
<section class="js-fade section__main" id="news">
<div class="container__main">
<div class="title_flex">
<h2>お知らせ</h2>
<img src="assets/img/mark.png" alt="">
<p>NEWS</p>
</div>
<ul class="news__list">
<li><a href="#">
<p>2024.XX.XX</p>
<p>ここにテキストが入ります。</p>
</a>
</li>
<li><a href="#">
<p>2024.XX.XX</p>
<p>ここにテキストが入ります。</p>
</a>
</li>
<li><a href="#">
<p>2024.XX.XX</p>
<p>ここにテキストが入ります。</p>
</a>
</li>
</ul>
</div>
</section>
<!------map---------->
<section id="map">
<iframe
src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d6483.500935083426!2d139.69319484317668!3d35.658519090378!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x60188b562ec4d62f%3A0x1bcc5680aa0a44e2!2z44CSMTUwLTAwNDMg5p2x5Lqs6YO95riL6LC35Yy66YGT546E5Z2C!5e0!3m2!1sja!2sjp!4v1710223549291!5m2!1sja!2sjp"
width="100%" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade">
</iframe>
</section>
<!---------店舗案内---------->
<section class="js-fade section__main" id="info">
<div class="container__main">
<div class="info__img"><img src="assets/img/info.jpg" alt="外観の画像"></div>
<div class="info__text">
<div class="title_flex">
<h2>店舗案内</h2>
<img src="assets/img/mark.png" alt="">
<p>INFORMATION</p>
</div>
<div class="info__text__detail">
<p>地鶏割烹 IRORI</p>
<ul>
<li class="c-marker js-markerScrollAnimation">〒150-0043 東京都渋谷区道玄坂X-XX-XX</li>
<li>TEL/ 090-XXXX-XXXX</li>
<li>MAIL/ info@irori.com</li>
<li>営業時間/17:00〜24:00(L.O 23:30)</li>
<li>定休日/毎週月曜日・年末年始</li>
</ul>
<a href="#">WEB予約はこちら</a>
</div>
</div>
</div>
</section>
</main>
<footer class="js-fade">
<ul class="footer__navi">
<li><a href="#menu">お品書き</a></li>
<li><a href="#news">お知らせ</a></li>
<li><a href="#info">店舗案内</a></li>
<li><a href="#">お問い合わせ</a></li>
</ul>
<ul class="footer__sns">
<li><a href="#"><img src="assets/img/logo_insta.png" alt="インスタグラム"></a></li>
<li><a href="#"><img src="assets/img/logo_x.png" alt="エックス"></a></li>
<li><a href="#"><img src="assets/img/logo_fb.png" alt="フェイスブック"></a></li>
</ul>
<p class="footer__copy">©2024 地鶏割烹 IRORI</p>
</footer>
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<script src="assets/main.js"></script>
</body>
</html>
CSS
@charset "utf-8";
/*----------------------共通設定----------------------------*/
:root {
--baseColor: #2c2c2c;
--subColor: #c2c2c2;
--white: #ffffff;
--mgBg: 60px;
--mgMd: 30px;
--mgSm: 15px;
}
html {
scroll-behavior: smooth;
/*----スクロールでセクションがヘッダーに重ならないための設定----*/
scroll-padding-top: 100px;
}
body {
width: 100%;
font-family: "Zen Kaku Gothic New", sans-serif;
font-weight: 400;
font-style: normal;
color: var(--baseColor);
letter-spacing: 0.1em;
overflow-x: hidden;
background-image: url("../img/bg_main.jpg");
background-position: 0 0;
background-attachment: fixed;
background-repeat: no-repeat;
background-size: cover;
}
img {
width: 100%;
object-fit: cover;
}
p {
font-size: 16px;
line-height: 2;
}
.p_bd {
font-weight: 600;
}
a {
opacity: 1;
transition: all 0.5s ease;
}
a:hover {
opacity: 0.7;
}
/*-----縦書きフォント----*/
.font_lg {
display: block;
font-family: "Noto Serif JP", serif;
font-weight: 600;
font-style: normal;
letter-spacing: 0.3em;
font-size: 24px;
writing-mode: vertical-rl;
color: var(--baseColor);
}
.font_md {
display: block;
font-family: "Noto Serif JP", serif;
font-weight: 400;
font-style: normal;
font-size: 18px;
writing-mode: vertical-rl;
letter-spacing: 0.2em;
line-height: 2em;
}
/*------------jsでフェードイン-------------*/
.js-fade {
opacity: 0;
visibility: hidden;
transform: translateY(50px);
transition: all 1s;
}
.scroll {
opacity: 1;
visibility: visible;
transform: translateY(0px);
}
.js-slide-left {
opacity: 0;
visibility: hidden;
transform: translateX(-50px);
transition: all 1s;
}
.slide-left {
opacity: 1;
visibility: visible;
transform: translateX(0px);
}
/*-------アニメーション-------*/
@keyframes fadeInAnime {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/*-----------ヘッダーナビ-------------*/
header {
position: relative;
}
.header__flex {
display: flex;
justify-content: space-between;
align-items: center;
height: 80px;
width: 100%;
position: fixed;
background-color: var(--white);
z-index: 100;
}
.header__logo {
width: 170px;
margin-left: 10px;
}
#header__navi__li {
position: fixed;
z-index: 999;
top: 0;
right: -2000px;
width: 100%;
height: 100vh;
background: var(--baseColor);
transition: all 0.6s;
padding-top: 150px;
font-size: 20px;
}
/*アクティブクラスがついたら位置を0に*/
#header__navi__li.panelactive {
right: 0;
}
/*リストのレイアウト設定*/
#header__navi__li li a {
display: block;
text-align: center;
padding: 35px 0;
}
.header__navi__changeColor a,
.header__navi__btn a {
color: var(--white);
opacity: 1;
}
/*-------------ハンバーガー---------------*/
.header__navi__open {
position: fixed;
z-index: 9999;
top: 10px;
right: 20px;
cursor: pointer;
width: 50px;
height: 50px;
}
/*ボタン内側*/
.header__navi__open span {
display: inline-block;
transition: all .4s;
/*アニメーションの設定*/
position: absolute;
left: 14px;
height: 1px;
border-radius: 2px;
background: var(--baseColor);
}
.header__navi__open span:nth-of-type(1) {
top: 15px;
width: 40px;
}
.header__navi__open span:nth-of-type(2) {
top: 26px;
width: 40px;
}
.header__navi__open span:nth-of-type(3) {
top: 37px;
width: 40px;
}
/*---activeでの動き---*/
.header__navi__open.active span:nth-of-type(1) {
top: 18px;
left: 18px;
transform: translateY(6px) rotate(-135deg);
background-color: var(--white);
}
.header__navi__open.active span:nth-of-type(2) {
opacity: 0;
}
.header__navi__open.active span:nth-of-type(3) {
top: 30px;
left: 18px;
transform: translateY(-6px) rotate(135deg);
background-color: var(--white);
}
/*-------FV部分-------*/
.header__fv {
width: 100%;
height: 100vh;
background-image: url("../img/FV.jpg");
background-position: center center;
background-size: cover;
background-repeat: no-repeat;
background-attachment: fixed;
}
.header__fv img {
position: absolute;
width: 100px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.fadeIn {
animation-name: fadeInAnime;
animation-duration: 3s;
animation-fill-mode: forwards;
opacity: 0;
}
/*---------導入-------*/
.section__start {
padding: var(--mgBg) 20px;
}
.container__top {
width: 100%;
}
.container__top__text {
display: flex;
flex-direction: row-reverse;
max-width: 270px;
margin: 0 auto var(--mgMd) auto;
justify-content: space-around;
}
.mark {
margin-top: 100px;
}
.mark img {
width: 40px;
object-fit: contain;
}
/*---------お品書き--------*/
/*---セクション共通余白の調整*/
.section__main {
padding: var(--mgMd) 20px;
}
#menu {
background-image: url("../img/bg_menu.png");
background-repeat: no-repeat;
background-attachment: fixed;
background-position: 0 0;
background-size: cover;
}
#menu h2 {
display: block;
font-family: "Noto Serif JP", serif;
font-weight: 400;
font-style: normal;
letter-spacing: 0.2em;
font-size: 24px;
color: var(--white);
text-align: center;
margin-bottom: var(--mgMd);
}
.menu__item {
margin-bottom: var(--mgMd);
}
.menu__item__text {
display: flex;
justify-content: space-between;
}
.menu__item__text__title {
display: flex;
width: 20%;
}
.menu__item__text p {
color: var(--white);
}
.menu__item__text__ja {
position: relative;
display: block;
font-family: "Noto Serif JP", serif;
font-weight: 600;
font-style: normal;
letter-spacing: 0.3em;
font-size: 24px;
writing-mode: vertical-rl;
padding: 30px 10px 0 0;
}
.menu__item__text__ja::after {
position: absolute;
content: "";
top: 0;
right: 0;
width: 1px;
height: 0;
background-color: #ffffff6b;
transition: all 1.5s;
opacity: 0;
}
.menu__item__text__ja.active::after {
opacity: 1;
height: 160px;
}
.menu__item__text__en {
display: block;
font-family: "Cinzel", serif;
font-optical-sizing: auto;
font-weight: 400;
font-style: normal;
font-size: 14px;
color: white;
writing-mode: vertical-rl;
text-orientation: sideways;
padding: 30px 0 0 5px;
}
.menu__item__text__detail {
max-width: 240px;
width: 80%;
padding-top: 25px;
}
/*---サブメニュー---*/
.menu__sub {
padding: var(--mgMd) 10px;
background-color: #fffffff5;
}
.menu__sub h3 {
display: block;
font-family: "Noto Serif JP", serif;
font-weight: 400;
font-style: normal;
font-size: 20px;
letter-spacing: 0.2em;
line-height: 34px;
border-bottom: 1px solid var(--subColor);
padding-bottom: 3px;
}
.menu__sub th {
padding-top: var(--mgSm);
width: 100%;
font-weight: 500;
}
.menu__sub td {
padding-top: var(--mgSm);
width: 100%;
text-align: right;
font-weight: 600;
}
/*---------お知らせ------------*/
.title_flex {
display: flex;
align-items: baseline;
}
.title_flex>h2 {
display: block;
font-family: "Noto Serif JP", serif;
font-weight: 600;
font-style: normal;
letter-spacing: 0.1em;
font-size: 24px;
}
.title_flex>img {
width: 30px;
}
.title_flex>p {
display: block;
font-family: "Cinzel", serif;
font-optical-sizing: auto;
font-weight: 400;
font-style: normal;
font-size: 14px;
color: var(--subColor);
}
.news__list li {
padding: var(--mgSm) 0 var(--mgSm) 5px;
border-bottom: 1px solid var(--subColor);
}
/*------map-------*/
#map iframe {
height: 200px;
filter: grayscale(1);
}
/*---------店舗案内--------*/
.info__img {
margin-bottom: var(--mgMd);
}
.info__text__detail {
margin-top: var(--mgMd);
}
.info__text__detail p {
font-weight: 600;
}
.info__text__detail li {
margin-top: 10px;
font-weight: 500;
}
.info__text__detail a {
display: inline-block;
padding: 10px 30px;
background-color: var(--baseColor);
color: var(--white);
margin-top: 20px;
}
/*------footer------*/
footer {
width: 100%;
background-color: var(--baseColor);
color: white;
}
.footer__navi li {
padding-top: var(--mgMd);
text-align: center;
}
.footer__sns {
display: flex;
justify-content: center;
padding: var(--mgBg) 0 20px 0;
}
.footer__sns img {
padding: 0 20px;
}
.footer__copy {
font-size: 14px;
padding-bottom: 20px;
text-align: center;
}
/*-----------レスポンシブ-------------*/
@media screen and (min-width:1000px) {
/*共通設定*/
:root {
--mgBg: 120px;
--mgMd: 60px;
--mgSm: 30px;
}
/*------セクション余白設定------*/
.section__start {
padding: var(--mgBg) 0;
}
.section__main {
padding: var(--mgMd) 0;
}
/*------ヘッダー調整-----*/
.header__flex {
padding-right: 0;
}
#header__navi__li {
position: relative;
top: 0;
right: 0;
align-items: center;
width: 100%;
height: 80px;
background: var(--white);
padding: 0 0 0 20px;
display: flex;
font-size: 16px;
}
#header__navi__li li a {
padding: 31px 30px;
}
.header__navi__changeColor a {
color: var(--baseColor);
padding: 30px 40px;
}
.header__fv img {
width: 150px;
}
/*-----お問い合わせボタン----*/
.header__navi__btn a {
background: var(--baseColor);
transition: all 0.5s ease;
opacity: 1;
}
.header__navi__btn a:hover {
opacity: 0.7;
}
/*--------ハンバーガーアイコン非表示------*/
.header__navi__open {
display: none;
}
/*-----縦書きフォント---*/
.font_lg {
font-size: 32px;
}
/*---------導入-------*/
.container__top {
max-width: 650px;
margin: 0 auto;
}
.container__top__text {
display: flex;
flex-direction: row-reverse;
max-width: 500px;
margin: 0 auto var(--mgMd) auto;
justify-content: space-around;
}
.mark {
margin-top: 100px;
}
.mark img {
width: 80px;
}
/*---------お品書き--------*/
.container__main {
width: 100%;
max-width: 1000px;
margin: 0 auto;
}
#menu h2 {
font-size: 32px;
}
/*---------メニューアイテム横並び------*/
.menu__item__img {
width: 50%;
}
.menu__item {
display: flex;
justify-content: space-between;
}
.menu__item.tx_l {
flex-direction: row-reverse;
}
/*--テキスト部分を縦並びにする--*/
.menu__item__text {
flex-direction: column;
width: calc(50% - 60px);
justify-content: space-between;
}
.tx_l .menu__item__text {
align-items: flex-end;
}
.menu__item__text__title {
width: 100%;
}
/*-------右側にしたい部分を指定する-----*/
.tx_r .menu__item__text__title {
justify-content: right;
}
.tx_l .menu__item__text__detail {
justify-content: right;
width: 100%;
}
.menu__item__text__ja {
font-size: 39px;
padding: 0 10px 0 0;
}
.menu__item__text__ja::after {
right: -5px;
}
.menu__item__text__ja.active::after {
height: 290px;
right: -5px;
}
.menu__item__text__en {
padding: 0 0 0 5px;
}
.menu__item__text__detail {
padding-top: 0;
}
/*----テキストと価格の余白設定----*/
.menu__item__text__detail>p:first-of-type {
margin-bottom: 30px;
}
/*---サブメニュー---*/
.menu__sub {
padding: var(--mgMd) 50px;
}
.menu__sub h3 {
font-size: 24px;
padding: 0 0 10px 20px;
}
.menu__sub th {
padding: var(--mgSm) 0 0 20px;
}
.menu__sub td {
padding: var(--mgSm) 20px 0 0;
}
/*---------お知らせ---------*/
#news .container__main {
display: flex;
}
.title_flex {
align-items: start;
position: relative;
width: 20%;
}
.title_flex>h2 {
font-size: 32px;
letter-spacing: 0.2em;
writing-mode: vertical-rl;
}
.title_flex>img {
position: absolute;
content: "";
top: 160px;
left: -10px;
width: 60px;
height: 50px;
}
.title_flex>p {
writing-mode: vertical-rl;
text-orientation: sideways;
}
.news__list {
width: 80%;
}
/*------map-------*/
#map iframe {
height: 400px;
}
/*---------店舗案内--------*/
#info.section__main{
padding-bottom:var(--mgBg);
}
#info .container__main {
display: flex;
justify-content: space-between;
}
.info__text {
width: calc(50% - 85px);
display: flex;
flex-direction: column;
justify-content: space-between;
}
.info__text .title_flex {
width: 100%;
justify-content: right;
}
.info__text .title_flex>img {
left: 335px;
}
.info__img {
width: 50%;
margin-bottom: 0;
}
.info__text__detail {
margin: 0;
}
/*------footer------*/
footer {
width: 100%;
background-color: var(--baseColor);
color: var(--white);
}
.footer__navi {
display: flex;
justify-content: center;
}
.footer__navi li {
padding: var(--mgMd) 30px 0 30px;
text-align: center;
}
/*-------ナビの間に横線を引く-------*/
.footer__navi li+li {
position: relative;
}
.footer__navi li+li::before {
content: "";
display: block;
height: 19px;
border-left: 1px solid var(--white);
position: absolute;
top: 60px;
right: 0;
left: 0;
margin: auto;
}
}
JS
$(function () {
$(window).scroll(function () {
$('.js-fade').each(function () {
var pos = $(this).offset().top;
var scroll = $(window).scrollTop();
var windowHeight = $(window).height();
if (scroll > pos - windowHeight + 100) {
$(this).addClass('scroll');
}
});
});
});
$(function () {
$(window).scroll(function () {
$('.js-slide-left').each(function () {
var pos = $(this).offset().top;
var scroll = $(window).scrollTop();
var windowHeight = $(window).height();
if (scroll > pos - windowHeight + 100) {
$(this).addClass('slide-left');
}
});
});
});
$(window).scroll(function () {
$(".menu__item__text__ja").each(function () {
var position = $(this).offset().top;
var scroll = $(window).scrollTop();
var windowHeight = $(window).height();
if (scroll > position - windowHeight) {
$(this).addClass('active');
}
});
});
/*ハンバーガーメニュー*/
$(".header__navi__open").click(function () {//ボタンがクリックされたら
$(this).toggleClass('active');//ボタン自身に activeクラスを付与し
$("#header__navi__li").toggleClass('panelactive');//ナビゲーションにpanelactiveクラスを付与
});
$("#header__navi__li a").click(function () {//ナビゲーションのリンクがクリックされたら
$(".header__navi__open").removeClass('active');//ボタンの activeクラスを除去し
$("#header__navi__li").removeClass('panelactive');//ナビゲーションのpanelactiveクラスも除去
});解説
ポイント
- 縦書きは
writing-mode: vertical-rl;を使用します。 - 明朝体フォントはNoto Serif JPを使用しています。
- Googleマップの色はfilter: grayscale(1);を使用します。
- Javascriptはドロワー、画像のフェードイン、メニュー部分の縦線の動きに使用しています。
まずは、模写コーディングの準備を読んで準備をしましょう。そして、模写コーディングの手順を参考にしながら挑戦してみましょう。

