%%% tip home %%%-
首先感谢大佬的开源项目
%%% ghcard teachtyler/Icosahedron-Geometry %%%-
还有店长的教程糖果屋微调合集 | Akilar の糖果屋 Custom Beautify | Akilar の糖果屋
%%% span red, 未实现:冰球跟随音乐振动 %%%-
希望有大佬来解决这个问题,我这个小菜鸡实在搞不定。
有建议请评论区留言,欢迎!!
7.27 更新:关闭移动端并根据屏幕大小判断是否引入并开启
%%% endtip %%%-
最终效果
引入 js
只针对 butterfly 主题,其他主题请自己根据情况调整
icebg.js 代码在最下面
在_config.butterfly.yml
中inject
的bottom:
插入代码
-(<script data-pjax src="你自己icebg.js的地址"></script>);
建议修改合适后再通过 jsd 加速插入,因为每个人需求不一样,如果你想要本站一样的效果就改成这样,如果需要自定义请接着看。
当然,建议读者把代码存到自己仓库
如果只需要当背景,而不是头图,到这里就够了,如果想要跟本站一样,参考店长头图透明教程在costom.css
文件中加入
/* 头图透明 */
#page-header{
background: transparent!important;
}
注意:因为 butterfly 版本迭代,店长教程中的配置手机 PC 页面白天黑夜共四个背景图的第一步请按diff代码
块配置。因为我就掉坑了
店长教程点这里Custom Beautify | Akilar の糖果屋,建议配合糖果屋微调合集 | Akilar の糖果屋配置手机 PC 页面白天黑夜共四个背景图食用,效果更佳。
然后
然后就没了,就这,对,就这。
自定义
建议有一定基础的朋友进行自定义修改,比如把球改到侧边栏
icebg.js 我放在了source
博客根目录,方便调试,读者可以根据情况修改。
-(<script data-pjax src="/icebg.js"></script>);
自定义只需要修改icebg.js
内的代码就可以了,代码还是挺长的,其他的我也不会了,大家看着办吧,有大佬改记得评论区告诉我一下。
// document.write("<script src='https://cdn.jsdelivr.net/gh/wxydejoy/wxy_bg@main/vendor/simplex-noise.min.js'></script>");
var renderer,
scene,
camera,
composer,
lights,
circle,
skelet,
particle,
planet,
planet2,
audioArray,
user_audio_amp,
audio_wireframe = true,
primaryColor = null,
secondaryColor = null,
thirdColor = null,
bg_file,
move_bg,
bass_wireframe;
function loadScript(src, callback) {
var script = document.createElement("script"),
head = document.getElementsByTagName("head")[0];
script.type = "text/javascript";
script.charset = "UTF-8";
script.src = src;
if (script.addEventListener) {
script.addEventListener(
"load",
function () {
callback();
},
false
);
} else if (script.attachEvent) {
script.attachEvent("onreadystatechange", function () {
var target = window.event.srcElement;
if (target.readyState == "loaded") {
callback();
}
});
}
head.appendChild(script);
}
function loadlived() {
if (document.body.clientWidth > 900) {
document.onreadystatechange = function () {
if (document.readyState == "complete") {
loadScript(
"https://cdn.jsdelivr.net/gh/wxydejoy/wxy_bg@main/vendor/simplex-noise.min.js",
function () {}
);
loadScript(
"https://cdn.jsdelivr.net/gh/wxydejoy/wxy_bg@main/vendor/three.min.js",
function () {
init();
animate();
}
);
}
};
}
}
loadlived();
// if (document.body.clientWidth > 768) {
// init();
// animate();
// };
// document.write("<script src='https://cdn.jsdelivr.net/gh/wxydejoy/wxy_bg@main/vendor/simplex-noise.min.js'></script>");
var renderer,
scene,
camera,
composer,
lights,
circle,
skelet,
particle,
planet,
planet2,
audioArray,
user_audio_amp,
audio_wireframe = true,
primaryColor = null,
secondaryColor = null,
thirdColor = null,
bg_file,
move_bg,
bass_wireframe;
function loadScript(src, callback) {
var script = document.createElement("script"),
head = document.getElementsByTagName("head")[0];
script.type = "text/javascript";
script.charset = "UTF-8";
script.src = src;
if (script.addEventListener) {
script.addEventListener(
"load",
function () {
callback();
},
false
);
} else if (script.attachEvent) {
script.attachEvent("onreadystatechange", function () {
var target = window.event.srcElement;
if (target.readyState == "loaded") {
callback();
}
});
}
head.appendChild(script);
}
function loadlived() {
if (document.body.clientWidth > 900) {
document.onreadystatechange = function () {
if (document.readyState == "complete") {
loadScript(
"https://cdn.jsdelivr.net/gh/wxydejoy/wxy_bg@main/vendor/simplex-noise.min.js",
function () {}
);
loadScript(
"https://cdn.jsdelivr.net/gh/wxydejoy/wxy_bg@main/vendor/three.min.js",
function () {
init();
animate();
}
);
}
};
}
}
loadlived();
// if (document.body.clientWidth > 768) {
// init();
// animate();
// };
function rgb2hex(rgb) {
rgb = rgb.match(
/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i
);
return rgb && rgb.length === 4
? "" +
("0" + parseInt(rgb[1], 10).toString(16)).slice(-2) +
("0" + parseInt(rgb[2], 10).toString(16)).slice(-2) +
("0" + parseInt(rgb[3], 10).toString(16)).slice(-2)
: "";
}
function init() {
var noise = new SimplexNoise();
renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
renderer.setSize(document.body.clientWidth, document.body.clientHeight);
// renderer.autoClear = false;
// renderer.setClearColor(0x000000, 0.0);
document.getElementById("web_bg").appendChild(renderer.domElement);
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
1,
1000
);
camera.position.z = 400;
scene.add(camera);
circle = new THREE.Object3D();
skelet = new THREE.Object3D();
particle = new THREE.Object3D();
scene.add(circle);
scene.add(skelet);
scene.add(particle);
var geometry = new THREE.TetrahedronGeometry(2, 0); // random particles
var geom = new THREE.IcosahedronGeometry(7, 1); // center planet
geom.verticesNeedUpdate = true;
var geom2 = new THREE.IcosahedronGeometry(15, 1); // wireframe
var material = new THREE.MeshPhongMaterial({
color: 0xffffff,
shading: THREE.FlatShading,
});
// 碎片数量
for (var i = 0; i < 100; i++) {
var mesh = new THREE.Mesh(geometry, material);
mesh.position
.set(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5)
.normalize();
mesh.position.multiplyScalar(90 + Math.random() * 700);
mesh.rotation.set(Math.random() * 2, Math.random() * 2, Math.random() * 2);
particle.add(mesh);
}
var mat = new THREE.MeshPhongMaterial({
color: 0x99cccc,
shading: THREE.FlatShading,
});
var mat2 = new THREE.MeshPhongMaterial({
color: 0xffffff,
wireframe: true,
side: THREE.DoubleSide,
});
planet = new THREE.Mesh(geom, mat);
planet.verticesNeedUpdate = true;
planet.scale.x = planet.scale.y = planet.scale.z = 16;
circle.add(planet);
planet2 = new THREE.Mesh(geom2, mat2);
planet2.scale.x = planet2.scale.y = planet2.scale.z = 10;
skelet.add(planet2);
var ambientLight = new THREE.AmbientLight(0x999999);
scene.add(ambientLight);
lights = [];
lights[0] = new THREE.DirectionalLight(0xffffff, 1);
lights[0].position.set(1, 0, 0);
lights[1] = new THREE.DirectionalLight(0x01183c, 1);
lights[1].position.set(0.75, 1, 0.5);
lights[2] = new THREE.DirectionalLight(0x00436f, 1);
lights[2].position.set(-0.75, -1, 0.5);
scene.add(lights[0]);
scene.add(lights[1]);
scene.add(lights[2]);
}
function moveObject(prop, math, num, timer = 0) {
if (math === "add") {
prop += num;
}
if (math === "subtract") {
prop -= num;
}
if (math === "bounce") {
prop.x += num;
prop.y += num;
prop.z += num;
setTimeout(() => {
prop.x -= num;
prop.y -= num;
prop.z -= num;
}, timer);
}
}
function animate() {
requestAnimationFrame(animate);
if (audio_wireframe) {
var planets = [planet, planet2];
} else {
var planets = [planet];
}
if (audioArray !== undefined) {
// var random = Math.floor(Math.random() * audioArray.length - 100) var amp = 1.1;
var user_amp = eval("1.".concat(user_audio_amp || "80"));
var bass_user_amp = eval("0.".concat(user_audio_amp || "80"));
// var user_amp = 1.99 var baseAmp = eval("0.".concat(user_audio_amp)) planet
planets.map(function (planet) {
planet.geometry.vertices.forEach(function (vertex, i) {
var beat = audioArray[i];
var volume = audioArray.reduce(function (a, b) {
return a + b;
});
if (volume <= 2) {
beat = beat * 10;
}
var offset = planet.geometry.parameters.radius;
vertex.normalize();
var distance;
if (user_audio_amp === 100) {
beat = beat * 2;
bass_user_amp = 1;
distance = offset + beat * user_amp;
// distance = offset + beat
} else {
beat = beat * user_amp;
var time = Date.now();
var noiseX = vertex.x + time * 0.0005;
var noiseY = vertex.y + time * 0.0005;
var noiseZ = vertex.z + time * 0.0005;
var planetNoise = noise.noise3D(noiseX, noiseY, noiseZ);
distance = offset + planetNoise * beat;
// if (turn_liquid) {
// distance = offset + beat + user_amp * planetNoise // turns liquid!?
// }
// if (distance > 15){
// distance = offset + (beat / 2) * 1.1
// debug(distance)
// }
}
// var bass_amp = (bass_user_amp < 0.3) ? 0.3 : (1 - bass_user_amp)
var bass_amp = 1 - bass_user_amp;
if (bass_amp <= 0.3) {
bass_amp = 0.3;
}
if (i <= 3 && beat > bass_amp) {
if (audio_wireframe === false && bass_wireframe) {
audio_wireframe = true;
setTimeout(function () {
audio_wireframe = false;
}, 250);
}
if (move_bg) {
particle.rotation.x += Math.random() * 0.0005;
particle.rotation.y -= Math.random() * 0.004;
circle.rotation.x += 0.002;
circle.rotation.y -= 0.004;
var timer = (beat * 100) / 0.2;
moveObject(skelet.position, "bounce", 0.05, timer);
moveObject(planet.position, "bounce", 0.05, timer);
moveObject(particle.position, "bounce", 0.05, timer);
}
}
vertex.multiplyScalar(distance <= 0.1 ? 1 : distance);
});
planet.geometry.verticesNeedUpdate = true;
planet.geometry.normalsNeedUpdate = true;
planet.geometry.computeVertexNormals();
planet.geometry.computeFaceNormals();
});
}
particle.rotation.x += 0.0;
particle.rotation.y -= 0.001;
circle.rotation.x -= 0.002;
circle.rotation.y -= 0.003;
skelet.rotation.x -= 0.001;
skelet.rotation.y += 0.002;
renderer.clear();
renderer.render(scene, camera);
}