25.10.2018, 07:51
|
|
Профессор
|
|
Регистрация: 16.09.2009
Сообщений: 253
|
|
Обновление содержимого страницы поверх старой - возможно ли?
Существуют ли какие-то способы запретить браузеру удалять старый фон и прорисовывать очередную страницу поверх предыдущей, аналогично как в gif-анимации?
Страница периодически обновляется на экране второго монитора, пока я редактирую её содержимое на основном, чтобы лишний раз не переключаться между окнами и сосредоточиться на вёрстке:
<meta http-equiv=refresh content='3'>
Проблема в том, что из 20 раз перезагрузки в минуту страница 12-17 раз отображается пустой, так как изображение образца не успевает загрузиться:
<style>
body {
background-image:url('draft.png');
}
</style>
То есть, только в 3-8 случаях из 20 в минуту мерцание пустой страницы не наблюдается и виден образец с моими элементами поверх чисто…
Пробовал делать и так:
<html style="background-image:url('draft.png');" xmlns="http://www.w3.org/1999/xhtml">
Но и это не помогает…
Можно ли каким-то образом запретить браузеру вообще обновлять своё окно до полной загрузки ресурсов?
Спасибо!
|
|
25.10.2018, 07:59
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,794
|
|
Live edit для бедных )) Извините.
Скачайте лучше live edit плагин для своей среды разработки.
Ну ил обновляйте страницу так:
<body onload="setTimeout('location.reload();',3e3);">
|
|
25.10.2018, 08:19
|
|
Профессор
|
|
Регистрация: 16.09.2009
Сообщений: 253
|
|
Сообщение от Nexus
|
Live edit для бедных )) Извините.
Скачайте лучше live edit плагин для своей среды разработки.
Ну ил обновляйте страницу так:
<body onload="setTimeout('location.reload();',3e3);">
|
Совсем не то…
Пользуюсь NotePad++ и заранее в графическом редакторе нарисовал интерфейс, чтобы средствами HTML-CSS-JS его воспроизвести алгоритмически.
Но проблема как раз не в том, что мерцают динамически генерируемые элементы, а мерцает сам фон, даже если выбросить все скрипты и оставить пустой «<body></body>»: Браузер очищает окно, но не успевает загрузить фон!
Например:
<html>
<head>
<meta http-equiv=refresh content='3'>
<style>
body {
background-image: url('https://javascript.ru/forum/images/ca_serenity/misc/logo.gif');
}
</style>
</head>
<body>
</body>
И здесь Live Edit совсем не помогает, так как матрица из сотни элементов визуально была нарисована и сохранена в картинку. И она - мерцает!
Всё равно, что логотип этого форума я сейчас буду пытаться генерировать алгоритмом в canvas: Мерцает именно логотип-оригинал постоянно в пустой странице…
Спасибо!
|
|
25.10.2018, 12:55
|
|
Профессор
|
|
Регистрация: 19.01.2012
Сообщений: 505
|
|
Попробуйте сохранить картинку как data:url и подключить её во внешнем css-файле. Прорисовка страницы должна блокироваться пока внешний css не загрузится и не распарсится - авось поможет.
|
|
25.10.2018, 13:04
|
|
Профессор
|
|
Регистрация: 19.01.2012
Сообщений: 505
|
|
А, ещё попробуйте не релоад, а location.href на ту же самую страницу.
|
|
25.10.2018, 15:28
|
|
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 641
|
|
Предлагаю использовать упаковщик для этих целей
https://parceljs.org/getting_started.html
правда нужен nodejs )
из коробки умеет делать HMR (hot-module-replacement) - т.е. поправил файл, а он автоматически в браузере обновится... для javascript, html, css работает.
|
|
25.10.2018, 16:27
|
|
Профессор
|
|
Регистрация: 16.09.2009
Сообщений: 253
|
|
Сообщение от Белый шум
|
Попробуйте сохранить картинку как data:url и подключить её во внешнем css-файле. Прорисовка страницы должна блокироваться пока внешний css не загрузится и не распарсится - авось поможет.
|
Помогло!
Правда этот css весит почти 300кб, но страница теперь не мерцает и можно продолжать разработку…
Просто я думал, может есть более элегантные решения…
Спасибо!
|
|
25.10.2018, 16:41
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
Сообщение от Paguo-86PK
|
Правда этот css весит почти 300кб,
|
уверен что можно оптимизировать.
|
|
25.10.2018, 23:03
|
|
Профессор
|
|
Регистрация: 16.09.2009
Сообщений: 253
|
|
Проектирую клавиатуру…
Сообщение от j0hnik
|
уверен что можно оптимизировать.
|
Нe получится: Файл большой и бинарный…
Вот, кстати, что я делаю…
<html>
<head>
<meta http-equiv=refresh content='3000' />
<script>
CanvasRenderingContext2D.prototype.roundRect = function(x, y, width, height, radius, fill, stroke) {
if(typeof stroke == "undefined")
stroke = true;
if(typeof radius === "undefined")
radius = 5;
if(typeof radius === "number")
radius = {tl: radius, tr: radius, br: radius, bl: radius};
else {
var defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};
for(var side in defaultRadius) {
radius[side] = radius[side] || defaultRadius[side];
}
}
this.beginPath();
this.moveTo(x + radius.tl, y);
this.lineTo(x + width - radius.tr, y);
this.quadraticCurveTo(x + width, y, x + width, y + radius.tr);
this.lineTo(x + width, y + height - radius.br);
this.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);
this.lineTo(x + radius.bl, y + height);
this.quadraticCurveTo(x, y + height, x, y + height - radius.bl);
this.lineTo(x, y + radius.tl);
this.quadraticCurveTo(x, y, x + radius.tl, y);
this.closePath();
if(fill)
this.fill();
if(stroke)
this.stroke();
}
//////////////////////////////////////////////////////////////////////////////
var aButtons= [
"~ `Ё ! 11 ¡ @\" 2 2 #№ 3 3 $;£4 ¤ % 5 € ^ :6 ¼ &? 7 ½ * 8₽¾ ( 9 ‘ ) 0 ’ _ …- ¥ + ÷= × |\\¦\\/¬",
"Q Й W Ц E У R К® Tѐ Е Y Н U Г I Ш O Щ P З { [Х« } ]Ъ»",
"A Ф S Ы D В F А G П H Р J О K Л L Д : °;Ж¶ \" ¨'Э´",
"Z Я X Ч C С© V М Bѝ И N Т M Ь < ,Б > .Ю ?. /,¿"
];
//////////////////////////////////////////////////////////////////////////////
var hButton = null;
var hCanvas = null;
var hCtx = null;
function DrawButton(mark, x, y) {
var size = 124.7;
var thick = 12.5;
var border = 3.5;
var radius = 3.05;
var back = 1.75;
var h, l, m, r, v, w;
hCtx.fillStyle = "rgb(90, 90, 90)";
hCtx.beginPath();
hCtx.moveTo(x + size - back, y + back);
hCtx.lineTo(x + back, y + back);
hCtx.lineTo(x + back, y + size - back);
hCtx.closePath();
hCtx.fill();
hCtx.fillStyle = "rgb(31, 31, 31)";
hCtx.beginPath();
hCtx.moveTo(x + size - back, y + back);
hCtx.lineTo(x + size - back, y + size - back);
hCtx.lineTo(x + back, y + size - back);
hCtx.closePath();
hCtx.fill();
hCtx.fillStyle = "rgb(68, 68, 68)";
hCtx.strokeStyle = "rgb(7, 7, 7)";
hCtx.lineWidth = border;
hCtx.roundRect(x, y, size, size, radius * radius, false, true);
hCtx.roundRect(x + thick, y + thick, size - 2 * thick, size - 2 * thick, radius, true, false);
if(typeof mark == "string") {
hCtx.font = "46px helvetica";
h = parseInt(hCtx.font, 10);
hCtx.fillStyle = "white";
hCtx.fillText(mark, x + (size - hCtx.measureText(mark).width) / 2, y + (size / 2 + h / 2));
} else {
v = border + thick;
w = (size - border - thick);
m = x + size / 2;
l = m - w / 3.69;
r = m + w / 2.9;
hCtx.fillStyle = "white";
hCtx.font = "46px helvetica";
h = parseInt(hCtx.font, 10);
s = mark[3]; hCtx.fillText(s, l - hCtx.measureText(s).width / 2, y + size / 2 + h / 1.125);
hCtx.font = "40px helvetica";
h = parseInt(hCtx.font, 10);
s = mark[0]; hCtx.fillText(s, l - hCtx.measureText(s).width / 2, y + size / 2 - h / 4);
hCtx.fillStyle = "red";
s = mark[1]; hCtx.fillText(s, m - hCtx.measureText(s).width / 2, y + size / 2 - h / 4);
s = mark[4]; hCtx.fillText(s, m - hCtx.measureText(s).width / 2, y + size / 2 + h / 1);
hCtx.font = "24px helvetica";
hCtx.fillStyle = "dodgerblue";
s = mark[5]; hCtx.fillText(s, r - hCtx.measureText(s).width / 2, y + size / 2 + h / 1);
h = parseInt(hCtx.font, 10);
s = mark[2]; hCtx.fillText(s, r - hCtx.measureText(s).width / 2, y + v + h - h / 4);
}
}
function main() {
hCanvas = document.getElementById("Draft");
hCtx = hCanvas.getContext("2d");
DrawButton("Esc", 56.5, 119);
DrawButton("F1", 340, 118);
var x = 56.5, y = 310.5;
aButtons[0].split(/\t/)
.forEach(function(c) {
DrawButton(c.split(""), x, y);
x += 133.35;
});
x = 252, y = 444;
aButtons[1].split(/\t/)
.forEach(function(c) {
DrawButton(c.split(""), x, y);
x += 133.35;
});
x = 315, y = 577.5;
aButtons[2].split(/\t/)
.forEach(function(c) {
DrawButton(c.split(""), x, y);
x += 133.35;
});
x = 386, y = 711;
aButtons[3].split(/\t/)
.forEach(function(c) {
DrawButton(c.split(""), x, y);
x += 133.35;
});
}
</script>
<olink rel="stylesheet" href="body.css">
<style>
body
{
background-image:url('http://pluspng.com/img-png/keypad-png-hd-file-bijoy-keyboard-png-3171.png');/*('keyboard-0.png');/*('keyboard_my.svg');*/
background-repeat:no-repeat;
background-position-left:99px;
background-color :black;
padding :0px 0px 0px 0px;
}
</style>
</head>
<body onload='setTimeout(main, 5000)'>
<canvas id=Draft width=2048 height=960></canvas>
</body>
Чтобы руками в графическом редакторе не перемаркировывать, написал скрипт…
Тем более, что в исходном изображении заметны свои косяки местами.
Сейчас проблема в отрисовке клавиши «Enter» сто́ит. Она и нарисована как-то криво…
P.S.: Вообще-то, хочу разработать собственную раскладку…
А чтобы Keyboard Layout Creator вслепую не маяться, хочу визуальную интерактивную модель построить алгоритмом, чтобы эстетически оценить её…
Последний раз редактировалось Paguo-86PK, 25.10.2018 в 23:14.
|
|
26.10.2018, 09:19
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Так вы все размеры вручную подбирали? Но почему так, ведь HTML-элементы зависят друг от друга, почему бы их не использовать? Вот я попробовал, за 35 минут получилось сделать, я не сидел и не подбирал все позиции подряд, оно само расставилось по местам, только вон те кнопки пошире которые, только их пришлось вручную подогнать, это наверное проще, чем у вас, или я не так понял?
<html>
<head>
<style>
body {
background: linear-gradient(135deg, rgba(226,226,226,1), rgba(219,219,219,1) 26%, rgba(203, 204, 207, 1) 64%);
text-align: center;
font-size: 1.25vw;
}
kbd {
background:
radial-gradient(farthest-side at 50% -100%, rgba(0, 0, 0, 0.6), transparent),
radial-gradient(farthest-side at 50% 200%, rgba(255, 255, 255, 0.1), transparent)
#080808;
box-sizing: border-box;
border-radius: 0.25em;
border: 0.05em rgba(255, 255, 255, 0.4) solid;
border-right-color: rgba(255, 255, 255, 0.2);
border-bottom-color: rgba(255, 255, 255, 0.2);
box-shadow: 0 0 0.05em .125em black;
cursor: pointer;
height: 4em;
margin: 0 0.75em 0.75em 0;
position: relative;
overflow: visible;
text-align: center;
transition: all ease-in-out 200ms;
vertical-align: middle;
width: 4em;
color: white;
color: rgba(206, 241, 248, 0.7);
display: inline-grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
font: 1em / 1em Helvetica Neue, Segoe UI, Roboto, Ubuntu, sans-serif;
}
kbd:active {
border: 0.05em rgba(255, 255, 255, 0.2) solid;
box-shadow: 0 0 0.05em .125em rgba(0, 0, 0, 0.8);
}
kbd:not([data-half]) + kbd[data-half] {
height: 1.9em;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
position: absolute;
z-index: 1;
border-bottom-width: .15em;
}
kbd[data-half] + kbd[data-half] {
height: 1.9em;
border-top-left-radius: 0;
border-top-right-radius: 0;
margin-top: 2em;
border-top-width: .15em;
}
kbd span:only-child {
grid-area: 2 / 1 / 3 / span 3;
}
kbd.m span:only-child {
grid-area: 3 / 1 / 4 / span 3;
padding: .25em;
}
kbd span:first-child:nth-last-child(2),
kbd span:first-child:nth-last-child(3)
{
grid-area: 1 / 2;
transform: translateY(50%);
}
kbd span:nth-child(2):last-child,
kbd span:nth-child(2):nth-last-child(2) {
grid-area: 2 / 2;
transform: translateY(50%);
}
kbd span:nth-child(3):last-child {
grid-area: 1 / 3;
}
kbd.m:nth-child(-n + 6) {
text-align: left;
}
kbd.m:nth-last-child(-n + 6) {
text-align: right;
}
kbd.x2 { width: 6em;}
kbd.x3 { width: 7.5em; }
kbd.x4 { width: 10em; }
kbd.x5 { width: 5em; }
kbd.x6 { width: 24em; }
.touch-bar {
border-radius: 0.25em;
background-color: #000;
padding: .5em;
margin: auto;
margin: 0 0.75em 0.75em 0;
display: inline-block;
box-sizing: border-box;
width: 71em;
}
.touch-bar kbd {
margin: 0;
padding: 0em .5em;
background: #333;
border: 0;
height: 2em;
color: white;
display: inline-flex;
justify-content: center;
align-items: center;
}
.touch-bar kbd span {
transform: scale(1.25) !important;
}
.touch-bar[data-list="1"] kbd span:not(:first-child),
.touch-bar[data-list="2"] kbd span:not(:last-child)
{
display: none;
}
</style>
</head>
<body>
<section class="touch-bar" data-list="1" onclick="this.dataset.list = (+this.dataset.list) % 2 + 1">
<kbd>[😀][esc]</kbd>
<kbd>[😁][F1]</kbd>
<kbd>[😂][F2]</kbd>
<kbd>[🐱][F3]</kbd>
<kbd>[😹][F4]</kbd>
<kbd>[😎][F5]</kbd>
<kbd>[❤️][F6]</kbd>
<kbd>[💩][F7]</kbd>
<kbd>[🤷][F8]</kbd>
<kbd>[🔥][F9]</kbd>
<kbd>[🤔][F10]</kbd>
<kbd>[⌛️][F11]</kbd>
<kbd>[🙌][F12]</kbd>
</section>
<section>
<kbd>~`</kbd>
<kbd>!1</kbd>
<kbd>@2"</kbd>
<kbd>#3№</kbd>
<kbd>$4%</kbd>
<kbd>%5:</kbd>
<kbd>^6,</kbd>
<kbd>&7.</kbd>
<kbd>*8;</kbd>
<kbd>(9</kbd>
<kbd>)0</kbd>
<kbd>_-</kbd>
<kbd>+=</kbd>
<kbd class="m x2">[delete]</kbd>
</section>
<section>
<kbd class="m x2">[tab]</kbd>
<kbd>QЙ</kbd>
<kbd>WЦ</kbd>
<kbd>EУ</kbd>
<kbd>RК</kbd>
<kbd>TЕ</kbd>
<kbd>YН</kbd>
<kbd>UГ</kbd>
<kbd>IШ</kbd>
<kbd>OЩ</kbd>
<kbd>PЗ</kbd>
<kbd>{Х[</kbd>
<kbd>}Ъ]</kbd>
<kbd>|Ё\</kbd>
</section>
<section>
<kbd class="m x3">[caps lock]</kbd>
<kbd>AФ</kbd>
<kbd>SЫ</kbd>
<kbd>DВ</kbd>
<kbd>FА</kbd>
<kbd>GП</kbd>
<kbd>HР</kbd>
<kbd>JО</kbd>
<kbd>KЛ</kbd>
<kbd>LД</kbd>
<kbd>:Ж;</kbd>
<kbd>"Э'</kbd>
<kbd class="m x3">[return]</kbd>
</section>
<section>
<kbd class="m x4">[shift]</kbd>
<kbd>ZЯ</kbd>
<kbd>XЧ</kbd>
<kbd>CС</kbd>
<kbd>VМ</kbd>
<kbd>BИ</kbd>
<kbd>NТ</kbd>
<kbd>MЬ</kbd>
<kbd><Б,</kbd>
<kbd>>Ю.</kbd>
<kbd>?/</kbd>
<kbd class="m x4">[shift]</kbd>
</section>
<section>
<kbd class="m">[fn]</kbd>
<kbd class="m">[control]</kbd>
<kbd class="m">[option]</kbd>
<kbd class="m x5">[command]</kbd>
<kbd class="m x6"></kbd>
<kbd class="m x5">[command]</kbd>
<kbd class="m">[option]</kbd>
<kbd>[◀︎]</kbd>
<kbd data-half>[▲︎]</kbd>
<kbd data-half>[▼︎]</kbd>
<kbd>[▶︎]</kbd>
</section>
<script>
for(const kbd of document.querySelectorAll("kbd")) {
kbd
.textContent
.split(/\[([^\]]*)\]|/)
.filter(v => !!v)
.reduce((_, v) => {
const span = document.createElement("span");
span.textContent = v;
kbd.appendChild(span);
}, kbd.textContent = "")
}
</script>
</body>
|
|
|
|