;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Só falta a dancinha: Twitter lança recursos semelhantes ao TikTok

Lucas Carvalho/Tilt
Imagem: Lucas Carvalho/Tilt

Nicole D’Almeida

Colaboração para Tilt, de São Paulo

30/09/2022 18h15

Depois do Instagram, chegou a vez do Twitter se preparar para mudanças muito semelhantes ao TikTok. A rede social do arinho anunciou nesta última quinta-feira (29) o lançamento de duas novas mudanças relacionadas à maneira como os usuários consumem vídeos na plataforma.

A rede social está implementando um visualizador de mídia imersivo no qual os vídeos abrirão em tela cheia com um único clique.

Além disso, o "deslizar para cima", também adotado pelo Twitter, permitirá que os usuários assistam infinitos vídeos na plataforma. Será possível voltar ao Tweet original clicando na seta para esquerda no canto superior esquerdo.

Por enquanto, essas novidades estarão disponíveis nas próximas semanas somente para a versão inglês do app no iOS.

Rede social receberá sequência vertical, em tela cheia, para assistir vídeos - Reprodução/Twitter - Reprodução/Twitter
Rede social receberá sequência vertical, em tela cheia, para assistir vídeos
Imagem: Reprodução/Twitter

Copia, só não faz igual

Outra mudança que chega ao Twitter é a adição de diversos vídeos na guia Explorar, com o objetivo de levar mais pessoas aos conteúdos em vídeos da plataforma. Os clipes mais populares compartilhados na rede social poderão ser encontrados ali.

Visualmente falando, as atualizações remetem a mesma forma de navegação que acontece no TikTok e no Reels do Instagram.

No futuro, a seção "Para você" terá um carrossel lateral de vídeos sugeridos - Reprodução/Twitter - Reprodução/Twitter
No futuro, a seção "Para você" terá um carrossel lateral de vídeos sugeridos
Imagem: Reprodução/Twitter

Dado o grande sucesso do TikTok e a ascensão dos vídeos curtos em tela cheia, faz sentido que as plataformas sociais procurem se alinhar às tendências de consumo e adaptá-las da melhor forma para seus próprios apps.

Essas sugestões já estão disponíveis para pessoas em países selecionados usando o Twitter em inglês no iOS e Android.

A plataforma ainda não anunciou previsões da chegada de ambos os recursos no Brasil.