YouTubeăźăăăłăă”ă€ăăäœăŁăŠăżă話
ăäžççăȘăąăăȘYouTubeăPythonăäœżăŁăŠäœăăăŠăăăăšăŻPythonăšăłăžăăąăȘăă°ć€§æ”ăćç„ăźăăšăăšæăăŸăăăćźéă«äœăăăšèăăć Žćă«ăŻäžèș«ăźæ§é ăŁăŠă©ăăȘăŁăŠăăæ°ă«ăȘăăŸăăă?ăąăăȘăéăăăă”ă€ăăžăšăąăŻă»ăčăăăăăăăăšćăŠăŒă¶ăŒă«ăăăăăźćç»ăăăăŻăąăăăăăăčăŻăăŒă«ăăŠăăăšăąă€ăăŁăăç»ćăăćç»æŹç·šăžăšćăæżăăŁăŠćç»ăćçăăă仿§ăăŠăŒă¶ăŒăéŁœăăăăȘăæ©æą°ćŠçżă ăă§ăććăăăă§ăăăă©ăăăŠăŒă¶ăŒăæ°ă«ăȘăŁăćç»ăŸă§ăčăŻăăŒă«ăăăšăăćç»ăćçăăŠèŠăăŠăăă仿§ăŁăŠăźăă©ăăȘăŁăŠăăæ°ă«ăȘăăŸăăă?GitHubăæąăăšYouTubeăźăŻăăŒăłăŻăăŁăăăăŸăăăă©ăæ©æą°ćŠçżăšăăăăłăă”ă€ăăźćçŸăŸă§äžćݧă«ăăŁăŠăăăŠăăăăźăŻăȘăăŁăăăăŸăăä»ćăŻăăźYouTubeăźăăăłăă”ă€ăăćŻèœăȘéăćçŸăăŸăăăźă§ăăźè©±ăèšäșă«ăăăăšæăăŸăă
1.ăăăŻăšăłăæ§çŻ
ăăŸăăŻăăăŻăšăłăăăăăšăăŁăŠăä»ćăźèšäșăźäž»éĄăŻăăăłăăšăłăă§ăăźă§ăăăŸă§ăăŁă€ăăšăŻæžăăŸăăă
1-1.models.py
ămodels.pyă«ăŠăąăă«æ§çŻăăć§ăăŸăăăăçźçăŻćç»ăäžèŠ§èĄšç€șăăŠăăŒăžăăčăŻăăŒă«ăăŠăăăšăąă€ăăŁăăç»ćăăćç»æŹç·šă«ćăæżăăăăźä»æ§ăćçŸăăăăšă§ăăźă§modelăźćźçŸ©ăćż èŠæć°éă§ăă
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ăŻăăăăŠăăăŸăăæ©æą°ćŠçżăšăç”ăżèŸŒăăźă§ăăăăăăšăŻăŸăć„ăźæžăæčă«ăȘăăă§ăăăăăă©ăäžèŠ§èĄšç€șăăăăźăçźçăȘăăăă§ććă§ăă
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ăźç·šéăăłăłăăłăăäžèŠ§èĄšç€șăăă ăăźćż èŠæäœéăăæžăăŸăăăăăăăăŒăžă«ăăăȘăäžèŠ§èĄšç€șăăŸăăźă§ăăĄăăæžăăłăŒăăŻăăă ăă§ăă
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ăèȘăżèŸŒăŸăăăăăŠăŸăăäœżăăäœżăăȘăăăŻăä»»ăăăŸăă
{% 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 © 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ăçčă«æŽŸæă«éŁŸăä»ăăăăšăŻăăŸăăăăłăłăăłăăäžèŠ§èĄšç€șăăăăšă ăăçźçăšăăŸăă
{% 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ăšăăăŻă©ăčă«ă€ăăŠăăăĄăă§ćźçŸ©ăăŠăăŸăăăè©łçŽ°ă«ă€ăăŠăŻćŸèż°ăăŸăă
.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ăźăłăŒăăèăăŠăżăŸăăăăăă仄äžăźăłăŒăă«ăȘăăŸăă
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ă«æžăć ăăăăă§äżźæŁăăŠăżăŸăăăăăăăšăăăăȘăăŸăă
{% 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ăäœżăŁăăăæčăăłăăăăăŠăăă ăăŸăăă
// setIntervalăäœżăæčæł
function sleep(waitSec, callbackFunc) {
// ç”éæéïŒç§ïŒ
var spanedSec = 0;
// 1ç§ééă§çĄćéąæ°ăćźèĄ
var id = setInterval(function () {
spanedSec++;
// ç”éæé >= ćŸ
æ©æéăźć ŽćăćŸ
æ©ç”äșă
if (spanedSec >= waitSec) {
// ăżă€ăăŒćæą
clearInterval(id);
// ćźäșæăăłăŒă«ăăăŻéąæ°ăćźèĄ
if (callbackFunc) callbackFunc();
}
}, 1000);
}
{% 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 %}
Comments
Let's comment your feelings that are more than good