.htaccessでPHPのファイルアップロードサイズの上限値を変更
2022.02.5
PHPを使用して画像(動画・PDF等)をアップロードするフォームを作成した際に、ファイル…

以前、飲食店サイトを制作した際に、記念写真を掲載する目的でメインビューに使っていたスクリプトを思い出しのたのでメモ。
卓上に写真を広げるような感じでレイアウトでき、ドラッグ操作で動かせるので、一覧表示と比べると若干の見づらさはあるものの、目的のものを探し出す体験も含めて、一定の効果はありそうです。
<ul id="photo-list">
<li><a href=""><img src="○○.jpg" alt="○○"></a></li>
<li><a href=""><img src="○○.jpg" alt="○○"></a></li>
<li><a href=""><img src="○○.jpg" alt="○○"></a></li>
<li><a href=""><img src="○○.jpg" alt="○○"></a></li>
<li><a href=""><img src="○○.jpg" alt="○○"></a></li>
<li><a href=""><img src="○○.jpg" alt="○○"></a></li>
<li><a href=""><img src="○○.jpg" alt="○○"></a></li>
<li><a href=""><img src="○○.jpg" alt="○○"></a></li>
<li><a href=""><img src="○○.jpg" alt="○○"></a></li>
<li><a href=""><img src="○○.jpg" alt="○○"></a></li>
</ul>
#photo-list {
position: relative;
width: 100%;
height: 100vh;
margin: 0 auto;
padding: 0;
background: #f5f5f5;
overflow: hidden;
}
#photo-list li {
list-style: none;
position: absolute;
width: 25vw; /* 親幅に応じて自動調整 */
left: 100vw;
}
#photo-list li:active {
cursor: grabbing;
}
#photo-list li img {
width: 100%;
display: block;
box-shadow: 0 4px 10px rgba(0,0,0,0.3);
border-radius: 6px;
transition: transform 0.8s ease-out;
user-select: none;
}
var $items = $('#photo-list li');
var $container = $('#photo-list');
var zIndexCounter = 1;
function getAreaSize() {
return { width: $container.width(), height: $container.height() };
}
function getItemSize($el) {
return { width: $el.width(), height: $el.height() };
}
// 初期位置:右外からばらまく
$items.each(function() {
var area = getAreaSize();
var item = getItemSize($(this));
$(this).css({
left: area.width + 200,
top: area.height / 2 - item.height / 2,
opacity: 0,
transform: 'rotate(0deg) scale(0.8)'
});
});
// ばらまきアニメーション
setTimeout(() => {
$items.each(function() {
var area = getAreaSize();
var item = getItemSize($(this));
var left = Math.random() * (area.width - item.width);
var top = Math.random() * (area.height - item.height);
var rotate = (Math.random() * 60) - 30;
var delay = Math.random() * 800;
$(this).delay(delay).animate({
left: left,
top: top,
opacity: 1
}, {
duration: 1000,
easing: 'swing',
step: function(_, fx) {
$(this).css('transform', `rotate(${rotate}deg) scale(1)`);
}
});
});
}, 500);
if ($(window).width() < 980) {
// スマホ・タブレット用ドラッグ
$items.on({
touchstart: function(e) {
var $this = $(this);
var touch = e.originalEvent.touches[0];
$this.data({
startX: touch.pageX,
startY: touch.pageY,
offsetX: touch.pageX - $this.position().left - $container.offset().left,
offsetY: touch.pageY - $this.position().top - $container.offset().top,
isDragging: false,
dragOccurred: false
});
zIndexCounter++;
$this.css('z-index', zIndexCounter);
},
touchmove: function(e) {
var $this = $(this);
var touch = e.originalEvent.touches[0];
var startX = $this.data('startX');
var startY = $this.data('startY');
var offsetX = $this.data('offsetX');
var offsetY = $this.data('offsetY');
var isDragging = $this.data('isDragging');
var dragOccurred = $this.data('dragOccurred');
var dragThreshold = 5;
var deltaX = Math.abs(touch.pageX - startX);
var deltaY = Math.abs(touch.pageY - startY);
if (!isDragging && (deltaX > dragThreshold || deltaY > dragThreshold)) {
isDragging = true;
dragOccurred = true;
}
if (isDragging) {
e.preventDefault();
$this.css({
left: touch.pageX - $container.offset().left - offsetX + 'px',
top: touch.pageY - $container.offset().top - offsetY + 'px'
});
}
$this.data({
isDragging: isDragging,
dragOccurred: dragOccurred
});
},
touchend: function(e) {
var $this = $(this);
var dragOccurred = $this.data('dragOccurred');
if (dragOccurred) e.preventDefault();
$this.removeData('isDragging dragOccurred startX startY offsetX offsetY');
}
});
} else {
// PC用ドラッグ
$items.on('mousedown', function(e) {
var $this = $(this);
e.preventDefault();
var startX = e.pageX;
var startY = e.pageY;
var offsetX = startX - $this.position().left - $container.offset().left;
var offsetY = startY - $this.position().top - $container.offset().top;
var isDragging = false;
var dragThreshold = 3;
var dragOccurred = false;
zIndexCounter++;
$this.css('z-index', zIndexCounter);
function clickPreventer(e) {
e.preventDefault();
}
function mouseMoveHandler(e) {
var deltaX = Math.abs(e.pageX - startX);
var deltaY = Math.abs(e.pageY - startY);
if (!isDragging && (deltaX > dragThreshold || deltaY > dragThreshold)) {
isDragging = true;
dragOccurred = true;
$this.find('a').on('click.prevent', clickPreventer);
}
if (isDragging) {
$this.css({
left: e.pageX - $container.offset().left - offsetX + 'px',
top: e.pageY - $container.offset().top - offsetY + 'px'
});
}
}
function mouseUpHandler(e) {
$(document).off('mousemove', mouseMoveHandler);
$(document).off('mouseup', mouseUpHandler);
if (dragOccurred) {
$this.one('click', function(e) {
e.preventDefault();
});
$this.find('a').off('click.prevent', clickPreventer);
}
}
$(document).on('mousemove', mouseMoveHandler);
$(document).on('mouseup', mouseUpHandler);
});
}

2022.02.5
PHPを使用して画像(動画・PDF等)をアップロードするフォームを作成した際に、ファイル…

2020.10.3
テキストエリア等で入力した文字の中にURLを含んでいた場合に、自動で認識してリンクタグを…

2024.03.30
外部ファイル(CSVファイル等)を読み込んでサイト内に表示する際に、保存時の文字コードが…

2020.12.5
メールフォームからメールを送信する際に、画像(ファイル)を添付できるようにしてほしいとの…

2023.12.2
ワードプレスの投稿のカテゴリー機能を、目的ごとに使い分けたいというご要望があった際に、カ…

2020.08.1
動画ファイルをCMS化して保存するときに、多くの場合はファイルパスをデータベース(MyS…

2022.09.24
パソコンやスマートフォンの戻るボタンを使って画面を戻す(ブラウザバックする)時があります…

2022.02.19
画像データ等をサーバーにアップロードする際、一点づつアップロードしても良いけれど、ファイ…

2019.12.29
メールフォーム等での入力値チェック(バリデーション)。PHPの「preg_match」(…

2020.08.15
フォームの入力値やURLのパラメータ等、文字列や数値を受け取る際に正規表現を利用してバリ…

時間を指定して表示を切り替える際にPHPを使用することが多かったのだけれど、利用している…

ホームページへ動画を組み込む際に、動画が設置されているところまでスクロールして、表示され…

フォーム投稿で画像をアップロードする際に、追従式のメールフォームを作成し、コンテンツの途…