;(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

'Salva meu cabelo!' Veja opiniões e descubra por que este óleo faz sucesso

Óleo Extraordinário Elseve - Divulgação
Óleo Extraordinário Elseve Imagem: Divulgação

Karina Hollo

Colaboração para Universa

05/07/2023 03h55

O Óleo Extraordinário Elseve L'Oréal Paris é um sucesso: são mais de 32 mil avaliações e 89% delas, de 5 estrelas.

É um tratamento profissional para a beleza dos seus cabelos. Com seis óleos de flores preciosas, tem efeito condicionante.

Isso porque foi criado para uma hidratação profunda dos cabelos. Sua fórmula leve e não gordurosa age e se adapta a qualquer tipo de cabelo ? até os cabelos mais secos, garantindo nutrição, maciez e brilho intenso. E está com 31% de desconto!

  • Como penetra na fibra capilar, o Óleo Extraordinário de Elseve trata profundamente, trazendo brilho instantâneo
  • Protege os fios do calor da chapinha.
  • Pode ser usado antes da aplicação do xampu, como finalizador, antes do uso do secador ou a qualquer momento do dia.

Os cabelos secos ficam hidratados, nutridos e macios. Confira só seus benefícios:

  • Nutrição
  • Brilho
  • Leveza
  • Maciez
  • Hidratação
  • Suavidade

Dicas de uso:

  • Antes da escova: para nutrir os fios.
  • Como finalizador: para malear a fibra
  • Em qualquer momento: para disciplinar o frizz e ressaltar a luz dos cabelos.

Veja o que diz quem já testou (e aprovou!).

Me surpreendeu!

"Comprei totalmente às cegas, só confiando nas avaliações, e não estava dando nada por ser baratinho, mas gente, é muito bom REAL! Meu cabelo ficou super soltinho, alinhado, macio e com NADINHA DE OLEOSIDADE. Senti também leve diferença no brilho no cabelo. Ele tem uma textura de óleo um pouco siliconado, cheiro bem leve. Amei!", disse Jae Lima.

Maravilhoso!

"Comprei pra minha mãe, mas experimentei também, né? Quase tão bom quanto os óleos da Alfaparf e Kérastase que eu tenho. Não tira tanto o frizz nem dá tanto brilho, mas deixa o cabelo muito suave, fica parecendo seda", contou SIlmara.

Sempre maravilhoso

"Já conheço o produto há alguns anos e o custo benefício dele é dos melhores. O produto é maravilhoso e o preço é dos mais competitivos, ainda mais considerando todos os benefícios dele", conta Victoria.

Excelente

"Esse óleo salva o meu cabelo no dia a dia, não pesa no cabelo e pode ser usado como finalizador ou até mesmo como umectação. Elimina o frizz", afirma Fernando Kurimoto.

Incrível

"Ótimo produto, tem um cheiro maravilhoso, dá um brilho incrível e não pesa no cabelo, mesmo meu cabelo sendo fino não pesou", diz Carolina Lemos.

Amo esse óleo

"Sempre compro esse óleo da Elseve pois deixa meus cabelos perfeitos. Não deixa com aspecto oleoso e tem rápida absorção. A entrega foi super rápida e o produto muito bem embalado. Amei", fala essa cliente.