diff --git a/js/snow-canvas.js b/js/snow-canvas.js index b1b35c4..276bbea 100644 --- a/js/snow-canvas.js +++ b/js/snow-canvas.js @@ -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; } diff --git a/yoone-snow.php b/yoone-snow.php index be5f035..223c4d3 100644 --- a/yoone-snow.php +++ b/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 ''; - echo '

Multiply snowflake radius default is 1.0

'; + // 渲染组合输入 使用同一选项保存最小与最大半径 + $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 ''; + echo ''; + echo '

Random radius in [min max] single option

'; }, '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 ''; - echo '

Multiply horizontal swing amplitude default is 1.0

'; - }, - '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 ''; - echo ''; - echo '

Random radius in [min max] before size scale

'; - }, - 'yoone_snow', - 'yoone_snow_section' - ); + // 漂移速度与摆动幅度的随机范围设置 保持独立选项 register_setting('yoone_snow_options', 'yoone_snow_drift_min', array( 'type' => 'number',