Автозапуск видео на мобильных

Код видео
<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

var v = document.getElementById("movie");
v.onclick = function() {
if (v.paused) {
v.play();
} else {
v.pause();
}
};

Время прочтения статьи на 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
    });
})();
  1. Настройки по умолчанию. Как и в jQuery-версии, заданы значения по умолчанию для скорости чтения и времени на изображение.
  2. Подсчет слов. Используется textContent или innerText, чтобы извлечь текст и посчитать количество слов.
  3. Добавление времени для изображений. Время увеличивается в зависимости от количества изображений в элементе.
  4. Форматирование результата. Результат округляется и форматируется с правильным склонением слова «минута».
  5. Отображение результата. Вставляем результат в элемент .time_read.

Прелоадер страницы сайта на css, javascript и gif

Образец GIF файла для прелоадера.
Файл большой. Лучше всего использовать небольшие GIF-ки, чтобы загружались быстро.
Добавить в код сайта сразу после тега <body>
<div id="preloader" class="preloader_image"></div>

JavaScript / jQuery

document.addEventListener( 'DOMContentLoaded', function () {
document.querySelector( '#preloader' ).classList.add( 'preloader_image' );
setTimeout( () => {
document.querySelector( '#preloader' ).classList.add( 'hidePreload' );
setTimeout( () => {
console.log( 'remove preloader' );
jQuery( '#preloader' ).remove();
}, 3500 );
}, 3000 );
} );

Стили CSS

.preloader_image {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100vh;
margin:0 auto;
background: #fff url(/images/preload.gif) no-repeat 50% 0;
background-size:100%;
overflow: hidden;
z-index: 1001;

Сенсорный эффект прокрутки полной страницы - ScrollingMagic.js

Прокрутка ScrollingMagic.js это плагин jQuery, который помогает быстро реализовать доступный, удобный на ощупь эффект прокрутки одной страницы в одностраничных веб-приложениях, таких как целевая страница.

Пользователи могут перемещаться между блоками прокрутки с помощью колесика мыши, клавиш со стрелками и сенсорных жестов.
Как его использовать:
1. Добавьте блоки прокрутки (разделы содержимого) на страницу.
<sections class="scrolling-block">

	  Section 1

	</sections>

	<sections class="scrolling-block">

	  Section 2

	</sections>

	<sections class="scrolling-block">

	  Section 3

	</sections>

	...
2. Скрыть полосу прокрутки браузера.
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;

	}
3. Пример стилей CSS для блоков прокрутки.
.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;

	}
4. Импортируйте как библиотеку jQuery, так и ScrollingMagic.js в документ. Вот и все.
<script src="/path/to/cdn/jquery.min.js"></script>
<script src="/path/to/scrollingMagic.js"></script>
5. Переопределите задержки по умолчанию в миллисекундах.
let delayWheel = 400;

let delayTouch = 400;

let delayKey = 700;
6. По умолчанию плагин автоматически отключает сенсорные жесты, если размер видового экрана меньше 320px. Вы можете переопределить точку останова непосредственно в JavaScript следующим образом:
	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/

Случайный вывод чисел в заданном диапазоне

Для случайного вывода чисел используем функцию Math.random()
		<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

<script>
$(function() {
/*создаем iframe с видео*/
var videoIframe = $("<iframe/>", {
"class": "embed-responsive-item",
"src": "https://www.youtube.com/embed/cNLJB-giaVo?autoplay=1&enablejsapi=1&playerapiid=ytplayer",
"width": "96%",
"height": "400px",
"frameborder": "0",
"allowfullscreen": ""
});
/*по клику на кнопку .toggleModalVideoYoutube аттачим iframe с видео в модалку*/
$('.toggleModalVideoYoutube').click(function () {
$('#myModalVideo').modal('show');
videoIframe.appendTo('#myModalVideo .modal-body');
});
/*по закрытию модалки убираем iframe */
$('#myModalVideo').on('hidden.bs.modal', function () {
videoIframe.detach();
});
});
</script>

Удаление атрибута тега с помощью jQuery

При загрузке страницы удалим стили из тегов <p> и <span>. 
$(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;
}