Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

駆けć‡șă—ă‚šăƒłă‚žăƒ‹ă‚ąă‚‚ă©ăăŒYouTubeăźăƒ•ăƒ­ăƒłăƒˆă‚”ă‚€ăƒ‰ăŁăœă„ă‚‚ăźă‚’ć†çŸă—ăŸè©±

Last updated at Posted at 2021-04-02

YouTubeăźăƒ•ăƒ­ăƒłăƒˆă‚”ă‚€ăƒ‰ă‚’äœœăŁăŠăżăŸè©±

 侖界的ăȘケプăƒȘYouTube。Pythonă‚’äœżăŁăŠäœœă‚‰ă‚ŒăŠă„ă‚‹ă“ăšăŻPythonスンゾニケăȘă‚‰ă°ć€§æŠ”ă”ć­˜çŸ„ăźă“ăšă‹ăšæ€ă„ăŸă™ăŒă€ćźŸéš›ă«äœœă‚ă†ăšè€ƒăˆăŸć Žćˆă«ăŻäž­èș«ăźæ§‹é€ ăŁăŠă©ă†ăȘăŁăŠă‚‹ă‹æ°—ă«ăȘă‚ŠăŸă™ă‚ˆă­?ケプăƒȘă‚’é–‹ă„ăŸă‚Šă‚”ă‚€ăƒˆăžăšă‚ąă‚Żă‚»ă‚čă—ăŸă‚‰ăšă‚‰ăšă‚‰ăšć„ăƒŠăƒŒă‚¶ăƒŒă«ăŠă™ă™ă‚ăźć‹•ç”»ăŒăƒ”ăƒƒă‚Żă‚ąăƒƒăƒ—ă•ă‚Œă€ă‚čă‚Żăƒ­ăƒŒăƒ«ă—ăŠă„ăăšă‚ąă‚€ă‚­ăƒŁăƒƒăƒç”»ćƒă‹ă‚‰ć‹•ç”»æœŹç·šăžăšćˆ‡ă‚Šæ›żă‚ăŁăŠć‹•ç”»ăŒć†ç”Ÿă•ă‚Œă‚‹ä»•æ§˜ă€‚ăƒŠăƒŒă‚¶ăƒŒă‚’éŁœăă•ă›ăȘă„æ©Ÿæą°ć­Šçż’ă ă‘ă§ă‚‚ććˆ†ă™ă”ă„ă§ă™ă‘ă‚Œă©ă‚‚ă€ăƒŠăƒŒă‚¶ăƒŒăŒæ°—ă«ăȘăŁăŸć‹•ç”»ăŸă§ă‚čă‚Żăƒ­ăƒŒăƒ«ă—ăŸăšăŸă‚“ć‹•ç”»ă‚’ć†ç”Ÿă—ăŠèŠ‹ă›ăŠăă‚Œă‚‹ä»•æ§˜ăŁăŠăźă‚‚ă©ă†ăȘăŁăŠă‚‹ă‹æ°—ă«ăȘă‚ŠăŸă™ă‚ˆă­?GitHubă‚’æŽąă™ăšYouTubeăźă‚Żăƒ­ăƒŒăƒłăŻă‚ăŁăŸă‚Šă—ăŸă™ă‘ă‚Œă©ă‚‚æ©Ÿæą°ć­Šçż’ăšă‹ăƒ•ăƒ­ăƒłăƒˆă‚”ă‚€ăƒ‰ăźć†çŸăŸă§äžćŻ§ă«ă‚„ăŁăŠăă‚ŒăŠă„ă‚‹ă‚‚ăźăŻăȘă‹ăŁăŸă‚Šă—ăŸă™ă€‚ä»Šć›žăŻăăźYouTubeăźăƒ•ăƒ­ăƒłăƒˆă‚”ă‚€ăƒ‰ă‚’ćŻèƒœăȘé™ă‚Šć†çŸă—ăŸă—ăŸăźă§ăăźè©±ă‚’èš˜äș‹ă«ă—ăŸă„ăšæ€ă„ăŸă™ă€‚

1.ăƒăƒƒă‚Żă‚šăƒłăƒ‰æ§‹çŻ‰

ă€€ăŸăšăŻăƒăƒƒă‚Żă‚šăƒłăƒ‰ă‹ă‚‰ă€‚ăšă„ăŁăŠă‚‚ä»Šć›žăźèš˜äș‹ăźäž»éĄŒăŻăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰ă§ă™ăźă§ăă“ăŸă§ăŒăŁă€ă‚ŠăšăŻæ›žăăŸă›ă‚“ă€‚

1-1.models.py

 models.pyă«ăŠăƒąăƒ‡ăƒ«æ§‹çŻ‰ă‹ă‚‰ć§‹ă‚ăŸă—ă‚‡ă†ă€‚ç›źçš„ăŻć‹•ç”»ă‚’äž€èŠ§èĄšç€șă—ăŠăƒšăƒŒă‚žă‚’ă‚čă‚Żăƒ­ăƒŒăƒ«ă—ăŠă„ăăšă‚ąă‚€ă‚­ăƒŁăƒƒăƒç”»ćƒă‹ă‚‰ć‹•ç”»æœŹç·šă«ćˆ‡ă‚Šæ›żă‚ă‚‹ă‚ăźä»•æ§˜ă‚’ć†çŸă™ă‚‹ă“ăšă§ă™ăźă§modelăźćźšçŸ©ă‚‚ćż…èŠæœ€ć°é™ă§ă™ă€‚

models.py
from django.contrib.auth.models import User
from django.db import models

class Video(models.Model):
    user = models.ForeignKey(User, verbose_name='ăƒŠăƒŒă‚¶ăƒŒ', on_delete=models.CASCADE)
    title = models.CharField(verbose_name='ă‚żă‚€ăƒˆăƒ«', max_length=40)
    content = models.TextField(verbose_name='ć‹•ç”»èȘŹæ˜Žæ–‡')
    video = models.FileField(verbose_name='æŠ•çšżć‹•ç”»')
    image = models.ImageField(verbose_name='ă‚ąă‚€ă‚­ăƒŁăƒƒăƒç”»ćƒ')
    views = models.IntegerField(default=0) #èĄšç€șć›žæ•°èš˜éŒČ甹
    created_at = models.DateTimeField(verbose_name='æŠ•çšżæ—„æ™‚', auto_now_add=True)

ă€€ć‹•ç”»ă‚’äž€èŠ§èĄšç€șă™ă‚‹ăźăŒç›źçš„ă§ă™ăźă§ä»Šć›žăŻă“ă‚Œă ă‘ă‚ă‚Œă°ććˆ†ă§ă™ă€‚æœŹæ Œçš„ă«ć†çŸă™ă‚‹ăȘらいいね!ç”šăźă‚Żăƒ©ă‚čăšă‹ă‚łăƒĄăƒłăƒˆç”šăźă‚Żăƒ©ă‚čă€é€šć ±ç”šăźă‚Żăƒ©ă‚čăȘă‚“ă‹ă‚‚ćˆ„é€”äœœæˆăźćż…èŠăŒă‚ă‚‹ă‚ă‘ă§ă™ăŒă€ä»Šć›žăŻć‰Čæ„›ă—ăŸă™ă€‚

1-2.views.py

ă€€ćźŸéš›ă«ă‚ąăƒ—ăƒȘăšă—ăŠé‹ç”šă—ăŸă‚Šă™ă‚‹ă“ăšă‚’è€ƒăˆăŸă‚‰forms.pyç­‰ă€…é–ąé€Łăƒ•ă‚Ąă‚€ăƒ«ă‚’ă„ă˜ă‚‹ćż…èŠăŒă‚ă‚ŠăŸă™ăŒă€ăă†ă„ăŁăŸă‚łăƒłăƒ†ăƒłăƒ„ăźäœœæˆăŻçźĄç†ă‚”ă‚€ăƒˆă§ă‚„ă‚‹ă“ăšă‚’ć‰æă«views.pyずurls.pyたèȘŹæ˜Žă ă‘ă«ăšă©ă‚ă•ă›ăŠă„ăŸă ăăŸă™ă€‚views.pyăŻă“ă†ă—ăŠăŠăăŸă™ă€‚æ©Ÿæą°ć­Šçż’ăšă‹ç”„ăżèŸŒă‚€ăźă§ă—ăŸă‚‰ă“ă‚ŒăšăŻăŸăŸćˆ„ăźæ›žăæ–čにăȘă‚‹ă‚“ă§ă—ă‚‡ă†ă‘ă‚Œă©ă‚‚äž€èŠ§èĄšç€șをするぼが盼的ăȘらこれで捁戆です。

views.py
from django.views import generic
from .models import Video

class IndexView(generic.ListView):
    model = Video
    context_object_name = 'video_list'
    template_name = 'index.html'

    def get_queryset(self):
        videos = Video.objects.all().order_by('-created_at')
        return videos

1-3.urls.py

 urls.pyăźç·šé›†ă‚‚ă‚łăƒłăƒ†ăƒłăƒ„ă‚’äž€èŠ§èĄšç€șă™ă‚‹ă ă‘ăźćż…èŠæœ€äœŽé™ă—ă‹æ›žăăŸă›ă‚“ă€‚ăƒˆăƒƒăƒ—ăƒšăƒŒă‚žă«ă„ăăȘă‚Šäž€èŠ§èĄšç€șă—ăŸă™ăźă§ă“ăĄă‚‰ă‚‚æ›žăă‚łăƒŒăƒ‰ăŻă“ă‚Œă ă‘ă§ă™ă€‚

urls.py
from django.urls import path

from . import views

app_name = 'ケプăƒȘ損'

urlpatterns =[
    path('', views.IndexView.as_view(), name="index"),
]

ă€€ăƒăƒƒă‚Żă‚šăƒłăƒ‰ăźă‚łăƒŒăƒ‰ăŻä»„äžŠă«ăȘă‚ŠăŸă™ă€‚

2.ăƒ•ăƒ­ăƒłăƒˆă‚šăƒłăƒ‰æ§‹çŻ‰

ă€€æŹĄă«ă€æœŹéĄŒăšăȘă‚‹çź‡æ‰€ä»„ć€–ăźăƒšăƒŒă‚žă‚’äœœă‚ŠăŸă™ă€‚äœœæˆă™ă‚‹ăźăŻćŸșç€Žéƒšćˆ†ăšăȘるbase.htmlずindex.htmlă€ă‚”ă‚€ăƒˆèŁ…éŁŸç”šăźmystyle.cssです。

2-1.base.html

 ç‰čç­†ă™ă‚‹ă“ăšăŻă‚ă‚ŠăŸă›ă‚“ă€‚Djangoă‚’è§ŠăŁăŸă“ăšăźă‚ă‚‹æ–čでしたらćŸșæœŹçš„ă«ă“ă†æ›žăă§ă—ă‚‡ă†ă­ă€‚èŠ‹æ „ăˆăźăŸă‚ă«BootStrapをèȘ­ăżèŸŒăŸă›ăŸă‚Šă—ăŠăŸă™ăŒäœżă†ă‹äœżă‚ăȘă„ă‹ăŻăŠä»»ă›ă—ăŸă™ă€‚

base.html
{% load static %}

<html lang='ja'>

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta name="description" content="">
        <meta name="author" content="">

        <!-- Bootstrap core CSS -->
        <link href="{% static 'bootstrap.min.css' %}" rel="stylesheet">

        <title>{% block title %}{% endblock %}</title>

        {% block head %}{% endblock %}
    </head>

    <body>
	<div id="wrapper">

        {% block header %}{% endblock %}

        {% block contents %}{% endblock %}

        <footer class="py-5 bg-black">
          <div class="container">
            <p class="m-0 text-center text-white small">Copyright &copy; hogehoge 2021</p>
          </div>
        </footer>

        <!-- Bootstrap core JavaScript -->
        <script src="{% static 'vendor/jquery/jquery.min.js' %}"></script>
        <script src="{% static 'vendor/bootstrap/js/bootstrap.bundle.min.js' %}"></script>

        </div>
    </body>

</html>

ă€€ćż…èŠæœ€äœŽé™ăźèŠçŽ ă ă‘èżœćŠ ă—ăŸă—ăŸă€‚ăƒŠăƒ“ă‚ČăƒŒă‚·ăƒ§ăƒłăƒăƒŒă‚’ă€ă‘ă‚‹ă‹ä»˜ă‘ăȘă„ă‹ăŻăŠć„œăżă§ă€‚ăă‚‚ăă‚‚ăƒˆăƒƒăƒ—ăƒšăƒŒă‚žă«ă‚łăƒłăƒ†ăƒłăƒ„ă‚’äž€èŠ§èĄšç€șするぼが盼的ですぼでいらăȘă„ă§ă—ă‚‡ă†ă‘ă‚Œă©ă‚‚â€Šă€‚

2-2.index.html

 index.htmlもç‰čă«æŽŸæ‰‹ă«éŁŸă‚Šä»˜ă‘ă‚‹ă“ăšăŻă—ăŸă›ă‚“ă€‚ă‚łăƒłăƒ†ăƒłăƒ„ă‚’äž€èŠ§èĄšç€șă™ă‚‹ă“ăšă ă‘ă‚’ç›źçš„ăšă—ăŸă™ă€‚

index.html
{% extends 'base.html' %}
{% load static %}

{% block title %}YouTubeăźăƒ•ăƒ­ăƒłăƒˆă‚”ă‚€ăƒ‰ă‚’ć†çŸă—ăŸă™{% endblock %}

{% block contents %}
<div class="container">
    <div class="row">
        <div class="mt-2 w-100">
            <div class="col-lg-8 col-md-10 mx-auto">
                <h1>hogehoge</h1>
                {% for items in video_list %}
                    <div class="post-preview">
                        <a href="#">    <!--ć‹•ç”»è©łçŽ°ç§»ć‹•(省畄)-->
                            <img class="float-right" src="{{ items.photo.url }}" width="240" height="130">
                            <video class="float-right is_hide" src="{{ items.video.url }}" width="240" height="130" controls muted autoplay playinline loop></video>
                            <p class="post-meta text-black">
                            æŠ•çšżè€…ïŒš{{ items.user }}
                            </p>
                            <h4 class="post-subtitle text-black">
                            ă‚żă‚€ăƒˆăƒ«ïŒš{{ items.title }}
                            </h4>
                            <h4 class="post-subtitle text-black">
                            èȘŹæ˜ŽïŒš{{ items.content|truncatechars:20 }}
                            </h4>
                        </a>
                        <p class="post-meta mb-1">{{ items.created_at }}</p>
                        <small class="text-info">
                            コメント={{items.number_of_comments}}<br>
                            èĄšç€șć›žæ•°={{items.views}}
                        </small>
                    </div>
                    <hr>
                {% empty %}
                    <p>æŠ•çšżăŒă‚ă‚ŠăŸă›ă‚“ă€‚</p>
                {% endfor %}
            </div>
        </div>
    </div>
</div>
{% endblock %}

2-3.mystyle.css

ă€€æœ€äœŽé™ăźèŁ…éŁŸă‚’èĄŒă„ăŸă™ă€‚ăƒȘăƒłă‚Żă‚’é»’ć­—ă«ă—ă€ăƒ›ăƒăƒŒæ™‚ăźäž‹ç·šă‚’æ¶ˆćŽ»ă™ă‚‹ă“ăšă ă‘æ›žă„ăŠăŠăăŸă—ăŸă€‚ăăźä»–ă€.is_hideăšă„ă†ă‚Żăƒ©ă‚čă«ă€ă„ăŠă‚‚ă“ăĄă‚‰ă§ćźšçŸ©ă—ăŠă„ăŸă™ăŒă€è©łçŽ°ă«ă€ă„ăŠăŻćŸŒèż°ă—ăŸă™ă€‚

mystyle.css
.text-black {
    color: #000000 !important;
}

a:hover {
    text-decoration: none;
}

.is_hide {
    display: none;
}

3.æœŹéĄŒ

ă€€ăšă‚Šă‚ăˆăšäžŠèš˜ăŸă§ă§ăƒˆăƒƒăƒ—ăƒšăƒŒă‚žă«ć‹•ç”»ă‚’äž€èŠ§èĄšç€șă™ă‚‹ă“ăšăŻă§ăă‚‹ă‚ˆă†ă«ăȘă‚ŠăŸă—ăŸă€‚ă‚ăšăŻă€ăƒȘă‚čăƒˆă‚ąăƒƒăƒ—ă•ă‚ŒăŸă‚łăƒłăƒ†ăƒłăƒ„ă«ă€ă„ăŠă‚čă‚Żăƒ­ăƒŒăƒ«äž­ăŻă‚ąă‚€ă‚­ăƒŁăƒƒăƒç”»ćƒă‚’èĄšç€șし、ă‚čă‚Żăƒ­ăƒŒăƒ«ă‚’ă‚„ă‚ăŸăšăŸă‚“ć‹•ç”»ăŒć†ç”Ÿă•ă‚Œă‚‹ă‚ˆă†ăȘä»•æ§˜ăŒă‚ă‚Œă°YouTubeăźăƒ•ăƒ­ăƒłăƒˆă‚”ă‚€ăƒ‰ă‚’ă‹ăȘă‚Šć†çŸă§ăăă†ă§ă™ă­ă€‚ăšăȘるべ、ć‡șç•ȘはやはりJavaScriptです。あれこれやりæ–čă‚’è€ƒăˆă‚‹éŽçš‹ă§setTimeoutやsetIntervalずă‚čă‚Żăƒ­ăƒŒăƒ«ă‚€ăƒ™ăƒłăƒˆă‚’ç”„ăżćˆă‚ă›ă‚‹æ‰‹æź”ăȘă‚“ă‹ă‚‚è©Šă—ăŸă—ăŸăŒă€ăă‚Œă§ă‚„ă‚ă†ăšă™ă‚‹ăšă‚čă‚Żăƒ­ăƒŒăƒ«ă‚’ă‚„ă‚ăŸăšăŸă‚“ăƒȘă‚čăƒˆă‚ąăƒƒăƒ—ă•ă‚ŒăŸć‹•ç”»ăŒäž€æ–‰ă«ć†ç”Ÿă•ă‚ŒăŠă—ăŸă†ăšă„ă†ă‚‚ăŻă‚„çŹ‘ă†ă—ă‹ăȘă„ç”æœ«ă«ăȘă‚ŠăŸă—ăŸă€‚ăă‚“ăȘćŁă«ćœ“ăŸă‚Šă€ă€ă‚‚ă‚ă‚Œă“ă‚Œæ‰‹æź”ă‚’è€ƒăˆăŠăŸă‚‰ă‚ă‚Œ?これだったらă‚čă‚Żăƒ­ăƒŒăƒ«ćœ°ç‚čă«ćżœă˜ăŠç™șć‹•ă™ă‚‹ă‚żă‚€ăƒ—ăźç°Ąć˜ăȘDOMæ“äœœă§è§Łæ±șできるんじゃね?ăšæ€ă„ç«‹ăĄă€ăă‚Œă‚’è»žă«ă‚łăƒŒăƒ‰ă‚’æ›žă„ăŠăżă‚‹ă“ăšă«ă—ăŸă—ăŸă€‚
ă€€ăăźéŽçš‹ă§èĄŒăă€ă„ăŸăźăŒă“ăĄă‚‰ăźă‚”ă‚€ăƒˆ(https://techmemo.biz/javascript/vanilla-js-scroll-animation/)です。䞋にă‚čă‚Żăƒ­ăƒŒăƒ«ă—ăŠă„ă‘ă°ă„ăă»ă©éš ă—ăŠă‚ăŁăŸă‚łăƒłăƒ†ăƒłăƒ„ăŒă”ă‚ăŁăšă„ă†ć‹•ăăšăšă‚‚ă«èĄšç€șă•ă‚Œă‚‹ă‚ąăƒ‹ăƒĄăƒŒă‚·ăƒ§ăƒłă«ă€ă„ăŠçŽčä»‹ă—ăŠă„ăŸă—ăŸă€‚

 ă‚čă‚Żăƒ­ăƒŒăƒ«ăźăƒˆăƒȘă‚ŹăƒŒă‚’ă“ăźă‚”ă‚€ăƒˆă‚’ć‚è€ƒă«äœœăŁăŸă†ăˆă§ă€ç‰čćźšçź‡æ‰€ăŸă§ă‚čă‚Żăƒ­ăƒŒăƒ«ă™ă‚‹ăŸăłă«DOMæ“äœœă‚’èĄŒă†ă‚ˆă†ă«JavaScriptăźă‚łăƒŒăƒ‰ă‚’è€ƒăˆăŠăżăŸă—ăŸă€‚ăă‚ŒăŒä»„äž‹ăźă‚łăƒŒăƒ‰ă«ăȘă‚ŠăŸă™ă€‚

action.js
let scrollElem = document.querySelectorAll('.js-trigger');
let scrollElem2 = document.querySelectorAll('.js-trigger2');
let scrollAnimation = function() {
  for(let i = 0; i < scrollElem.length; i++) {
  let trigger = 200;
    if (window.innerHeight > scrollElem[i].getBoundingClientRect().top + trigger) {
      if (scrollElem[i].getBoundingClientRect().top + trigger + 300 > window.innerHeight) {
        scrollElem[i].classList.add('is_hide');
        scrollElem2[i].classList.remove('is_hide');
      } else {
        scrollElem[i].classList.remove('is_hide');
        scrollElem2[i].classList.add('is_hide');
      }
    }
  }
}
window.addEventListener('load', scrollAnimation);
window.addEventListener('scroll', scrollAnimation);

ă€€ă“ăźă‚łăƒŒăƒ‰ăŒæ„ć›łă™ă‚‹ă“ăšăŻăƒˆăƒȘă‚ŹăƒŒăšă—ăŠăźă‚Żăƒ©ă‚čăŒèš­çœźă•ă‚ŒăŸçź‡æ‰€ăŸă§ă‚čă‚Żăƒ­ăƒŒăƒ«ă™ă‚‹ćșŠă«èŠçŽ ăźéžèĄšç€șă‚’èĄŒă†ăŸă‚ăźis_hideă‚Żăƒ©ă‚čă‚’èżœćŠ ă—ăŸă‚Šć‰Šé™€ă—ăŸă‚Šă™ă‚‹ć‡Šç†ă‚’èĄŒă†ă“ăšă«ă‚ˆăŁăŠă‚ąă‚€ă‚­ăƒŁăƒƒăƒç”»ćƒăšć‹•ç”»ăšă‚’ćˆ‡ă‚Šæ›żăˆăŠèĄšç€șするこべです。それが盼的だったらtoggleäœżăŁăŸæ–čがいいんじゃăȘă„ă‹ăšè€ƒăˆă‚‹æ–čă‚‚ă„ă‚‹ă‹ăšæ€ă„ăŸă™ăŒă€ăă‚Œă§ă‚„ăŁăŠăżăŸă‚‰ă‚čă‚Żăƒ­ăƒŒăƒ«äž­ă‚‚ă‚čă‚Żăƒ­ăƒŒăƒ«ç”‚äș†ćŸŒă‚‚ć‹•ç”»ăšç”»ćƒăŒćŒæ™‚ă«èĄšç€șă•ă‚ŒăŸă‚Šă‚ăŁăĄă‚ƒăƒă‚«ăƒă‚«ăšăĄă‚‰ă€ă„ăŸă‚Šă§èŠ‹ă‚‰ă‚ŒăŸă‚‚ăźă˜ă‚ƒăȘă‹ăŁăŸă‚ă‘ă§ă™ă€‚ă§ă™ăźă§ç”ć±€ć€‹ćˆ„ă«ăƒˆăƒȘă‚ŹăƒŒă‚’èš­ćźšă—ăŠă‚ă‚‹çź‡æ‰€ă‚’DOMæ“äœœă™ă‚‹ă“ăšă«ă‚ˆă‚ŠYouTubeăźăƒˆăƒƒăƒ—ăƒšăƒŒă‚žăŁăœă„äœ•ă‹ă‚’ć†çŸă™ă‚‹ă“ăšă«ă—ăŸă—ăŸă€‚æ—©é€ŸäžŠèš˜ăźă‚łăƒŒăƒ‰ă‚„CSSăƒ•ă‚Ąă‚€ăƒ«ă‚’index.htmlă«æ›žăćŠ ăˆăŸă†ăˆă§äżźæ­Łă—ăŠăżăŸă—ă‚‡ă†ă€‚ă™ă‚‹ăšă€ă“ă†ăȘă‚ŠăŸă™ă€‚

index.html
{% extends 'base.html' %}
{% load static %}

{% block title %}YouTubeăźăƒ•ăƒ­ăƒłăƒˆă‚”ă‚€ăƒ‰ă‚’ć†çŸă—ăŸă™{% endblock %}

<!--CSSèżœćŠ -->
{% block head %}
<link href="{% static 'mystyle.css' %}" rel="stylesheet">
{% endblock %}

{% block contents %}
<div class="container">
    <div class="row">
        <div class="mt-2 w-100">
            <div class="col-lg-8 col-md-10 mx-auto">
                <h1>hogehoge</h1>
                {% for items in video_list %}
                    <div class="post-preview">
                        <a href="#">    <!--ć‹•ç”»è©łçŽ°ç§»ć‹•(省畄)-->
                            <img class="float-right js-trigger" src="{{ items.photo.url }}" width="240" height="130">  <!--ă‚Żăƒ©ă‚čèżœćŠ -->
                            <video class="float-right is_hide js-trigger" src="{{ items.video.url }}" width="240" height="130" controls muted autoplay playinline loop></video>  <!--ă‚Żăƒ©ă‚čèżœćŠ -->
                            <p class="post-meta text-black">
                            æŠ•çšżè€…ïŒš{{ items.user }}
                            </p>
                            <h4 class="post-subtitle text-black">
                            ă‚żă‚€ăƒˆăƒ«ïŒš{{ items.title }}
                            </h4>
                            <h4 class="post-subtitle text-black">
                            èȘŹæ˜ŽïŒš{{ items.content|truncatechars:20 }}
                            </h4>
                        </a>
                        <p class="post-meta mb-1">{{ items.created_at }}</p>
                        <small class="text-info">
                            コメント={{items.number_of_comments}}<br>
                            èĄšç€șć›žæ•°={{items.views}}
                        </small>
                    </div>
                    <hr>
                {% empty %}
                    <p>æŠ•çšżăŒă‚ă‚ŠăŸă›ă‚“ă€‚</p>
                {% endfor %}
            </div>
        </div>
    </div>
</div>

<!--JavaScriptèżœćŠ (ć€–éƒšăƒ•ă‚Ąă‚€ăƒ«ă‚’äœœæˆă—ăŠèȘ­ăżèŸŒăŸă›ă‚‹ăźă§ă‚‚揯)-->
<script>
let scrollElem = document.querySelectorAll('.js-trigger');
let scrollElem2 = document.querySelectorAll('.js-trigger2');
let scrollAnimation = function() {
  for(let i = 0; i < scrollElem.length; i++) {
  let trigger = 200;
    if (window.innerHeight > scrollElem[i].getBoundingClientRect().top + trigger) {
      if (scrollElem[i].getBoundingClientRect().top + trigger + 300 > window.innerHeight) {
        scrollElem[i].classList.add('is_hide');
        scrollElem2[i].classList.remove('is_hide');
      } else {
        scrollElem[i].classList.remove('is_hide');
        scrollElem2[i].classList.add('is_hide');
      }
    }
  }
}
window.addEventListener('load', scrollAnimation);
window.addEventListener('scroll', scrollAnimation);
</script>
{% endblock %}

 トăƒȘă‚ŹăƒŒăŻjs-triggeră‚Żăƒ©ă‚čăŒèš­ćźšă—ăŠă‚ă‚‹ă‚łăƒłăƒ†ăƒłăƒ„ăźæœ€äžŠç«Żă‹ă‚‰200px䞋にă‚čă‚Żăƒ­ăƒŒăƒ«ă—ăŸă‚‰ç™șç”Ÿă™ă‚‹ă‚ˆă†ă«èš­ćźšă—ăŠă‚ă‚ŠăŸă™ăŒă€ăă“ă«ă€ă„ăŠăŻć„œăżă§èš­ćźšă—ăȘăŠă—ăŠă‚‚ă‚‰ăˆă‚Œă°ăšæ€ă„ăŸă™ă€‚äžŠăźă‚łăƒŒăƒ‰ă§ăźćźŸèĄŒç”æžœă§ă™ăŒă€ă‚żăƒŒă‚ČットずăȘă‚‹ć‹•ç”»ăźă‚ąă‚€ă‚­ăƒŁăƒƒăƒç”»ćƒăŸă§ă‚čă‚Żăƒ­ăƒŒăƒ«ă™ă‚‹ăšă‚ąă‚€ă‚­ăƒŁăƒƒăƒç”»ćƒă‚’éš ă—ăŠć‹•ç”»ă‚’èĄšç€șするDOMæ“äœœăŒèĄŒă‚ă‚Œă€ă‚żăƒŒă‚Čットから300px䞋にă‚čă‚Żăƒ­ăƒŒăƒ«ă—ăŸæ™‚ç‚čで憍ćșŠDOMæ“äœœăŒèĄŒă‚ă‚Œă€ć‹•ç”»ă‚’éš ă—ăŠă‚ąă‚€ă‚­ăƒŁăƒƒăƒç”»ćƒă‚’ć†èĄšç€șするわけです。YouTubeた栎搈はă‚čă‚Żăƒ­ăƒŒăƒ«ă‚’æ­ąă‚ăŠă‹ă‚‰ăŠă‚ˆă1ç§’ăźćŸ…ăĄæ™‚é–“ăźćŸŒă§ć‹•ç”»ăŒć†ç”Ÿă•ă‚Œă‚‹ä»•æ§˜ă«ăȘăŁăŠă„ă‚‹ă‚ˆă†ă§ă™ăźă§ăă“ăŸă§ć†çŸă™ă‚‹ă«ăŻăŸă ç§ăźæŠ€èĄ“ăŒè¶łă‚ŠăȘă„ă‚ă‘ă§ă™ăŒă€ăšă‚Šă‚ăˆăšäŒŒé€šăŁăŸă‚‚ăźă‚’äœœă‚‹ă“ăšă«ăŻæˆćŠŸă—ăŸă‹ăȘあべæș€è¶łă—ăŠă„ăŸă™ă€‚

ă€€ă‚‚ă—ć‚è€ƒă«ă—ăŠăżăŸă„ăšæ€ă†æ–čăŒă„ăŸă—ăŸă‚‰ă”è‡Șç”±ă«ă‚łăƒ”ăƒšă—ăŠă„ăŁăŠăă ă•ă„ă€‚

ă€€ä»„äžŠă€ă“ă“ăŸă§ăŠèȘ­ăżă„ăŸă ăă‚ă‚ŠăŒăšă†ă”ă–ă„ăŸă—ăŸă€‚

èżœèš˜:

 JavaScriptéƒšćˆ†ă«sleepé–ąæ•°ă‚’èżœćŠ ă™ă‚‹ă“ăšă§ă‚ˆă‚Šć†çŸćșŠă‚’äžŠă’ă‚‹ă“ăšă«æˆćŠŸă—ăŸă—ăŸă€‚ă‚‚ă—ă‚ˆă‚ă—ă‘ă‚Œă°ă“ăĄă‚‰ă‚‚ć‚è€ƒă«ă—ăŠă„ăŸă ă‘ă‚Œă°ăšæ€ă„ăŸă™ă€‚sleepé–ąæ•°ă«ă€ă„ăŠăŻă“ăĄă‚‰ăźsetIntervală‚’äœżăŁăŸă‚„ă‚Šæ–čă‚’ă‚łăƒ”ăƒšă•ă›ăŠă„ăŸă ăăŸă—ăŸă€‚

sleep.js
// setIntervală‚’äœżă†æ–čæł•
function sleep(waitSec, callbackFunc) {

    // 甌過時間秒
    var spanedSec = 0;

    // 1ç§’é–“éš”ă§ç„Ąćé–ąæ•°ă‚’ćźŸèĄŒ
    var id = setInterval(function () {

        spanedSec++;

        // 甌過時間 >= ćŸ…æ©Ÿæ™‚é–“ăźć Žćˆă€ćŸ…æ©Ÿç”‚äș†ă€‚
        if (spanedSec >= waitSec) {

            // ă‚żă‚€ăƒžăƒŒćœæ­ą
            clearInterval(id);

            // 漌äș†æ™‚ă€ă‚łăƒŒăƒ«ăƒăƒƒă‚Żé–ąæ•°ă‚’ćźŸèĄŒ
            if (callbackFunc) callbackFunc();
        }
    }, 1000);

}
index.html
{% extends 'base.html' %}
{% load static %}

{% block title %}YouTubeăźăƒ•ăƒ­ăƒłăƒˆă‚”ă‚€ăƒ‰ă‚’ć†çŸă—ăŸă™{% endblock %}

<!--CSSèżœćŠ -->
{% block head %}
<link href="{% static 'mystyle.css' %}" rel="stylesheet">
{% endblock %}

{% block contents %}
<div class="container">
    <div class="row">
        <div class="mt-2 w-100">
            <div class="col-lg-8 col-md-10 mx-auto">
                <h1>hogehoge</h1>
                {% for items in video_list %}
                    <div class="post-preview">
                        <a href="#">    <!--ć‹•ç”»è©łçŽ°ç§»ć‹•(省畄)-->
                            <img class="float-right js-trigger" src="{{ items.photo.url }}" width="240" height="130">  <!--ă‚Żăƒ©ă‚čèżœćŠ -->
                            <video class="float-right is_hide js-trigger" src="{{ items.video.url }}" width="240" height="130" controls muted autoplay playinline loop></video>  <!--ă‚Żăƒ©ă‚čèżœćŠ -->
                            <p class="post-meta text-black">
                            æŠ•çšżè€…ïŒš{{ items.user }}
                            </p>
                            <h4 class="post-subtitle text-black">
                            ă‚żă‚€ăƒˆăƒ«ïŒš{{ items.title }}
                            </h4>
                            <h4 class="post-subtitle text-black">
                            èȘŹæ˜ŽïŒš{{ items.content|truncatechars:20 }}
                            </h4>
                        </a>
                        <p class="post-meta mb-1">{{ items.created_at }}</p>
                        <small class="text-info">
                            コメント={{items.number_of_comments}}<br>
                            èĄšç€șć›žæ•°={{items.views}}
                        </small>
                    </div>
                    <hr>
                {% empty %}
                    <p>æŠ•çšżăŒă‚ă‚ŠăŸă›ă‚“ă€‚</p>
                {% endfor %}
            </div>
        </div>
    </div>
</div>

<!--JavaScriptèżœćŠ (ć€–éƒšăƒ•ă‚Ąă‚€ăƒ«ă‚’äœœæˆă—ăŠèȘ­ăżèŸŒăŸă›ă‚‹ăźă§ă‚‚揯)-->
<script src='sleep.js'></script>
<script>
let scrollElem = document.querySelectorAll('.js-trigger');
let scrollElem2 = document.querySelectorAll('.js-trigger2');
let scrollAnimation = function() {
  for(let i = 0; i < scrollElem.length; i++) {
  let trigger = 200;
    if (window.innerHeight > scrollElem[i].getBoundingClientRect().top + trigger) {
      if (scrollElem[i].getBoundingClientRect().top + trigger + 300 > window.innerHeight) {
        //懩理をsleepé–ąæ•°ă§æŒŸăżèŸŒă‚€ă“ăšă«ă‚ˆăŁăŠć‡Šç†ăźé–‹ć§‹ă‚’2秒遅らせる
        sleep(2, function() {
          scrollElem[i].classList.add('is_hide');
          scrollElem2[i].classList.remove('is_hide');
        });
      } else {
        scrollElem[i].classList.remove('is_hide');
        scrollElem2[i].classList.add('is_hide');
      }
    }
  }
}
window.addEventListener('load', scrollAnimation);
window.addEventListener('scroll', scrollAnimation);
</script>
{% endblock %}
3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
hexanitrobenzen

@hexanitrobenzen(ă‚Šăƒ©ăƒł)

æ°—ăźć‘ăăŸăŸă«AIäœœăŁăŸă‚Šweb開ç™șしたり氏èȘŹæ›žă„ăŸă‚Šă‚€ăƒ©ă‚čăƒˆæă„ăŸă‚Šă—ăŠă‚‹ăƒ’ăƒŒăƒ©ăƒŒă€‚ćŸ—æ„ćˆ†é‡ŽăŻă‚ŻăƒȘă‚čă‚żăƒ«ăƒ’ăƒŒăƒȘăƒłă‚°ă€‚æœ€èż‘ă§ăŻć°èȘŹă§æć†™ă™ă‚‹ăƒ’ăƒ­ă‚€ăƒłă‚’ăƒăƒŒăƒăƒŁăƒ«ă«ć‘Œăłć‡șしどAIă«ă‚­ăƒŁăƒ©ă‚’æŒ”ă˜ă•ă›ăŸă‚Šă—ăŠéŠă‚“ă§ăŸă™ă€‚QiitaăšăŻćˆ„ă«æŠ€èĄ“ăƒ–ăƒ­ă‚°ă‚‚æ›žă„ăŠă„ăŸă™ăźă§èˆˆć‘łăźă‚ă‚‹æ–čは仄䞋たăƒȘăƒłă‚Żă‹ă‚‰ă”èŠ§ăă ă•ă„ă€‚ https://scientisturanus.com/

Today's trending articles

t0hara

[ă‚ąăƒŒă‚­ăƒ†ă‚ŻăƒăƒŁConference2025 ć‚ćŠ ăƒŹăƒăƒŒăƒˆ]ăƒȘă‚ąăƒ«ăȘçŸ„èŠ‹ă‹ă‚‰ć­Šă¶æœ€é©ăȘă‚ąăƒŒă‚­ăƒ†ă‚ŻăƒăƒŁ

Comments

No comments

Let's comment your feelings that are more than good

Qiita Advent Calendar is held!

Qiita Advent Calendar is an article posting event where you post articles by filling a calendar 🎅

Some calendars come with gifts and some gifts are drawn from all calendars 👀

Please tie the article to your calendar and let's enjoy Christmas together!

3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address