Bienvenid@
© 2003-2026 Diario de una bibliófila
₊˚⊹⋆。°‧₊˚✧ BIENVENIDXS A MI BLOG ♡。⋆。˚₊˚ ✩.₊˚⊹⋆。°‧₊˚✧ RESEÑAS DE LIBROS, RECOMENDACIONES Y MUCHO MÁS。⋆。˚₊˚⊹⋆。°‧₊˚✧

my top reading books

Un vistazo a mis libros favoritos

Seremos el Huracán

Seremos el huracán

La canción de Aquiles

La canción de Aquiles

Orgullo y prejuicio

Orgullo y prejuicio

Crepúsculo

Crepúsculo

Donde viven las musas

Donde viven las musas

El dragón rojo

El dragón rojo

Tutoriales

 


Hola a todas


Como compartir es de guapas iré actualizando esta página con diversos tutoriales de la personalización que tengo en mi blog Widgets y demás, no dudeis en preguntarme si teneis curiosidad por alguno, ¡intentaré explicarlos lo mejor posible!




∘₊✧──────────────────✧₊∘

Tutorial disco giratorio con música:





Aquí está el código:

<div class="cd-player">

    <img id="cd" 

 src="TU URL DE IMAGEN" />

    <div id="centerBtn">

        ▶

    </div>

    <video id="music" style="display:none;">

    <source src="TU URL DE MP4
">

</source></video>

</div>

<style>

.cd-player{

    width:190px;

    margin:auto;

    position:relative;

}

#cd{

    width:190px;

    display:block;

    margin:auto;

    animation:spin 10s linear infinite;

}

#centerBtn{

    position:absolute;

    left:50%;

    top:50%;

    transform:translate(-50%,-50%);

    width:34px;

    height:32px;

    border-radius:50%;

    background:rgba(255,255,255,.75);

    backdrop-filter:blur(3px);

    border:3px solid rgba(255,255,255,.6);

    display:flex;

    align-items:center;

    justify-content:center;

    cursor:pointer;

    font-size:26px;

    color:#666;

    transition:.25s;

}

#centerBtn:hover{

    transform:translate(-50%,-50%) scale(1.08);

}

.fast{

    animation-duration:5s !important;

}

@keyframes spin{

from{

transform:rotate(0deg);

}

to{

transform:rotate(360deg);

}

}

</style>

<script>

const music=document.getElementById("music");

const btn=document.getElementById("centerBtn");

const cd=document.getElementById("cd");

btn.onclick=()=>{

if(music.paused){

music.play();

btn.innerHTML="❚❚";

cd.classList.add("fast");

}else{

music.pause();

btn.innerHTML="▶";

cd.classList.remove("fast");

}

}

music.onended=()=>{

btn.innerHTML="▶";

cd.classList.remove("fast");

}

</script>


Consejitos para la imagen, es fácil encontrarla en pinterest buscando la serie/película de preferencia + CD.
El fondo de la imagen se puede quitar con una web, yo uso esta: https://www.iloveimg.com/es/eliminar-fondo .
Para meter la URL de la imagen en el código un truco es tener una entrada de tu blog, como borrador, donde coloques todas las imágenes de estos proyectos y como en cualquier otra página en tu editor esa entrada sin publicar, botón derecho sobre la imagen, abrir en una ventana nueva.
Para la URL del MP4, recomiendo descargar el video de youtube y meterlo en una página como esta https://screenapp.io/es/features/video-to-url-link-converter

dentro del código: 

.cd-player{

    width:190px;

    margin:auto;

    position:relative;

}

#cd{

    width:190px;

    display:block;

    margin:auto;

    animation:spin 10s linear infinite;

Cambia lo elementos subrayados, par aumentar o reducir el tamaño, los dos al mismo número.
Y ya estaría, ¡a disfrutar!

∘₊✧──────────────────✧₊∘


Tutorial de lienzo de dibujo:




<style>
#igariPaint{
    width:100%;
    max-width:200px;
    margin:auto;
    border:2px solid #444;
    background:#d4d0c8;
    font-family:Tahoma,Arial,sans-serif;
    box-shadow:4px 4px 0 #777;
    overflow:hidden;
}

/* HEADER */
#paintTitle{
    background:#733861;
    color:#fff;
    padding:3px 6px;
    display:flex;
    justify-content:space-between;
    font-size:12px;
    font-weight:bold;
}

/* MENU */
#paintMenu{
    background:#ece9d8;
    padding:3px 6px;
    font-size:11px;
    border-bottom:2px solid #999;
    display:flex;
    justify-content:space-between;
}

/* CANVAS */
#canvasWrap{
    width:100%;
    position:relative;
    padding-top:100%;
    overflow:hidden;
}

#paintCanvas{
    position:absolute;
    top:0;
    left:0;
    width:100%;
    height:100%;
    display:block;
    background:#fff;
    cursor:crosshair;
    touch-action:none;
    box-shadow: inset 0 0 0 1px #bbb;
}

/* TOOLBAR */
#toolbar{
    background:#d8c2b8 !important;
    padding:6px;
    text-align:center;
}

/* PALETA */
#palette{
    display:none;
    text-align:center;
    margin-bottom:6px;
}

.palette-row{
    display:block;
    margin:2px 0;
}

/* 🎨 COLORES REALMENTE MÁS GRANDES (VISIBLE EN BLOGGER) */
.color{
    width:25px !important;
    height:25px !important;
    display:inline-block;
    margin:1px;

    border:1px solid #555;

    box-shadow:
        inset 1px 1px #fff,
        inset -1px -1px #888;

    cursor:pointer;
}

/* 🎚️ SLIDER REALMENTE VISIBLE */
#size{
    width:120px;
    display:block;
    margin:6px auto;

    accent-color:#8f1d1d;

    background:#f2eee8 !important;
    border:1px solid #b8b0a8;
    border-radius:10px;
    height:10px;
}

#togglePalette{
    display:block;
    margin:4px auto 0;
}
</style>

<div id="igariPaint">

<div id="paintTitle">
<div>🍋 Dibuja</div>
<div>▁ □ ✕</div>
</div>

<div id="paintMenu">
<button onclick="clearCanvas()">Clear</button>
<button onclick="saveCanvas()">Save</button>
</div>

<div id="canvasWrap">
<canvas id="paintCanvas"></canvas>
</div>

<div id="toolbar">

<div id="palette">

<div class="palette-row">
<div class="color" style="background:#000" onclick="setColor('#000')"></div>
<div class="color" style="background:#2b2b2b" onclick="setColor('#2b2b2b')"></div>
<div class="color" style="background:#fff" onclick="setColor('#fff')"></div>
<div class="color" style="background:#b42c2c" onclick="setColor('#b42c2c')"></div>
</div>

<div class="palette-row">
<div class="color" style="background:#d46a6a" onclick="setColor('#d46a6a')"></div>
<div class="color" style="background:#f2b6b6" onclick="setColor('#f2b6b6')"></div>
<div class="color" style="background:#6b8f6b" onclick="setColor('#6b8f6b')"></div>
<div class="color" style="background:#9fbf9f" onclick="setColor('#9fbf9f')"></div>
</div>

<div class="palette-row">
<div class="color" style="background:#cfe3cf" onclick="setColor('#cfe3cf')"></div>
<div class="color" style="background:#6f8fbf" onclick="setColor('#6f8fbf')"></div>
<div class="color" style="background:#9fbbe0" onclick="setColor('#9fbbe0')"></div>
<div class="color" style="background:#d6e6ff" onclick="setColor('#d6e6ff')"></div>
</div>

</div>

<input type="range" id="size" min="1" max="18" value="3" />

<button id="togglePalette" onclick="togglePalette()">🎨 Paleta</button>

</div>

</div>

<script>
const c=document.getElementById("paintCanvas");
const x=c.getContext("2d");

function resizeCanvas(){
    c.width=c.offsetWidth;
    c.height=c.offsetHeight;
    x.lineCap="round";
    x.lineJoin="round";
}
window.addEventListener("resize",resizeCanvas);
resizeCanvas();

let drawing=false,color="#000",lx=0,ly=0;

function setColor(v){color=v;}

function togglePalette(){
    const p=document.getElementById("palette");
    p.style.display = (p.style.display==="block") ? "none" : "block";
}

/* CURSOR FIX */
function pos(e){
const rect=c.getBoundingClientRect();

const clientX = e.touches ? e.touches[0].clientX : e.clientX;
const clientY = e.touches ? e.touches[0].clientY : e.clientY;

return {
    x:(clientX-rect.left)*(c.width/rect.width),
    y:(clientY-rect.top)*(c.height/rect.height)
};
}

c.onmousedown=e=>{drawing=true;let p=pos(e);lx=p.x;ly=p.y};
c.onmouseup=()=>drawing=false;
c.onmouseleave=()=>drawing=false;

c.onmousemove=e=>{
if(!drawing)return;
let p=pos(e);
x.strokeStyle=color;
x.lineWidth=document.getElementById("size").value;
x.beginPath();
x.moveTo(lx,ly);
x.lineTo(p.x,p.y);
x.stroke();
lx=p.x;ly=p.y;
};

c.addEventListener("touchstart",e=>{
drawing=true;let p=pos(e);lx=p.x;ly=p.y;
});

c.addEventListener("touchmove",e=>{
e.preventDefault();
if(!drawing)return;
let p=pos(e);
x.strokeStyle=color;
x.lineWidth=document.getElementById("size").value;
x.beginPath();
x.moveTo(lx,ly);
x.lineTo(p.x,p.y);
x.stroke();
lx=p.x;ly=p.y;
},{passive:false});

c.addEventListener("touchend",()=>drawing=false);

function clearCanvas(){
x.clearRect(0,0,c.width,c.height);
}

function saveCanvas(){
let a=document.createElement("a");
a.href=c.toDataURL("image/png");
a.download="igari-paint.png";
a.click();
}
</script>


∘₊✧──────────────────✧₊∘



Tutorial de contador de tiempo:




<style>
/* Contenedor principal - centrado y adaptado a 281px */
.tiempo-contador {
background: rgba(180, 150, 200, 0.15);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
padding: 10px 15px;
border-radius: 8px;
border: 1.5px solid rgba(180, 150, 200, 0.3);
box-shadow: 0 2px 12px rgba(180, 150, 200, 0.15);
text-align: center;
font-family: 'Segoe UI', 'Courier New', monospace;
width: 100%;
max-width: 281px;
margin: 0 auto;
/* Centrado automático */
display: block;
transition: all 0.3s ease;
box-sizing: border-box;
}


/* Efecto hover sutil */
.tiempo-contador:hover {
border-color: rgba(241, 196, 15, 0.5);
box-shadow: 0 2px 20px rgba(180, 150, 200, 0.25);
}


/* Línea decorativa amarilla superior */
.tiempo-contador .linea-amarilla {
width: 30px;
height: 2px;
background: linear-gradient(90deg, rgba(241, 196, 15, 0.3), rgba(241, 196, 15, 0.8));
margin: 0 auto 6px auto;
border-radius: 10px;
transition: width 0.3s ease;
}


.tiempo-contador:hover .linea-amarilla {
width: 50px;
}


/* Contenedor del tiempo - horizontal */
.tiempo-contador .tiempo-wrapper {
display: flex;
align-items: baseline;
justify-content: center;
gap: 2px;
}


/* Número del contador - formato digital */
.tiempo-contador .numero {
color: #6b4c7a;
font-size: 28px;
font-weight: 600;
font-family: 'Courier New', monospace;
letter-spacing: 1px;
line-height: 1;
text-shadow: 0 1px 3px rgba(107, 76, 122, 0.1);
}


/* Separador de dos puntos */
.tiempo-contador .separador {
color: rgba(180, 150, 200, 0.5);
font-size: 20px;
font-weight: 300;
margin: 0 1px;
animation: parpadeo 1s step-end infinite;
}


@keyframes parpadeo {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.2;
}
}


/* Etiqueta pequeña debajo */
.tiempo-contador .etiqueta {
color: rgba(107, 76, 122, 0.6);
font-size: 9px;
text-transform: uppercase;
letter-spacing: 1.5px;
font-weight: 400;
margin-top: 3px;
font-family: 'Segoe UI', sans-serif;
}


/* Icono pequeño de reloj */
.tiempo-contador .icono {
font-size: 14px;
opacity: 0.5;
display: inline-block;
margin-right: 6px;
}


/* Diseño flexible para que el contador sea rectangular */
.tiempo-contador .contenido {
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
}


/* Fila superior: icono + tiempo */
.tiempo-contador .fila-tiempo {
display: flex;
align-items: center;
justify-content: center;
gap: 4px;
width: 100%;
}


/* Ajuste para que el contador ocupe todo el ancho de la barra */
.tiempo-contador .tiempo-wrapper {
flex: 1;
justify-content: center;
}
</style>


<div class="tiempo-contador">
<div class="contenido">
<!-- Línea decorativa amarilla -->
<div class="linea-amarilla"></div>


<!-- Fila principal: icono + contador -->
<div class="fila-tiempo">
<span class="icono">⏱</span>
<div class="tiempo-wrapper">
<span class="numero" id="contador-minutos">00</span>
<span class="separador">:</span>
<span class="numero" id="contador-segundos">00</span>
</div>
</div>


<!-- Etiqueta pequeña -->
<div class="etiqueta">Tiempo en el blog</div>
</div>
</div>


<script>
// Función para actualizar el contador con formato 00:00
function actualizarContador() {
const ahora = new Date().getTime();
const segundosTranscurridos = Math.floor((ahora - tiempoInicio) / 1000);


// Calcular minutos y segundos
const minutos = Math.floor(segundosTranscurridos / 60);
const segundos = segundosTranscurridos % 60;


// Formatear con dos dígitos (00:00)
const minutosStr = String(minutos).padStart(2, '0');
const segundosStr = String(segundos).padStart(2, '0');


// Actualizar los elementos
document.getElementById('contador-minutos').textContent = minutosStr;
document.getElementById('contador-segundos').textContent = segundosStr;
}


// Guardar el momento exacto en que el usuario carga la página
const tiempoInicio = new Date().getTime();


// Actualizar cada segundo
setInterval(actualizarContador, 1000);


// Actualizar inmediatamente al cargar
actualizarContador();
</script>



∘₊✧──────────────────✧₊∘

Tutorial de Imagen amasable (acariciar conejito):





<div class="squish-cat">
  <img id="catImg" src="TU_URL
" alt="gato amasable" />
</div>

<style>
.squish-cat img {
  width: 180px;
  transition: transform 0.12s ease-out; 
  transform-origin: center bottom; 
  cursor: grab;
}

.squish-cat img:active {
  cursor: grabbing;
}
</style>

<script>
const cat = document.getElementById("catImg");

cat.addEventListener("mousemove", function(e) {
  const rect = cat.getBoundingClientRect();
  const y = e.clientY - rect.top;
  const centerY = rect.height / 2;

  const distY = Math.abs(y - centerY) / centerY;
  
  const scaleX = 1 + (distY * 0.15); 
  const scaleY = 1 - (distY * 0.15); 

  cat.style.transform = `scale(${scaleX}, ${scaleY})`;
});

cat.addEventListener("mouseleave", function() {
  cat.style.transform = "scale(1,1)";
});
</script>

¡Puede ser cualquier imagen sin fondo!



∘₊✧──────────────────✧₊∘


Tutorial de recientes en letterboxd:

Entras a esta página web: https://letterboxd-embed.timcieplowski.com/



Introduces tu usuario de letterboxd en el recuadro blanco.



Te aparecerá una lista con tus películas recientes, copia el primer código y pégalo en tu sección de Widget/HTML

¡Y listo!
El código siempre le puedes retocar para cambiar el color de fondo o incluso que tenga barra para hacer scroll eso ya es personalizarlo a tu gusto.



∘₊✧──────────────────✧₊∘

No hay comentarios:

Publicar un comentario