地图与正文同宽 / 详情页封面改列表行样式 / 封面拖拽上传(批 21)
① 带地图的页面(首页旅行地图、详情页行程地图)原本铺满整个视口 (批 18 的负 margin 出血),用户反馈「上面正文固定宽、下面地图铺满屏」 看着奇怪 → 改回与正文版心同宽,bleed() 已删、CSS 去边框覆盖已删。 ② 活动详情页顶部整幅 16:9 大封面太大 → 改用活动列表同款「封面行」 (.act-row-static:小封面 + 参与人 + 统计),数据复用 collectStats 同一聚合口径;.activity-cover 样式删除。 ③ 创建/编辑活动封面支持直接把图片拖进上传区:drop→DataTransfer 塞给 原有 file input 并触发 change,类型/大小校验与裁剪流程原样复用; 拖入悬停给高亮反馈。 验证:本地全链(含 _map12/_map16 同宽与封面行断言、5 档视口)全绿; 部署哨兵同步改向(批 17/18 锚定旧实现的断言全部反向或改口径)。
This commit is contained in:
@@ -29,7 +29,7 @@ $coverPreview = ($isEdit && $cover !== '') ? media_cover((int)$activity['id']) :
|
||||
|
||||
<div class="form-row">
|
||||
<label>封面图</label>
|
||||
<div class="cover-upload">
|
||||
<div class="cover-upload" id="cover-upload-box">
|
||||
<div class="cover-preview" id="cover-preview">
|
||||
<img id="cover-preview-img" src="<?= e($coverPreview) ?>" alt=""
|
||||
style="<?= $coverPreview === '' ? 'display:none;' : '' ?>">
|
||||
@@ -43,7 +43,7 @@ $coverPreview = ($isEdit && $cover !== '') ? media_cover((int)$activity['id']) :
|
||||
<button type="button" class="btn-sm" id="btn-upload-cover"><?= $cover === '' ? '选择图片' : '更换图片' ?></button>
|
||||
<button type="button" class="btn-sm btn-danger" id="btn-remove-cover"
|
||||
style="<?= $cover === '' ? 'display:none;' : '' ?>">移除</button>
|
||||
<span class="muted" style="font-size:12px;">支持 JPG/PNG/WebP,裁剪为 800×450</span>
|
||||
<span class="muted" style="font-size:12px;">支持 JPG/PNG/WebP,可直接拖进来或点选,裁剪为 800×450</span>
|
||||
</div>
|
||||
<input type="file" id="cover-file-input" accept="image/*" style="display:none;">
|
||||
<input type="hidden" name="cover_image" id="cover-url-input" value="<?= e($cover) ?>">
|
||||
@@ -103,6 +103,31 @@ $coverPreview = ($isEdit && $cover !== '') ? media_cover((int)$activity['id']) :
|
||||
|
||||
btnUpload.addEventListener('click', function () { fileInput.click(); });
|
||||
|
||||
/* 批 21:直接把图片拖进上传区 —— 走 DataTransfer 塞给原有 file input,
|
||||
后面的「校验类型/大小 → 打开裁剪」流程原样复用,不另写一套。
|
||||
dragenter/dragover 必须 preventDefault,否则浏览器会直接打开图片文件。 */
|
||||
var dropBox = document.getElementById('cover-upload-box');
|
||||
['dragenter', 'dragover'].forEach(function (t) {
|
||||
dropBox.addEventListener(t, function (e) {
|
||||
e.preventDefault();
|
||||
dropBox.classList.add('dragover');
|
||||
});
|
||||
});
|
||||
['dragleave', 'drop'].forEach(function (t) {
|
||||
dropBox.addEventListener(t, function (e) {
|
||||
e.preventDefault();
|
||||
dropBox.classList.remove('dragover');
|
||||
});
|
||||
});
|
||||
dropBox.addEventListener('drop', function (e) {
|
||||
var files = e.dataTransfer && e.dataTransfer.files;
|
||||
if (!files || !files.length) return;
|
||||
var dt = new DataTransfer();
|
||||
dt.items.add(files[0]); // 封面只有一张:一次拖多张也只取第一张
|
||||
fileInput.files = dt.files;
|
||||
fileInput.dispatchEvent(new Event('change'));
|
||||
});
|
||||
|
||||
fileInput.addEventListener('change', function (e) {
|
||||
var file = e.target.files && e.target.files[0];
|
||||
if (!file) return;
|
||||
|
||||
Reference in New Issue
Block a user