スクロールでCSS「opacity」を変化させるcssとjavascript

Filed under: JavaScript — kdcs @ 24年2月24日 土曜日
<!DOCTYPE html>
<html lang="ja">
<head>
<meta name="robots" content="none">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<meta charset="utf-8">
<meta name="description" content="">
<meta name="keywords" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="./style.css">
<link rel="shortcut icon" href="">

<style>
body { margin: 0; padding: 0; }
/*-----------固定FV----------*/
.fv{
    background: #055a8c;
    width: 100%;
    height: 100vh;
    position: fixed;
    top: 0;
    left: 0;
    z-index: -2;
    display: flex;
    justify-content: center;
    align-items: center;
}
 
.fv p{
    color: #fff;
    line-height: 2;
    text-align: center;
    font-size: 20px;
}
 
/*-----------オーバーレイ----------*/
.overlay{
    width: 100%;
    padding-top: 100vh;
    padding-bottom: 100vh;
    background: #000;
    opacity: 0;
    position: relative;
    text-align: center;
    font-size: 20px;
}
 
.overlay p{
    margin: 50vh auto 0;
    background: #000;
    color: #fff;
    max-width: 300px;
    padding: 20px;
    line-height: 1.5;
}
/*-----------次のコンテンツ----------*/
.contents{
    width: 100%;
    height: 500px;
    position: absolute;
    background: #000;
}
 
.contents p{
    font-size: 15px;
    line-height: 1.5;
    color: #fff;
    text-align: center;
}
</style>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


</head>
<body>

<div class="fv">
    <p>スクロールしてください<br>↓↓↓↓↓↓</p>      
</div>
<div class="overlay"><!--不透明度を変えるコンテンツ-->
    <p>#fff背景のopacityが0→1.0に変わります。</p>      
</div>
<div class="contents">
    <p>次のコンテンツ</p>
</div>

<script>
    $('div.overlay').each(function () {
      var $win = $(window),
        $winH = $win.height(),
        $connect = $(this),
        position = $connect.offset().top,
        current = 0.3,
        scroll;
      $win.on('load scroll', function () {
        scroll = $win.scrollTop();
        current = (0 - (position - scroll) / $winH);
        if (current > 0.7999) {
          current = 0.8;
        }
        if (scroll > position - $winH) {
          $connect.css({
            opacity: current
          });
        }
      });
    });
</script>

</body>
</html>

javascriptでページトップスクロールとページ内スクロールのコンフリクト回避

Filed under: JavaScript — kdcs @ 24年2月13日 火曜日

cssでスムーズスクロールが可能になっているが、ios(Safari15.4)以降でないと効かない。

html {
    scroll-behavior: smooth;
    scroll-padding-top: 60px;
}

そのため、javascriptでの対応となるがページトップスクロールとページ内スクロールは内容が被ることが多いので記述がコンフリクトしないようにしなければ、どちらも動作しなくなってしまう。

コンフリクト回避できる記述があったのでこちらに保存
この記述ではオフセット(停止位置を任意の値だけずらす)ことも可能

このjavascriptを使用してもiosやIEではスムーズスクロールが出来ないのでpolyfillのsmoothscroll.jsを利用する。
※スクロールのjavascriptより前にsmoothscroll.jsを読み込ませる。

smooth scroll behavior polyfillというpolyfillパッケージが公開されており、smoothscroll.jsを読み込むことで以下のモダンブラウザでもスムーズスクロールが実現可能。
srcをクリックするとsmoothscroll.jsが表示される。

こちらはiosやIE以外に適用できるスクロールの記述

document.addEventListener('DOMContentLoaded', () => {
  // ヘッダーエレメントを取得。
  const headerElement = document.querySelector('.header');
  // バッファ(オフセット)の値を設定。スムーズスクロールの際にこの値だけ位置をずらす。
  const buffer = 60;
  // href属性の値が"#"から始まるすべての<a>要素を取得
  document.querySelectorAll('a[href^="#"]').forEach(anchor => {
    // 各<a>要素にクリックイベントのリスナーを追加
    anchor.addEventListener('click', (event) => {
      // デフォルトのクリック動作をキャンセル
      event.preventDefault();
      // ヘッダーの高さを取得。ヘッダーエレメントがない場合は0とする。
      const headerHeight = headerElement ? headerElement.offsetHeight : 0;
      // スクロール時の総オフセットを計算(ヘッダーの高さ + バッファ)
      const totalOffset = headerHeight + buffer;
      // クリックされた<a>要素のhref属性の値を取得
      const targetId = anchor.getAttribute('href');
      // ターゲットとなるエレメントを取得
      const targetElement = document.querySelector(targetId);
      // IDが指定されていない、またはターゲットのエレメントが存在しない場合
      if (targetId === "#" || targetId === "" || !targetElement) {
        alert('適切なスクロール先がありません');
        return; // 以降の処理をスキップ
      }
      // smoothScroll関数を呼び出してスムーズスクロールを実行
      smoothScroll(targetElement, totalOffset);
    });
  });
  // スムーズスクロールを行う関数
  const smoothScroll = (target, offset) => {
    // スクロール先の位置を計算
    const targetPosition = target.getBoundingClientRect().top + window.scrollY - offset;
    // 計算された位置にスムーズにスクロール
    window.scroll({
      top: targetPosition,
      behavior: 'smooth'
    });
  }
});

スクロールで要素を下からフワっとフェードインさせる「実装中」

Filed under: css,JavaScript — kdcs @ 23年11月17日 金曜日

jQueryを使わないタイプ
※1行目が「.scroll(function ()」だとページをリロードしたときに要素が表示されないので「.on(‘load scroll’, function ()」とすることでスクロールとリロード両方で動作するようになる。
※適用したい要素のclassに「fadeUp」を記述。スクロールでclassに「on」が付加される。

$(window).on('load scroll', function (){
	$('.fadeiUp').each(function(){
		var elemPos = $(this).offset().top,
		scroll = $(window).scrollTop(),
		windowHeight = $(window).height();

			if (scroll > elemPos - windowHeight + 150){
				$(this).addClass('on');
			}
	});
});

css
※通常は.fadeUpと.fadeUp.onの2つ。要素3つを順番にフェードアップさせる場合(2)(3)を追加する。

.fadeUp {
  transition: 0.8s ease-out;
  transform: translateY(80px);
  opacity: 0;
}
.fadeUp.on {
  transform: translateY(0);
  opacity: 1.0;
}
.fadeUp.on:nth-of-type(2) {
    transition-delay:200ms;
    -webkit-transition-delay:200ms;
}
.fadeUp.on:nth-of-type(3) {
    transition-delay:400ms;
    -webkit-transition-delay:400ms;
}

スクロールで要素を下からフワっとフェードインさせる

Filed under: css,JavaScript — kdcs @ 23年10月30日 月曜日

以下の記述で簡単に行える

動作させたい要素にクラスを付加する

<div class="fadeUp">
<!-- フワっとフェードインさせたい要素 -->
</div>

javascript

$(window).scroll(function () {
  var scrollAnimationElm = document.querySelectorAll('.fadeUp');
  var scrollAnimationFunc = function () {
    for (var i = 0; i < scrollAnimationElm.length; i++) {
      var triggerMargin = 100;
      if (window.innerHeight > scrollAnimationElm[i].getBoundingClientRect().top + triggerMargin) {
        scrollAnimationElm[i].classList.add('on');
      }
    }
  }
  window.addEventListener('load', scrollAnimationFunc);
  window.addEventListener('scroll', scrollAnimationFunc);
});

css

/*----------------------------
fadeUp |下から上へ出現
----------------------------*/
.fadeUp {
  transition: 0.8s ease-in-out;
  transform: translateY(30px);
  opacity: 0;
}
.fadeUp.on {
  transform: translateY(0);
  opacity: 1.0;
}

/*----------------------------
fadeLeft |左から出現
----------------------------*/
.fadeLeft {
    -webkit-transition: 0.8s ease-in-out;
    -moz-transition: 0.8s ease-in-out;
    -o-transition: 0.8s ease-in-out;
    transition: 0.8s ease-in-out;
    transform: translateX(-30px);
    opacity: 0;
    filter: alpha(opacity=0);
    -moz-opacity: 0;
}
.fadeLeft.on {
    opacity: 1.0;
    filter: alpha(opacity=100);
    -moz-opacity: 1.0;
    transform: translateX(0);
}

/*----------------------------
fadeRight |右から出現
----------------------------*/
.fadeRight {
    -webkit-transition: 0.8s ease-in-out;
    -moz-transition: 0.8s ease-in-out;
    -o-transition: 0.8s ease-in-out;
    transition: 0.8s ease-in-out;
    transform: translateX(30px);
    opacity: 0;
    filter: alpha(opacity=0);
    -moz-opacity: 0;
}
.fadeRight.on {
    opacity: 1.0;
    filter: alpha(opacity=100);
    -moz-opacity: 1.0;
    transform: translateX(0);
}

datepicker 2023年版(特定の日付を指定可能)

Filed under: JavaScript — kdcs @ 23年8月6日 日曜日

過去のdatepicker設定では曜日指定だけで、特定の日付が設定できなかったが、今回のコードは設定が可能になる。

    $(function() {

    // 休日を指定(複数可能)
        var holidays = [
        '2023/08/15',
        '2020/02/12',
        ];

        $('#calendar').datepicker({
        minDate: '1d', //明日から
        maxDate: '+2m', //1ヶ月後までが選択可能範囲
        dateFormat: 'yy年mm月dd日(D)', //年-月-日(曜日)

                beforeShowDay: function(date) {
                  var result;
                  var ymd = date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate();
                  var HName = ktHolidayName(ymd);

                  //祝日のセット
                  if(HName != '') {
                      result =  [true, 'date-holiday', HName]; //trueで、祝日の日付選択可能
                  } else {

                    // 休日のセット
                    for (var i = 0; i < holidays.length; i++) {
                        var htime = Date.parse(holidays[i]); //timeへ変換
                        var holiday = new Date();
                        holiday.setTime(htime);

                        // 休日
                        if (holiday.getYear() == date.getYear() &&
                            holiday.getMonth() == date.getMonth() &&
                            holiday.getDate() == date.getDate()) {
                            return [false, 'holiday']; //falseで「休日を格納」で追加した日の日付選択不可
                        }
                    }

                    switch (date.getDay()) {//各曜日のセット
                                case 0: //日曜日
                                    result = [false, 'sunday']; //falseで日曜日の日付選択不可
                                    break;
                                case 6: //土曜日
                                    result = [false, 'saturday']; //falseで土曜日の日付選択不可
                                    break;
                                default:
                                    result = [true];
                                    break;
                    }
                }
                return result;
            },
            onSelect: function(dateText, inst) {
                $('#calendar').val(dateText);
            }

        });
  $(function() {
    $("#calendar").datepicker();
    $("#calendar").datepicker("option", "showOn", 'button');
    $("#calendar").datepicker("option", "buttonImageOnly", true);
    $("#calendar").datepicker("option", "buttonText", 'カレンダーから選択');
    $("#calendar").datepicker("option", "buttonImage", 'https://megane-fujita.com/wp-content/themes/fujita2021/images/ico_calendar.png');
  });

サイト内検索

カテゴリー

最近の投稿

↑上に戻る