refactor(雪花效果): 简化尺寸缩放逻辑并使用最小半径和摆动作为缩放因子
移除单独的尺寸与偏移缩放设置,直接使用最小半径和最小摆动作为缩放系数 将半径设置合并为单一选项组,简化后台配置界面
This commit is contained in:
parent
0c063d304e
commit
3cd9cfa987
|
|
@ -36,14 +36,7 @@
|
|||
const val = typeof shapeWeightsRaw[key] !== 'undefined' ? parseInt(shapeWeightsRaw[key], 10) : defaultShapeWeights[key];
|
||||
shapeWeights[key] = isNaN(val) ? defaultShapeWeights[key] : Math.max(0, val);
|
||||
}
|
||||
const sizeScaleRaw = (window.YooneSnowSettings && typeof window.YooneSnowSettings.sizeScale !== 'undefined')
|
||||
? parseFloat(window.YooneSnowSettings.sizeScale)
|
||||
: 1.0;
|
||||
const offsetScaleRaw = (window.YooneSnowSettings && typeof window.YooneSnowSettings.offsetScale !== 'undefined')
|
||||
? parseFloat(window.YooneSnowSettings.offsetScale)
|
||||
: 1.0;
|
||||
const sizeScale = isNaN(sizeScaleRaw) ? 1.0 : Math.max(0.1, sizeScaleRaw);
|
||||
const offsetScale = isNaN(offsetScaleRaw) ? 1.0 : Math.max(0, offsetScaleRaw);
|
||||
// 移除单独的尺寸与偏移缩放 直接使用最小半径与最小摆动作为缩放系数
|
||||
const radiusMinRaw = (window.YooneSnowSettings && typeof window.YooneSnowSettings.radiusMin !== 'undefined')
|
||||
? parseFloat(window.YooneSnowSettings.radiusMin)
|
||||
: 1.0;
|
||||
|
|
@ -62,8 +55,8 @@
|
|||
const swingMaxRaw = (window.YooneSnowSettings && typeof window.YooneSnowSettings.swingMax !== 'undefined')
|
||||
? parseFloat(window.YooneSnowSettings.swingMax)
|
||||
: 1.0;
|
||||
const radiusMin = isNaN(radiusMinRaw) ? 1.0 : Math.max(0, radiusMinRaw);
|
||||
const radiusMax = isNaN(radiusMaxRaw) ? 3.0 : Math.max(radiusMin, radiusMaxRaw);
|
||||
const radiusMin = isNaN(radiusMinRaw) ? 1 : Math.max(0, radiusMinRaw);
|
||||
const radiusMax = isNaN(radiusMaxRaw) ? 3 : Math.max(radiusMin, radiusMaxRaw);
|
||||
const driftMin = isNaN(driftMinRaw) ? 0.4 : Math.max(0, driftMinRaw);
|
||||
const driftMax = isNaN(driftMaxRaw) ? 1.0 : Math.max(driftMin, driftMaxRaw);
|
||||
const swingMin = isNaN(swingMinRaw) ? 0.2 : Math.max(0, swingMinRaw);
|
||||
|
|
@ -130,9 +123,11 @@
|
|||
return {
|
||||
positionX: Math.random() * viewportWidth,
|
||||
positionY: -5 - Math.random() * 20,
|
||||
radius: (Math.random() * (radiusMax - radiusMin) + radiusMin) * sizeScale,
|
||||
// 半径使用随机范围并乘以最小半径作为缩放因子
|
||||
radius: (Math.random() * (radiusMax - radiusMin) + radiusMin) * radiusMin,
|
||||
driftSpeed: Math.random() * (driftMax - driftMin) + driftMin,
|
||||
swingAmplitude: (Math.random() * (swingMax - swingMin) + swingMin) * offsetScale,
|
||||
// 水平摆动使用随机范围并乘以最小摆动作为缩放因子
|
||||
swingAmplitude: (Math.random() * (swingMax - swingMin) + swingMin) * swingMin,
|
||||
shapeType: chosenType,
|
||||
imageUrl: chosenImageUrl,
|
||||
// 标记该粒子是否已经移出视口 用于停止后清理
|
||||
|
|
@ -152,9 +147,11 @@
|
|||
if (!hasReachedDuration){
|
||||
flake.positionY = -5;
|
||||
flake.positionX = Math.random() * viewportWidth;
|
||||
flake.radius = (Math.random() * (radiusMax - radiusMin) + radiusMin) * sizeScale;
|
||||
// 重生时应用同样的半径缩放逻辑
|
||||
flake.radius = (Math.random() * (radiusMax - radiusMin) + radiusMin) * radiusMin;
|
||||
flake.driftSpeed = Math.random() * (driftMax - driftMin) + driftMin;
|
||||
flake.swingAmplitude = (Math.random() * (swingMax - swingMin) + swingMin) * offsetScale;
|
||||
// 重生时应用同样的摆动缩放逻辑
|
||||
flake.swingAmplitude = (Math.random() * (swingMax - swingMin) + swingMin) * swingMin;
|
||||
} else {
|
||||
flake.outOfView = true;
|
||||
}
|
||||
|
|
|
|||
102
yoone-snow.php
102
yoone-snow.php
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
Plugin Name: Yoone Snow
|
||||
Description: 首页 canvas 雪花效果
|
||||
Version: 1.3.0
|
||||
Version: 1.5.0
|
||||
Author: Yoone
|
||||
*/
|
||||
|
||||
|
|
@ -114,14 +114,19 @@ function yoone_snow_enqueue_assets() {
|
|||
if ($val < 0) { $val = 0; }
|
||||
$shape_weights[$k] = $val;
|
||||
}
|
||||
// 读取尺寸组合设置 包含最小与最大半径 如未设置则回退到旧选项与默认值
|
||||
$size_group = get_option('yoone_snow_size', array('min' => 1.0, 'max' => 3.0));
|
||||
$radius_min_val = isset($size_group['min']) ? floatval($size_group['min']) : floatval(get_option('yoone_snow_radius_min', 1.0));
|
||||
$radius_max_val = isset($size_group['max']) ? floatval($size_group['max']) : floatval(get_option('yoone_snow_radius_max', 3.0));
|
||||
if ($radius_min_val < 0) { $radius_min_val = 0.0; }
|
||||
if ($radius_max_val < $radius_min_val) { $radius_max_val = $radius_min_val; }
|
||||
|
||||
wp_localize_script($script_handle, 'YooneSnowSettings', array(
|
||||
'selectedShapes' => $mixed_items_sanitized,
|
||||
'mediaItems' => $media_urls,
|
||||
'displayDurationSeconds' => intval(get_option('yoone_snow_home_duration', 0)),
|
||||
'sizeScale' => floatval(get_option('yoone_snow_size_scale', 1.0)),
|
||||
'offsetScale' => floatval(get_option('yoone_snow_offset_scale', 1.0)),
|
||||
'radiusMin' => floatval(get_option('yoone_snow_radius_min', 1.0)),
|
||||
'radiusMax' => floatval(get_option('yoone_snow_radius_max', 3.0)),
|
||||
'radiusMin' => $radius_min_val,
|
||||
'radiusMax' => $radius_max_val,
|
||||
'driftMin' => floatval(get_option('yoone_snow_drift_min', 0.4)),
|
||||
'driftMax' => floatval(get_option('yoone_snow_drift_max', 1.0)),
|
||||
'swingMin' => floatval(get_option('yoone_snow_swing_min', 0.2)),
|
||||
|
|
@ -421,83 +426,38 @@ function yoone_snow_register_settings() {
|
|||
'yoone_snow_section'
|
||||
);
|
||||
|
||||
register_setting('yoone_snow_options', 'yoone_snow_size_scale', array(
|
||||
'type' => 'number',
|
||||
// 尺寸组合设置 使用单一选项 snow size 存储最小与最大半径
|
||||
register_setting('yoone_snow_options', 'yoone_snow_size', array(
|
||||
'type' => 'array',
|
||||
'sanitize_callback' => function($value) {
|
||||
$num = floatval($value);
|
||||
if ($num < 0.1) { $num = 0.1; }
|
||||
return $num;
|
||||
// 将输入统一为包含 min 与 max 的数值数组 并保证非负与 max 不小于 min
|
||||
if (!is_array($value)) { $value = array(); }
|
||||
$min = isset($value['min']) ? floatval($value['min']) : 1.0;
|
||||
$max = isset($value['max']) ? floatval($value['max']) : 3.0;
|
||||
if ($min < 0) { $min = 0.0; }
|
||||
if ($max < $min) { $max = $min; }
|
||||
return array('min' => $min, 'max' => $max);
|
||||
},
|
||||
'default' => 1.0,
|
||||
'default' => array('min' => 1.0, 'max' => 3.0),
|
||||
));
|
||||
|
||||
add_settings_field(
|
||||
'yoone_snow_size_scale',
|
||||
'Snow Size Scale',
|
||||
'yoone_snow_size',
|
||||
'Snow Size',
|
||||
function() {
|
||||
$current = floatval(get_option('yoone_snow_size_scale', 1.0));
|
||||
echo '<input type="number" min="0.1" step="0.1" name="yoone_snow_size_scale" value="' . esc_attr($current) . '" style="width:120px;" />';
|
||||
echo '<p class="description">Multiply snowflake radius default is 1.0</p>';
|
||||
// 渲染组合输入 使用同一选项保存最小与最大半径
|
||||
$grp = get_option('yoone_snow_size', array('min' => 1.0, 'max' => 3.0));
|
||||
$min = isset($grp['min']) ? floatval($grp['min']) : 1.0;
|
||||
$max = isset($grp['max']) ? floatval($grp['max']) : 3.0;
|
||||
echo '<label style="margin-right:12px;">Min <input type="number" min="0" step="0.1" name="yoone_snow_size[min]" value="' . esc_attr($min) . '" style="width:120px;" /></label>';
|
||||
echo '<label>Max <input type="number" min="0" step="0.1" name="yoone_snow_size[max]" value="' . esc_attr($max) . '" style="width:120px;" /></label>';
|
||||
echo '<p class="description">Random radius in [min max] single option</p>';
|
||||
},
|
||||
'yoone_snow',
|
||||
'yoone_snow_section'
|
||||
);
|
||||
|
||||
register_setting('yoone_snow_options', 'yoone_snow_offset_scale', array(
|
||||
'type' => 'number',
|
||||
'sanitize_callback' => function($value) {
|
||||
$num = floatval($value);
|
||||
if ($num < 0) { $num = 0; }
|
||||
return $num;
|
||||
},
|
||||
'default' => 1.0,
|
||||
));
|
||||
|
||||
add_settings_field(
|
||||
'yoone_snow_offset_scale',
|
||||
'Snow Horizontal Offset Scale',
|
||||
function() {
|
||||
$current = floatval(get_option('yoone_snow_offset_scale', 1.0));
|
||||
echo '<input type="number" min="0" step="0.1" name="yoone_snow_offset_scale" value="' . esc_attr($current) . '" style="width:120px;" />';
|
||||
echo '<p class="description">Multiply horizontal swing amplitude default is 1.0</p>';
|
||||
},
|
||||
'yoone_snow',
|
||||
'yoone_snow_section'
|
||||
);
|
||||
|
||||
// 随机范围设置 注册与字段渲染 包含半径 漂移速度 摆动幅度的最小与最大
|
||||
register_setting('yoone_snow_options', 'yoone_snow_radius_min', array(
|
||||
'type' => 'number',
|
||||
'sanitize_callback' => function($value) {
|
||||
$num = floatval($value);
|
||||
if ($num < 0) { $num = 0; }
|
||||
return $num;
|
||||
},
|
||||
'default' => 1.0,
|
||||
));
|
||||
register_setting('yoone_snow_options', 'yoone_snow_radius_max', array(
|
||||
'type' => 'number',
|
||||
'sanitize_callback' => function($value) {
|
||||
$min = floatval(get_option('yoone_snow_radius_min', 1.0));
|
||||
$num = floatval($value);
|
||||
if ($num < $min) { $num = $min; }
|
||||
return $num;
|
||||
},
|
||||
'default' => 3.0,
|
||||
));
|
||||
add_settings_field(
|
||||
'yoone_snow_radius_range',
|
||||
'Radius Random Range',
|
||||
function() {
|
||||
$min = floatval(get_option('yoone_snow_radius_min', 1.0));
|
||||
$max = floatval(get_option('yoone_snow_radius_max', 3.0));
|
||||
echo '<label style="margin-right:12px;">Min <input type="number" min="0" step="0.1" name="yoone_snow_radius_min" value="' . esc_attr($min) . '" style="width:120px;" /></label>';
|
||||
echo '<label>Max <input type="number" min="0" step="0.1" name="yoone_snow_radius_max" value="' . esc_attr($max) . '" style="width:120px;" /></label>';
|
||||
echo '<p class="description">Random radius in [min max] before size scale</p>';
|
||||
},
|
||||
'yoone_snow',
|
||||
'yoone_snow_section'
|
||||
);
|
||||
// 漂移速度与摆动幅度的随机范围设置 保持独立选项
|
||||
|
||||
register_setting('yoone_snow_options', 'yoone_snow_drift_min', array(
|
||||
'type' => 'number',
|
||||
|
|
|
|||
Loading…
Reference in New Issue