WEB. Вёрстка сайтов
JavaScript и jQuery
Автозапуск видео на мобильных
<video id="videoplayer" controls="false" x-webkit-airplay="allow" preload="auto" autoplay="true" loop="true" muted="muted">
<source src="/video/bg-video.mp4" type="video/mp4">
<source src="/video/vestoro.webm" type="video/webm">
</video>
JavaScript / jQuery
Время прочтения статьи на jQuery и чистом JavaScript
Время прочтения (или просто чтения) — это оценка, сколько времени потребуется среднему человеку, чтобы прочитать текст. Обычно оно рассчитывается на основе количества слов в статье, а также учитывает такие факторы, как:
- Длина текста. Чем длиннее текст, тем больше времени потребуется на его прочтение.
- Сложность текста. Сложные тексты с большим количеством технических терминов и сложных предложений требуют больше времени для понимания.
- Размер шрифта. Крупный шрифт облегчает чтение, а мелкий, наоборот, усложняет его.
- Наличие изображений. Изображения могут сделать текст более привлекательным, но они также могут замедлить чтение, если их слишком много.
Реализация на jQuery
Ниже представлен код на jQuery для реализации функции расчета времени чтения. В нем реализовано склонение «минут» в зависимости от цифр и гибкая настройка (вы самостоятельно можете сами примерную скорость чтения в минуту – так будет формироваться общее время чтения статьи), также есть возможность включить картинки в общее время прочтения.
За настройки отвечают параметры (находятся в последних строках):
images — время в секундах, которое уходит на просмотр одного изображения;
wpm — среднее количество слов, которое человек читает в минуту.
(function($) {
$.fn.readtime = function(options) {
// Значения по умолчанию
var defaults = {
format: '#',
wrapper: 'time',
images: 7, // Время на одно изображение (в секундах)
wpm: 250 // Скорость чтения (слов в минуту)
};
// Объединяем переданные параметры с настройками по умолчанию
options = $.extend(defaults, options);
return this.each(function() {
// Получаем текстовое содержимое элемента
var text = this.textContent || this.innerText || '';
// Подсчитываем количество слов в тексте
var words = text.replace(/(^\s*)|(\s*$)/gi, '')
.replace(/[ ]{2,}/gi, ' ')
.replace(/\n /, '\n')
.split(' ').length;
// Рассчитываем время на основе количества слов
var time = (words / options.wpm) * 60;
// Добавляем время на изображения
if (options.images) {
time += ($(this).find('img').length * options.images);
}
// Округляем до ближайшего целого числа и переводим в минуты
time = Math.round(time / 60);
// Форматируем выводимое значение
time = options.format.replace(/#/, time);
// Создаем элемент для отображения времени
var element = document.createElement(options.wrapper);
// Функция для склонения слова "минута"
function declOfNum(number, titles) {
cases = [2, 0, 1, 1, 1, 2];
return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]];
}
var title = declOfNum(time, ['минута', 'минуты', 'минут']);
// Вставляем результат в элемент с классом .time_read
$('.time_read').html(time + ' ' + title);
});
};
}(jQuery));
// Используем плагин с настройками
$(".text_read").readtime({
images: 7,
wpm: 250
});
- Значения по умолчанию. Определяем значения по умолчанию для скорости чтения и времени на изображение.
- Подсчет слов. Извлекаем текст из элемента и подсчитываем количество слов.
- Добавление времени на изображения. Если в элементе есть изображения, добавляем к общему времени чтения дополнительные секунды.
- Форматирование результата. Используем функцию
declOfNumдля правильного склонения слова «минута» в зависимости от значения. - Вывод результата. Вставляем результат в элемент с классом
.time_read.
Если на странице текст будет меньше среднего количества слов указанных в параметре
wpm, то скрипт будет выводить время прочтения 0. Чтобы исправить это найдите в скрипте строчку:title=declOfNum(time,['минута','минуты','минут']);и над ней вставьте:if(time == 0) { var time = 1; }.
Реализация на чистом JavaScript
Теперь посмотрим, как можно реализовать тот же функционал, но уже без jQuery.
(function() {
function readtime(selector, options) {
// Значения по умолчанию
const defaults = {
format: '#',
wrapper: 'time',
images: 7, // Время на каждое изображение (в секундах)
wpm: 250 // Скорость чтения (слов в минуту)
};
// Объединяем параметры с настройками по умолчанию
options = Object.assign({}, defaults, options);
// Функция для склонения слова "минута" в зависимости от числа
function declOfNum(number, titles) {
const cases = [2, 0, 1, 1, 1, 2];
return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]];
}
// Получаем все элементы, соответствующие переданному селектору
const elements = document.querySelectorAll(selector);
elements.forEach(element => {
// Получаем текстовое содержимое элемента
const text = element.textContent || element.innerText || '';
// Считаем количество слов в тексте
const words = text.trim().replace(/[ ]{2,}/g, ' ').split(' ').length;
// Расчет времени на основе количества слов
let time = (words / options.wpm) * 60;
// Добавляем время на изображения, если есть
if (options.images) {
time += (element.querySelectorAll('img').length * options.images);
}
// Округляем и преобразуем в минуты
time = Math.round(time / 60);
// Форматируем выводимое значение
const formattedTime = options.format.replace(/#/, time);
// Создаем элемент для отображения времени
const timeElement = document.createElement(options.wrapper);
const title = declOfNum(time, ['минута', 'минуты', 'минут']);
// Добавляем текст с временем и склонением
timeElement.textContent = `${formattedTime} ${title}`;
// Вставляем время чтения в элемент с классом .time_read
const timeReadElement = document.querySelector('.time_read');
if (timeReadElement) {
timeReadElement.innerHTML = ''; // Очищаем перед вставкой
timeReadElement.appendChild(timeElement);
}
});
}
// Используем функцию readtime с нужным селектором и параметрами
readtime(".text_read", {
images: 7,
wpm: 250
});
})();
- Настройки по умолчанию. Как и в jQuery-версии, заданы значения по умолчанию для скорости чтения и времени на изображение.
- Подсчет слов. Используется
textContentилиinnerText, чтобы извлечь текст и посчитать количество слов. - Добавление времени для изображений. Время увеличивается в зависимости от количества изображений в элементе.
- Форматирование результата. Результат округляется и форматируется с правильным склонением слова «минута».
- Отображение результата. Вставляем результат в элемент
.time_read.
Прелоадер страницы сайта на css, javascript и gif
Файл большой. Лучше всего использовать небольшие GIF-ки, чтобы загружались быстро.<div id="preloader" class="preloader_image"></div>
JavaScript / jQuery
Стили CSS
Сенсорный эффект прокрутки полной страницы - ScrollingMagic.js
Пользователи могут перемещаться между блоками прокрутки с помощью колесика мыши, клавиш со стрелками и сенсорных жестов.
Как его использовать:
<sections class="scrolling-block">
Section 1
</sections>
<sections class="scrolling-block">
Section 2
</sections>
<sections class="scrolling-block">
Section 3
</sections>
...
html {
width:100%;
scrollbar-width:none;
/* Also needed to disable scrollbar Firefox */
-ms-overflow-style:none;
/* Disable scrollbar IE 10+ */
}
@-moz-document url-prefix() {
/* Disable scrollbar Firefox */
html {
scrollbar-width:none;
}
}
html::-webkit-scrollbar {
/* Disable scrollbar Chrome/Safari/Webkit */
width:0px;
background:transparent;
}
.scrolling-block {
display: flex;
justify-content:center;
align-items:center;
background-color: rgba(0,0,0,0.5);
width:100%;
min-height: fit-content;
height:100vh;
position:relative;
}
.scrolling-block img {
width:auto;
max-width:100%;
height:100%;
object-fit: cover;
}
.scrolling-block.invise {
opacity:0;
transition: opacity0.5s ease-in;
}
.scrolling-block.active {
opacity:1;
transition: opacity0.5s ease-in;
}
<script src="/path/to/cdn/jquery.min.js"></script>
<script src="/path/to/scrollingMagic.js"></script>
let delayWheel = 400;
let delayTouch = 400;
let delayKey = 700;
window.addEventListener('scroll',
(e) => {
e.preventDefault()
if (counter !== sections.length - 1) {
if ((document.documentElement.clientWidth >= 320)) {
window.scrollTo(0,
sections[counter].offsetTop - (
document.documentElement.clientHeight - (sections[counter].clientHeight)) / 2
)
}
}
})
function InitTouchScroll() {
if (document.documentElement.clientWidth >= 320) {
window.addEventListener('touchmove', touchmove,
{passive:false})
window.addEventListener('touchstart', touchstart, {passive:false})
window.addEventListener(
"touchend",
touchend,
{passive:false}
);
}else {
window.removeEventListener('touchmove', touchmove,)
window.removeEventListener('touchstart', touchstart,)
window.removeEventListener('touchend', touchend,)
}
}
https://www.jqueryscript.net/demo/touch-fullpage-scrolling-magic/
Случайный вывод чисел в заданном диапазоне
<script>
// Получение случайного числа в заданном интервале
function getRandomArbitrary(min, max) { //
return Math.random() * (max - min) + min;
}
// Получение случайного целого числа в заданном интервале, включая максимальное и минимальное значения
function getRandomIntInclusive(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1) + min);
}
let $a = getRandomArbitrary(4.5, 5.0);
let $b = getRandomIntInclusive(70,500);
console.log($b);
</script>
Создаем iframe с видео
<div class="modal fade" id="myModalVideo" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header"><button class="close" type="button" data-dismiss="modal">x</button>
</div>
<div class="modal-body">
<object width="1" height="1" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data="" type="application/x-shockwave-flash"><param name="src" value="/video/Egeria.mp4" /><embed width="1" height="1" type="application/x-shockwave-flash" src="/video/Egeria.mp4" /></object>
</div>
</div>
</div>
</div>
<button type="button" id="toggleModalVideoYoutube" data-bs-toggle="modal" data-bs-target="#myModalVideo">
Запустить модальное окно
</button>
JavaScript / jQuery
Удаление атрибута тега с помощью jQuery
$(function () {
$(".item-attr p").each(function()
{
$(this).removeAttr("style");
});
$(".item-attr p span").each(function()
{
$(this).removeAttr("style");
});
});
Эффект "фонарика" на календаре как в Win10
Создаём эффект свечения ячеек таблицы при наведении курсора, как в календаре windows 10.
Решение основывается на том, что под список с ячейками календаря добавляется такой же список с пустыми ячейками subcell, для которых задан постоянный цвет границы, отличающийся от фона. Оба списка помещаются в grid-контейнер и накладываются друг на друга, а между ними помещается пустой div shadow с радиальным градиентом, цвет в градиенте не меняется, меняется только прозрачность - она становится максимальной в центре. Далее этот shadow "привязывается" своим центром к курсору. Может кому то пригодится.
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<ul class="list list-subcells"></ul>
<div class="shadow"></div>
<ul class="list list-cells"></ul>
</div>
<template id="cell-template">
<li class="cell">
<span class="cell-number"></span>
</li>
</template>
<template id="subcell-template">
<li class="cell subcell"></li>
</template>
<script src="script.js"></script>
</body>
</html>
JavaScript / jQuery
const cellTemplate = document.querySelector('#cell-template').content.querySelector('.cell');
const subcellTemplate = document.querySelector('#subcell-template').content.querySelector('.subcell');
const container = document.querySelector('.container');
const sublist = document.querySelector('.list-subcells');
const list = document.querySelector('.list-cells');
const shadow = document.querySelector('.shadow');
function calcMouseCrd ({ x, y }) {
return {
x: x - container.offsetLeft - 0.5 * shadow.offsetWidth,
y: y - container.offsetTop - 0.5 * shadow.offsetHeight
};
}
function setShadowCrd ({ x, y }) {
shadow.style.left = `${x}px`;
shadow.style.top = `${y}px`;
}
(function () {
for (let i = 0; i < 30; i++) {
const cell = cellTemplate.cloneNode(true);
const subcell = subcellTemplate.cloneNode(true);
cell.querySelector('.cell-number').textContent = `${i + 1}`;
list.append(cell);
sublist.append(subcell);
}
setShadowCrd(calcMouseCrd({x: 0, y: 0}));
document.addEventListener('mousemove', (evt) => {
const { x, y } = calcMouseCrd({ x: evt.clientX, y: evt.clientY });
setShadowCrd({ x, y });
});
})();
Стили CSS
.body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #222;
}
.container {
position: relative;
display: grid;
overflow: hidden;
}
.list {
grid-row: 1/2;
grid-column: 1/2;
display: grid;
grid-template-columns: repeat(7, auto);
gap: 3px;
z-index: 1;
}
.list-subcells {
z-index: 0;
}
.shadow {
position: absolute;
width: 200vw;
aspect-ratio: 1.0;
background: radial-gradient(rgba(34, 34, 34, 0), #222 100px);
}
.cell {
display: flex;
justify-content: center;
align-items: center;
width: 50px;
aspect-ratio: 1.0;
border: 2px solid transparent;
color: #eaeaea;
list-style: none;
user-select: none;
}
.cell:hover {
border-color: #999;
}
.subcell {
border-color: #666;
pointer-events: none;
}